0

私は現在、メモリ内推奨 API を使用して mahout に推奨機能を実装しています。ただし、オフラインの推奨事項を計算するために、hadoop を使用する分散ソリューションに移行したいと考えています。初めて Hadoop を使用するので、いくつかの概念と API の使用法について説明を求めています。

現在、hadoop に関する私の理解は最小限であり、正しいアプローチは次のとおりだと思います。

  • hdfsにユーザーとアイテムのデータを入力するために、Apacheドリルのようなものを使用してください。

  • hdfs からのデータに対して mahout train の推奨ジョブを使用します。

  • hdfs の結果データを、solr で使用されるインデックス シャードに変換します。

  • solr を使用してユーザーベースに推奨事項を提供する

ただし、この設計のいくつかの側面について説明を求めています。

  1. インメモリ ライブ レコメンデーションで使用される方法で、レスコアをどのように利用しますか?

  2. レコメンデーション ジョブを呼び出す最適な方法はどれですか?

これらの 2 つ以外にも質問がありますが、これらに対する回答は非常に役立ちます。

4

1 に答える 1

2

Mahout + Hadoop + Solr レコメンダーについて話している可能性があります。このメソッドは、いくつかの異なる方法で再スコアリングを処理します。

基本的なレコメンダーは、次の 2 つの方法でまとめることができます。

  1. (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 の順序付きリストが返されます
  2. はるかに簡単な方法は、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 つの方法があります。

  1. クエリにメタデータを混ぜます。したがって、指標フィールドに対して query = "item223 item344 item445..." を実行し、「ジャンル」フィールドに対して "SciFi" を実行できます。これにより、クエリで協調フィルタリングとメタデータをブレンドできます。ご想像のとおり、rec はユーザーの設定に基づいていますが、「SciFi」に偏っています。アイテム + インジケーター + メタデータをインデックスに追加すると、他にも多くの興味深いことができます。
  2. メタデータでレコードをフィルタリングします。必要に応じて、rec を歪ませずにフィルター処理することができます。Solr query = "item223 item344 item445..." を指標フィールドに対して使用し、さらに "SciFi" を "genre" フィールドに対するフィルターとして使用します。この場合、「SciFi」以外は何も表示されませんが、1 番目はほとんど「SciFi」になります。
  3. rec の順序付きリストを取得し、ユーザー、コンテキスト、またはアイテムについて知っている他の情報に基づいて、好きな方法で再スコアリングします。多くの場合、これらは Solr クエリにエンコードして 1 つのクエリで実行できますが、再配列とフィルタリングは、rec が返された後に実行することもできます。そのコードを書く必要がありますが、それは組み込まれていません。

楽しいことに、フィルター、メタデータ フィールド、およびユーザー設定を、Solr が「ブースト」値と呼ぶものと組み合わせて、あらゆる種類の再スコアリングを取得できます。Solr では、場所を使用して、クエリ、スキュー、またはフィルター処理を行うこともできます。

注:必ずしも Solr シャードについて心配する必要はありません。Solr はほとんどの DB と HDFS を直接インデックス化しますが、インデックスのみがシャーディングされます。インデックスが非常に大きい場合はシャーディングし、1 秒あたりのクエリ数が多い場合 (またはフェイルオーバー用) は複製します。Solr クエリは一般的に非常に高速であるため、システムが機能するようになった後は、これについて心配する必要があります。これは構成に関するものであり、残りのワークフローの影響を受けるべきではないからです。

于 2014-05-16T21:19:42.617 に答える