質問: ### 前提・実現したいこと 現在、Railsでお気に入りの商品を投稿しあうSNSの開発を行っています。 各投稿には何個かハッシュタグを付与することができます。(必須項目でないため、ハッシュタグが付かない投稿も許容) 以下が、モデルの状態です。 ``` class Post < ActiveRecord::Base belongs_to :user has_many :hash_keys, through: :post_hash_keys end class PostHashKey < ActiveRecord::Base belongs_to :hash_key belongs_to :post end class HashKey < ActiveRecord::Base has_many :post_hash_keys has_many :posts, through: :post_hash_keys end class User < ActiveRecord::Base has_many :posts end ``` ### 実現したいこと タイトルの通り、現在、各ユーザーに対して「あなたと似ている投稿をしているユーザーがいます」という風に 自分の投稿と、他のユーザーの投稿の類似度の高いユーザーを投稿に紐付いているハッシュタグから算出して、 ユーザーにフォローのレコメンドを実現したいです。 ### 今考えていること 直近の対象のユーザーの投稿を数件取得して、最新の紐づくハッシュタグを3件取得し、 この3つのハッシュタグが部分的にも紐づく投稿を取得し、その類似度が高いユーザー順に 対象ユーザーにレコメンドしてあげたいと考えています。 しかし、具体的に3つのハッシュタグが部分的にも一致する投稿を取得するクエリの見当がついていない状況であり、 問題を細かく砕ききれていないのかとも思っています。 また、比較的大きな処理になるため、リクエストのたびに算出するコストは高いと推測しています。 これを解決するために、レコメンド用のモデルを用意し、一日に数回のバッチ処理で更新するという手段を取るべきか、なども検討しています。 技術的にまだ未熟なところがあり、質問させていただいた次第です。 何か、一部分に対するご助言やご教示をいただけますと幸いです。 よろしくお願いいたします!
回答: かなり難しいですね。 方法は色々ありそうですが、パフォーマンスと、どの程度の正確性を担保するかのバランスがセンスの見せ所ですね。 タグをカテゴリー分けするような仕組みも欲しいです。 RubyOnRailsタグとRoRタグとRailsタグとRubyタグは全く別の投稿とみなすのか? 個人的にはこれらはひとまとめにしたい気がします。 かといってPythonやC#などのタグも含めるかは微妙ですし。 ハッシュタグはユーザーが自由に定義できるので表記の揺れをどこまで吸収するか・・・ ものすごく手軽にやるのであればユーザーごとにハッシュタグをバッチで集計(どんなハッシュタグで何回つぶやいたか)して、上位三つのハッシュタグがどのくらい被ってるかでお勧めか判別するとか・・・ ハッシュタグでユーザーをカテゴライズして、そのカテゴリのつぶやき数やフォロワー数で順位付けして、トップランカーだけお勧めに出すとかですかね・・・