好きラノ2020上期の投票データを使って、「この本を読んでいる人にはこんな本もお勧めです」ツールを試作してみました。UIは本当に最小限ですし、期待するような結果もうまく出ないかもしれませんが、興味があったら使って遊んでみてください。
以下は、作った動機やどんなロジックで動いているかの簡単な説明です。
元々のモチベーションは、某Web小説サイトの『この作品をブックマークしている人はこんな作品も読んでいます』欄からきています。こういう機能は個人的にとてもありがたく、趣味の合う小説を探すのに重宝しています。ただ何度も使っていると、こう感じることもあります。「ランキング上位の人気作ばかり並ばずに、もう少しマイナーな作品も並んでくれたらなあ」と。
どこぞの本好き主人公のように「そういう機能がなければ自分で作ればいい!」とできればよかったんですが、機能を作るにはデータが必要です。某サイトではブックマークのデータを取得してツールを作って公開するようなことができません。そんな中、昨年末の好きラノ投票数の増加を見て、「投票データ使えば、書籍のお勧め機能作れるのでは?」と思いつき。主催のいちせさんにも快く許可いただいたので、こうして形にしてみました。
(7/21追記) 好きラノに直接関係するモチベーションを触れ忘れていました。何年も前は投票結果の趣味が合う人のブログを見て、面白そうな作品を探すようなことができたのですが、最近の10000票オーバーのような状況ではなかなか難しくなってきています。このツールが少しでも読みたい作品探しの役に立てばいいなあと思い作ったのでした。どう考えてもこっちをメインに書くべきですね。最近はWeb小説中心に読んでいるせいでつい。(追記ここまで)
なお、Web周りのド素人が作ったため、UIはへっぽこです(スプレッドシートからデータを取得しているのでとても遅いです。スマホ対応なんて、とても無理な話でした……)。類似度計算のアルゴリズムも単純なものを用いているので、誰か改良してみたい方いたら是非お願いします!
お勧めする際のロジックは、一言でいえば読者層が近い作品の類似度が高くなるようなものを用いています。単純に共通読者数を見るのではなく、全体の傾向を見て類似度を計算しているので、共通読者数が0の作品でも類似度が高くなることもあります。例えば、ある人が作品A,B,Cを、別の人が作品B,C,Dに投票した場合、AとDの共通読者数は0ですが、類似度はある程度高く計算されます。
これ以降は詳しい人向けの説明です。
好きラノの投票から得られるデータは、各投票者のお気に入り10作(順位づけなし)です。「最大上位10作のみが観測されている」という状況にピッタリ合うアルゴリズムが見つからなかった&思いつかなかったため、今回は近い設定のLightFMを用いました。LightFMのハイパーパラメータは、交差検証を行いつつ、結果の出方の定性感も踏まえてチューニングしています。
作品の類似度計算には、LightFMで得られた各作品ベクトル表現のcos類似度を用いています。ただ、単純に類似度を計算すると、票数が1-2票の作品が類似度上位に来やすくなり、違和感が強いです。これを緩和するため、投票にノイズを入れた学習(パターン2)や、投票数による類似度の重みづけ(パターン3)を導入しています。あまりスマートなやり方ではないため(特に後者)、もっと改良したいところです。