7

私は約700kのユーザーのデータベースを持っており、視聴/読んで購入したアイテムなどを持っています。 私が構築しているソーシャルネットワークで友人になりたい人を実際に見つけるだけでなく、似たような好みのユーザーが楽しんだことに基づいて新しいアイテムを推薦するリコメンデーションエンジンを構築したいと思います。 last.fm)。次のように類似のアイテムとユーザーを見つけるための推奨アルゴリズム(と実装)

私の要件は次のとおりです。私のデータベースにある「ユーザー」の

  • 大半は、実際に私のウェブサイトのユーザーではありません。それらは第三者ソースから採掘されたデータです。しかし、ユーザーを推薦する際には、私のウェブサイトのメンバーであるユーザーに検索を制限したい(大きなデータセットを利用しながら)。
  • 私は複数の項目を考慮する必要があります。 「あなたが楽しんだこの1つのアイテムが好きな人」ではなく、「あなたが楽しんだアイテムの大半を好む人...」。
  • ユーザー間の類似点を計算し、プロファイルを表示するときに表示する必要があります(味覚メートル)。
  • 評価の高い商品もあれば、評価されていない商品もあります。格付けはブール値ではなく1から10までです。ほとんどの場合、他の統計情報から評価値を差し引くことは可能です(たとえば、ユーザーがアイテムを好きで評価していない場合は、評価は9とすることができます)。
  • これは、Pythonコードとやりとりする必要があります。好ましくは、それは別々の(おそらくNoSQL)データベースを使用し、私のウェブのバックエンドで使用するAPIを公開するべきです。私が作っているプロジェクトはPyramidとSQLAlchemyを使っています。
  • アイテムのジャンルを考慮したいと思います。
  • 私はそのジャンル(おそらくタグ)とそのアイテムを楽しむユーザー(Amazonの「このアイテムを購入した人」とLast.fmのアーティストページのようなもの)の両方に基づいてアイテムページに同様のアイテムを表示したいと思います。異なるジャンルのアイテムはまだ表示されるはずですが、類似性の値は低くなります。
  • 私はいくつかの例でアルゴリズムの実装がうまく文書化されている方が好きです。

これらのアルゴリズムは非常に多くのアルゴリズムを実装しており、自分のデータ/用途に最も適したものを探しているので、「pysuggestまたはmahoutを使用する」という回答はしないでください。私はNeo4jに興味を持ち、どのようにしてユーザーとアイテム間の接続のグラフとして表現できるのでしょうか。

答えて

4

実際には、これはNeo4jのようなグラフデータベースのsweetspotsの1つです。

は、だからあなたのデータモデルは次のようになります場合:これはまたのNeo4jを使用して行うことができ

start user = node:users(id="doctorkohaku") 
match user -[r:LIKE]->item<-[r2:LIKE]-other-[r3:LIKE]->rec_item 
where r.stars > 2 and r2.stars > 2 and r3.stars > 2 
return rec_item.name, count(*) as cnt, avg(r3.stars) as rating 
order by rating desc, cnt desc limit 10 

:あなたは簡単にこのようなサイファー・ステートメントを使用して、ユーザーのための推奨を取得することができます

user -[:LIKE|:BOUGHT]-> item 

Core-APIまたはTraversal-APIを使用します。

Neo4jにはPython APIがあり、これもまたサイファークエリを実行できます。

免責事項:私はのNeo4j

のために働く協調フィルタリングについてMarko Rodriguezすることにより、いくつかの興味深い記事もあります。

+0

ジャンルの項目が接続されているアイテムのカテゴリノードをお勧めします。一致句でそれらを考慮に入れることができます –

+1

実際には非常に便利ですが、リンクはグラフではなくグラフ-dbに情報を格納しています推奨に基づいたアプローチ。 – Steve

+0

ありがとうございました!私はもう少し読んだことがあり、Neo4jの文書の中でcypher料理の本を見て、それが私が必要とするものを正確にしています。私は推薦エンジンのためにグラフデータベースアプローチを採用することに決めました。 – vomitcuddle

4

ユーザ間の類似性を判断するには、コサインまたはピアソンの類似度(実際にはMahoutとネット上のどこにも見つかっています!)をユーザベクトル全体で実行できます。だからあなたのデータ表現は、あなたが誰かのプロファイルがどの程度似ているかを判断するために、上記を使用することができます考慮し、複数のアイテムを取るしたいポイントで

u1 [1,2,3,4,5,6] 
u2 [35,24,3,4,5,6] 
u1 [35,3,9,2,1,11] 

のようになります。相関スコアが高いほど、それらが非常に類似したアイテムを有する可能性が高い。 .75の類似性を持つ人物のプロフィールに類似した項目があるように、しきい値を設定できます。

あなたが欠けているところでは、もちろんあなた自身の値を作ることができます。私はそれらをバイナリにしておき、さまざまなアルゴリズムを混ぜてみようと思います。それはアンサンブルと呼ばれています。

全体的に、あなたは、セットアップの推奨事項としてアイテムベースのコラボレーティブフィルタリングと呼ばれるものを探しており、同様のアイテムを識別するためにも使用されています。これは、お勧めしたすべてのことを行う標準的な推奨アルゴリズムです。

類似のユーザーを探すときは、ユーザーベクトル全体にわたっていくつかのタイプの類似性メトリックを実行できます。パイソンについて

、集合知プログラミングという本は、Pythonですべてのサンプルはそうコピーを拾う行くとグラフがあなたの永遠の表現として多少problamaticになりますように、このすべてを表現1.

に章を読んでいますBipartile Graphです。そこには、グラフベースのアプローチを使用する推奨アプローチがありますが、一般的には最高のパフォーマンスを得るアプローチではありません。

1

オープンソースプロジェクトReco4jをご覧になることをお勧めします。これは、グラフベースの推奨エンジンであり、あなたのようなグラフデータベース上で非常に困難な方法で使用できます。グラフデータベースneo4jとしてサポートしています。これは初期のバージョンですが、まもなくより完全なバージョンが利用可能になります。その間、私たちはプロジェクトのユースケースを探していますので、どのようにコラボレーションできるかを知るために私に連絡してください。

関連する問題