Mahout + Hadoop + Solr レコメンダーについて話している可能性があります。このメソッドは、いくつかの異なる方法で再スコアリングを処理します。
基本的なレコメンダーは、次の 2 つの方法でまとめることができます。
- (user id、item id、preference weight) の形式で HDFS にデータを取得した後、データに対して ItemSimilarityJob を実行します (LLR の類似性を使用します。通常はこれが最適です)。指標マトリックスと呼ばれるものを作成します。これは、任意の 2 つのアイテム間の類似度を示す、アイテム ID ごとの値のスパース マトリックスになります。次に、これを Solr が索引付けできる値に変換する必要があります。これは、Mahout の内部整数 ID を一意の文字列表現に変換することを意味します。これは、CSV として (item123,item223 item643 item293 item445...) のようになります。つまり、2 つの Solr フィールドです。1 つ目はアイテム ID、2 つ目は類似アイテムのリストです。すべての ID はテキスト トークンでなければなりません。次に、レコメンデーションのクエリは、特定のユーザーが好みを示したアイテム ID で構成される Solr クエリです。クエリ = "item223 item344 item445...". インジケーター マトリックス値を保持するフィールドに対してクエリを実行します。アイテム ID の順序付きリストが返されます
- はるかに簡単な方法は、Mahout 1.0-SNAPSHOT の /examples フォルダーまたはhttps://github.com/pferrel/solr-recommenderにあるツールを使用することです。ユーザー ID とアイテム ID の一意の文字列を含む生ログ ファイルを取り込みます。Hadoop ですべての作業を行い、Solr で直接インデックスを作成したり、上記のように DB にロードしたりできる CSV を出力します。
私がデモ サイト ( https://guide.finderbots.com ) で行った方法は、Solr Web アプリの統合を使用して、インジケーター マトリックスを DB に配置し、同様のアイテム リストをアイテムのコレクションに添付することです。そのため、item123 は item223 item643 item293 item445... をインジケータ フィールドに取得しました。コレクションにインデックスを付けた後、クエリは = "item223 item344 item445..." -- ユーザーの優先項目です。
再スコアリングを行うには、次の 3 つの方法があります。
- クエリにメタデータを混ぜます。したがって、指標フィールドに対して query = "item223 item344 item445..." を実行し、「ジャンル」フィールドに対して "SciFi" を実行できます。これにより、クエリで協調フィルタリングとメタデータをブレンドできます。ご想像のとおり、rec はユーザーの設定に基づいていますが、「SciFi」に偏っています。アイテム + インジケーター + メタデータをインデックスに追加すると、他にも多くの興味深いことができます。
- メタデータでレコードをフィルタリングします。必要に応じて、rec を歪ませずにフィルター処理することができます。Solr query = "item223 item344 item445..." を指標フィールドに対して使用し、さらに "SciFi" を "genre" フィールドに対するフィルターとして使用します。この場合、「SciFi」以外は何も表示されませんが、1 番目はほとんど「SciFi」になります。
- rec の順序付きリストを取得し、ユーザー、コンテキスト、またはアイテムについて知っている他の情報に基づいて、好きな方法で再スコアリングします。多くの場合、これらは Solr クエリにエンコードして 1 つのクエリで実行できますが、再配列とフィルタリングは、rec が返された後に実行することもできます。そのコードを書く必要がありますが、それは組み込まれていません。
楽しいことに、フィルター、メタデータ フィールド、およびユーザー設定を、Solr が「ブースト」値と呼ぶものと組み合わせて、あらゆる種類の再スコアリングを取得できます。Solr では、場所を使用して、クエリ、スキュー、またはフィルター処理を行うこともできます。
注:必ずしも Solr シャードについて心配する必要はありません。Solr はほとんどの DB と HDFS を直接インデックス化しますが、インデックスのみがシャーディングされます。インデックスが非常に大きい場合はシャーディングし、1 秒あたりのクエリ数が多い場合 (またはフェイルオーバー用) は複製します。Solr クエリは一般的に非常に高速であるため、システムが機能するようになった後は、これについて心配する必要があります。これは構成に関するものであり、残りのワークフローの影響を受けるべきではないからです。