web-dev-qa-db-ja.com

独自のレコメンデーションエンジンを作成するにはどうすればよいですか?

最近はレコメンデーションエンジンに興味があり、この分野で自分自身を向上させたいと思っています。私は現在「 集合知プログラミング 」を読んでいます。これはオライリーからのこの主題に関する最高の本だと思います。しかし、エンジンを実装する方法はわかりません。 「わからない」とは「始め方がわからない」という意味です。 Last.fmのようなプロジェクトを考えています。

  1. どこで(データベース側またはバックエンド側で実装する必要があります)レコメンデーションエンジンの作成を開始しますか?
  2. どのレベルのデータベース知識が必要になりますか?
  3. ヘルプやリソースに使用できるオープンソースのものはありますか?
  4. 私がしなければならない最初のステップは何ですか?
39
Burak Dede

私は自分でビデオポータル用に1つ作成しました。私が持っていた主なアイデアは、すべてに関するデータを収集することでした。

  • 誰が動画をアップロードしましたか?
  • 誰がビデオにコメントしましたか?
  • どのタグが作成されましたか?
  • 誰がビデオを訪れましたか? (匿名の訪問者も追跡します)
  • 誰がビデオを好きでしたか?
  • 誰がビデオを評価しましたか?
  • ビデオはどのチャンネルに割り当てられましたか?
  • タイトル、説明、タグ、チャネル、コメントのテキストストリームは、各データソースに重点を置くフルテキストインデクサーによって収集されます。

次に、上記の各ポイントの(id、weight)タプルのリストを返す関数を作成しました。限られた量の動画(たとえば、最後の50)のみを考慮するものもあれば、評価、タグ数などによって重みを変更するものもあります(タグ付けされることが多い=表現力が低い)。次のリストを返す関数があります。

  • 全文検索による同様のビデオ
  • 同じユーザーがアップロードした動画
  • これらのコメントからのユーザーがコメントした他のビデオ
  • これらのお気に入りのユーザーがお気に入りに追加した他の動画
  • これらの評価の評価者が評価した他の動画(加重)
  • 同じチャンネルの他の動画
  • 同じタグを持つ他の動画(タグの「表現力」で重み付け)
  • このビデオを再生した人が再生した他のビデオ(XY最新の再生)
  • コメントフルテキストによる同様のビデオ
  • タイトル全文による同様のビデオ
  • 説明フルテキストによる同様のビデオ
  • タグフルテキストによる同様のビデオ

これらはすべて、重みをビデオIDで合計し、重みで並べ替えるだけで1つのリストにまとめられます。これは現在、約1000本のビデオでかなりうまく機能します。ただし、これを高速化するには、バックグラウンド処理または極端なキャッシュを実行する必要があります。

私はこれをすぐに一般的なレコメンデーションエンジンまたは類似性計算機に減らして、Rails/activerecordプラグインとしてリリースできることを望んでいます。現在、それはまだ私のプロジェクトのよく統合された部分です。

小さなヒントを与えるために、Rubyコードでは、次のようになります。

def related_by_tags
  tag_names.find(:all, :include => :videos).inject([]) { |result,t|
    result + t.video_ids.map { |v|
      [v, TAG_WEIGHT / (0.1 + Math.log(t.video_ids.length) / Math.log(2))]
    }
  }
end

他の人がそのようなアルゴリズムをどのように解決するかに興味があります。

24
hurikhan77

推奨事項の提示は、2つの主要なセクションに分けることができます。

  1. 特徴抽出
  2. 勧告

特徴抽出は、推奨されるオブジェクトに非常に固有です。たとえば、音楽の場合、オブジェクトの一部の機能は、曲の周波数応答、パワー、ジャンルなどです。ユーザーの機能は、年齢、場所などです。次に、ユーザーごとにベクトルを作成し、関心のあるさまざまな機能に対応するベクトルのさまざまな要素を持つ曲。

実際の推奨を実行するには、よく考えられた特徴ベクトルのみが必要です。適切な機能を選択しないと、レコメンデーションエンジンが失敗することに注意してください。これは、私の年齢に基づいて私の性別を教えてくれるように頼むようなものです。もちろん私の年齢は少し情報を提供するかもしれませんが、あなたはもっと良い質問を想像できると思います。とにかく、各ユーザーと曲の特徴ベクトルを取得したら、レコメンデーションエンジンをトレーニングする必要があります。これを行うための最良の方法は、たくさんのユーザーに人口統計テストを受けさせてから、彼らが好きな特定の曲を教えてもらうことだと思います。この時点で、必要なすべての情報が得られます。あなたの仕事はあなたが持っている情報で決定の境界を描くことです。簡単な例を考えてみましょう。年齢と性別に基づいて、ユーザーがAC/DCの「バックインブラック」を気に入っているかどうかを予測する必要があります。 100個のデータポイントを示すグラフを想像してみてください。 x軸は年齢、y軸は性別です(1は男性、2は女性)。黒いマークはユーザーが曲を好きであることを示し、赤いマークはユーザーが曲を好きではないことを示します。私の推測では、このグラフには、男性で12〜37歳のユーザーに対応する黒いマークがたくさんあり、残りのマークは赤になっている可能性があります。したがって、決定境界を手動で選択すると、この領域の周りの長方形が黒点の大部分を保持します。これは決定境界と呼ばれます。まったく新しい人があなたのところに来て、年齢と性別を教えてくれた場合、グラフにプロットして、そのボックスに含まれるかどうかを尋ねるだけでよいからです。

したがって、ここで難しいのは、決定の境界を見つけることです。良いニュースは、それを行う方法を知る必要がないということです。いくつかの一般的なツールの使用方法を知っている必要があります。ニューラルネットワークの使用、サポートベクターマシン、線形分類器などを調べることができます。繰り返しになりますが、有名人にだまされてはいけません。ほとんどの人は、これらのことが実際に何をしているのかをあなたに伝えることができません。彼らは物事を接続して結果を得る方法を知っているだけです。

少し遅れていることは承知していますが、これがこのスレッドでつまずいた人の助けになることを願っています。

27
Josh

これは本当にあなたが尋ねている非常に大きな質問なので、私があなたに詳細な答えを与えることができたとしても、私には時間がないのではないかと思います....しかし私は提案があります、グレッグリンデンのブログと彼の論文を見てくださいアイテムベースの協調フィルタリングについて。グレッグは、アイテムベースのアプローチを使用してAmazonで推奨エンジンのアイデアを実装しました。彼は自分のものを本当に知っており、ブログや論文は非常に読みやすいものです。

ブログ: http://glinden.blogspot.com/ 紙: http://www.computer.org/portal/web/csdl/doi/10.1109/MIC.2003.1167344 =(CSの学生であるため、完全に読むにはログインする必要があります)。

EditInfer.Net もご覧ください。映画データのレコメンダーシステムを構築する例が含まれています。

3
Steve

Hadoopで実装するための協調フィルタリングベースのレコメンデーションエンジンに関する2部構成のブログがあります。

http://pkghosh.wordpress.com/2010/10/19/recommendation-engine-powered-by-hadoop-part-1/

http://pkghosh.wordpress.com/2010/10/31/recommendation-engine-powered-by-hadoop-part-2/

これがオープンソースプロジェクトのgithubリポジトリです https://github.com/pranab/sifarish

よろしければお気軽にご利用ください。

3
Pranab Ghosh

オープンソース(AGPLv3ライセンス)であるレコメンデーションエンジンの例が、Filmaster.comによって最近公開されました。これはC++で書かれており、Netflixチャレンジの一部として作成されたホワイトペーパーのベストプラクティスを使用しています。それに関する記事は次の場所にあります: http://polishlinux.org/gnu/open-source-film-recommendation-engine/ そしてコードはここにあります: http:// bitbucket.org/filmaster/filmaster-test/src/tip/count_recommendations.cpp

2
michuk