
ブログの個別記事に関連記事を表示させる仕組みを作ったのですが、関連記事をどのように選ぶのか、という点で悩みました。
ブログに関連記事を実装するまで、「レコメンドエンジン」という言葉を知ってはいても、自分には関係のない話だと思っていました。
YouTube が「次の動画」を提案してくれる仕組みや、Amazon が「この商品を買った人はこちらも買っています」と表示する仕組みができれば、面白そうだと思ったのですが、結論としては、単純に同じタグを持っている記事の中から新しいものを選ぶ、同じタグを持っている記事が少なければ、同じカテゴリーの記事の中から新しいものを選ぶ、という仕組みに落ち着きました。
今回は、個人のブログサイトで、関連記事を選ぶロジックをどのようにするかを考えてみた記録です。
レコメンドエンジンには大きく2種類ある
調べてみると、レコメンドエンジンには主に2種類のアプローチがあることがわかりました。
① 協調フィルタリング
「同じ行動をとったユーザーは、同じものを好む」という考え方に基づく方式です。
たとえば「Aさんと Bさんが同じ動画を10本見ている。 Aさんがさらに別の動画 C を見た。 ならば Bさんも動画 C を好きかもしれない」という推論をします。 ユーザーの行動履歴データを大量に集めて、似たような行動パターンを持つユーザー同士を結びつけます。
YouTube のおすすめは、主にこの方式です。
② コンテンツベースフィルタリング
「内容が似ているコンテンツは、同じ読者に好まれる」という考え方に基づく方式です。
たとえば「Aさんが『Next.js の動的ルーティング』という記事を読んだ。 この記事には nextjs・vps というラベル(タグ)が付いている。 同じラベルを持つ別の記事を Aさんにすすめる」という推論をします。 ユーザーの行動履歴は使わず、コンテンツの内容だけで判断します。
自分が実装したのはどちらか
私がブログに実装した関連記事は、タグとカテゴリーの一致で記事を選ぶ仕組みです。
これはコンテンツベースフィルタリングの最もシンプルな形です。
記事に付けたタグとカテゴリーというラベルを使って、「似ている記事」を探しています。 読者が誰か、どんな行動をとったかは一切関係ありません。
2つの違いを並べるとこうなります。
協調フィルタリング
「Aさんと Bさんは同じ記事を読んだ
→ Aさんが読んだ別の記事を Bさんにもすすめる」
(ユーザーの行動をもとに推薦する)
コンテンツベースフィルタリング(今回実装)
「記事Xのタグは nextjs・vps
→ 同じタグを持つ記事をすすめる」
(コンテンツの内容をもとに推薦する)
なぜ協調フィルタリングは個人ブログの関連記事に向かないか
協調フィルタリングは精度が高い反面、大量のユーザー行動データが必要です。
「Aさんと Bさんは似た趣味を持っている」と判断するためには、両者が同じコンテンツを複数回にわたって選んでいるという実績が必要です。 データが少ないと、推薦の根拠が薄くなります。
個人ブログのアクセス数では、このデータ量を確保するのは現実的ではありません。 ユーザー行動を追跡するためのシステムも別途必要になります。
コンテンツベースフィルタリングは、データ量に依存しません。 記事が1本でも、タグさえ設定されていれば動きます。 個人ブログの関連記事には、こちらが現実的な選択です。
今後、このNext.jsのブログサイトの機能を作りこんでいく中で、各ページが何回閲覧されたかをカウントする仕組みを作ろうと思っています。 関連記事を選ぶときに、このデータを使って、タグが一致している記事の中で閲覧回数が多いものから選ぶ、カテゴリーが一致している記事の中から選ぶ場合も閲覧回数が多いものから選ぶというロジックを加えたいと考えています。
そして、閲覧回数がゼロの記事しかない場合は、現在のロジックと同じように新しい記事から選ぶという仕組みを残しておけば、このサイトに来てくださった方々に、より役立つ記事を提供できるかなと考えています。
そうはいっても、今はほとんどアクセスがありませんけどね・・・(汗)
実装して初めてわかったこと
関連記事を自分で作るまで、レコメンドエンジンは「大企業が持つ特別な技術」だと思っていました。
しかし実際には、コンテンツの属性を比較して似ているものを探すというアイデア自体は、シンプルです。 タグとカテゴリーというラベルを使って、一致するものを選ぶだけです。
YouTube や Amazon との違いは、技術の有無ではなく、使えるデータの量と種類です。 大量のユーザー行動データがあるから協調フィルタリングが機能する。 個人ブログにはそのデータがないから、コンテンツベースで代替する。 それだけの話でした。
「レコメンドエンジン」という言葉が、実装後に急に身近に感じられるようになったのが、この回の一番の収穫でした。





