楽天書籍APIのジャンルをJevで仕訳し直す

楽天書籍APIの曖昧なジャンル分けに課題を感じていませんか?自然言語処理ツールJevを使い、独自の判定ルールで書籍ジャンルを精緻に仕分け直す方法を解説します。「書籍判定」「メインジャンル」など4つのタスクとYAMLによる柔軟なルール調整で、煩雑なジャンルハンドリングを改善。APIデータ活用の参考に。

※本記事は広告を含みます

初めに

どうも、職業エンジニアです。
ちょっと前にJevで遊びましたが、これしかやらないのも違うかなあと思い、実用できそうな所を考えながら生活していましたが、ついにちょうどいい案を思いつきました。
と言うわけで件台通り「楽天書籍APIのジャンルをJevで良い感じにする!」実験をしていこうと思います。

楽天書籍APIのジャンル分け、かなりアバウト

楽天書籍APIにはジャンルIDなるものが設定されているので、それを元に検索したり結果をフィルタしたりできるものの、割とここの設定値がアバウトになりがちです。(個人的な感想です)

ジャンルIDの設定も商品側の登録内容に左右される部分があるっぽいので仕方ないっちゃないのですが、「この本とこの本は同じジャンルであって欲しい!」みたいなことが起こるんですよね。あとジャンルIDって複数指定できるので、そこの優先順位とかでかなりブレるし、ルール付けするのも難しかったりしますね。

まあこんな感じでハンドリングが煩雑になりがちという訳です。

ということでJevで独自判定してみる

楽天から取得したデータ(タイトル、レーベル、あらすじ、判型など)をJevに投げて、独自のルールで仕分け直す、というのがやりたいことです。

こんな感じのイメージです↓

jevuse 2.jpg
jevuse 2.jpg

① 4つの判定タスクで分類

Jevは文章を作るんじゃなくて、与えられた情報から「答え」だけを返します。今回は以下の判定条件を行い答えを返すようにしてみました。ちなみにこれらの判定は順次投げるのではなく、大きめのルール作って纏めて投げてます。

  1. 書籍判定:そもそもこれ、本当に本?グッズじゃない?(確率でノイズを弾く)

  2. メインジャンル:漫画?小説?ビジネス書?(8大ジャンルから1つ選択)

  3. 形態補助:文庫?新書?コミック?(レーベルや判型を客観的に判定)

  4. サブジャンル:小説なら「ミステリー」か「SF」か?(分野別の細かいジャンル)

② ルール調整はYAML(設定ファイル)をいじるだけ

「このレーベルはこっちのジャンルにしたいな〜」って時にいじりやすいよう、Jev宛てのルールは設定ファイルに切り出すようにしています。

# タスク1: 単品書籍かどうかの判定(グッズ・付録ノイズの遮断)
is_book:
  type: Noul
  question: "この商品は純粋な書籍(マンガ、小説、解説書、雑誌等の読み物本体)ですか?アクリルスタンド、カレンダー、ポストカード、文具、フィギュア、またはグッズ・付録がメインのセット商品である場合はNoと判定してください。"
# タスク2: メインジャンルの分類(排他選択)
category:
  type: Choice
  description: "商品の書誌情報(タイトル、シリーズ・レーベル名、判型・サイズ、価格、あらすじ)から、最も適切なメインカテゴリを1つ選択してください。"
  options:
    comic: |
      マンガ・コミック作品。
      判型・サイズが「コミック」とあるもの、またはシリーズ・レーベル名に「コミックス」「COMICS」とあるもの。
      漫画単行本、コミカライズ、Webコミックの書籍化、4コマ漫画。
      ※作画担当が存在し漫画形式で描かれている作品。
    light_novel: |
      ライトノベル、キャラクター文庫、新書・単行本ノベルス。
      シリーズ・レーベル名に「ノベルス」「文庫」「ブックス」(例: 一迅社ノベルス、電撃文庫、角川スニーカー文庫、MFブックス等)とあるもの。
      Web小説(なろう・カクヨム発)の文章による小説書籍化。
      ※判型が文庫・新書・単行本で、小説(文章)主体であるもの。単行本ノベルスは価格が1,200円〜1,800円前後であることが多い。コミカライズ漫画はここには含めずcomicに分類してください。
    novel_literature: |
      一般文芸、小説、文学、文学研究。
      純文学、大衆小説、ミステリー、SF、時代小説、海外文学、エッセイ。
      歌人・作家の研究書や詩歌・短歌・俳句関連の文学書。
      ※ライトノベルやマンガは含めない。
      
……

まとめ

今回やったのはざっくりこんな感じ。

  1. APIからデータを取得

  2. Jevにルールとデータを投げて、判定

  3. あとは好きに利用

アプリに組み込む際は、Jevは安いとは言え利用コストがかかるので、できるだけ頻繁にリクエストが走らないような設計にするのがいいでしょう。オンラインで誰にでも即時実行できる契機(画面表示の度に取りにいく、とか)は推奨できないので、夜間バッチとかの契機で一括判定→DB取り込み or サーバーキャッシュとかがいいのではないでしょうか。

なお、APIで取得したデータをDBやキャッシュに保存していいの?はAPIの規約次第となるので注意しましょう。

最後に

なんか速くもJevの話題あんま見なくなったけど、マジ!?