ニュース記事用の非常に標準的な Mahout アイテムベースのレコメンダーがあります (クリック データを使用するため、設定はブール値です)。
DataModel dataModel = new ReloadFromJDBCDataModel(
new PostgreSQLBooleanPrefJDBCDataModel(localDB, ...)
);
ItemSimilarity itemSimilarity = new TanimotoCoefficientSimilarity(dataModel);
ItemBasedRecommender recommender = new GenericBooleanPrefItemBasedRecommender(dataModel, itemSimilarity);
私はコンテンツベースの知識をレコメンデーションに注入する実験を行っており、通常の協調フィルタリングの意味で類似しているだけでなく、多くの共通用語を共有しているという意味でも類似している記事を最も強く推奨できるようにしています。
記事コンテンツの類似度 (TF-IDF ベクトルのコサイン類似度) は、Mahout バッチを使用して事前に計算され、DB から読み取られます。ただし、類似性データがない記事のペアが多数存在します。これには 2 つの理由があります。
記事のコンテンツの類似性データは、ユーザー アイテムの好みのデータ モデルよりも頻繁に更新されないため、新しい記事のコンテンツの類似性が計算されるまでに遅延が生じます。
理想的には、すべてのコンテンツの類似性データをメモリにロードしたいので、各記事の上位 20 の類似性のみを保存します。
したがって、特定の記事のペアについては、次のようになります。
- アイテムの類似度 (谷本) 0 <= s1 <= 1
- コンテンツの類似度 (コサイン) 0 <= s2 <=1 (おそらく null)
コンテンツの類似度が null でない場合は、その値を使用してアイテムの類似度に重みを付け、類似したコンテンツの記事を後押ししたいと考えています。
私の質問は次のとおりです。
- これらの対策を組み合わせようとするのは合理的ですか、それとも何かおかしなことをしようとしているのですか?
- これらの 2 つの値を 1 つの類似度スコアに結合するための賢明な式は何ですか?
- これは、カスタムとして実装するのが最適
ItemSimilarity
ですRescorer
か?