7

我有一個大約700k用戶的數據庫以及他們已經觀看/收聽/閱讀/購買/等的項目。 我想建立一個推薦引擎,根據用戶喜歡什麼樣的喜好來推薦新項目,以及在我正在建立的社交網絡上真正發現用戶可能想成爲朋友的人(類似於last.fm)。查找類似項目和用戶的推薦算法(和實現)

我的要求如下:

  • 在我的數據庫中的「用戶」的多數實際上並不是我的網站的用戶。它們是從第三方來源開採的數據。但是,在推薦用戶時,我想將搜索範圍限制爲我網站成員的用戶(同時仍在利用更大的數據集)。
  • 我需要考慮多個項目。不是「喜歡這個你喜歡的一件物品的人......」,而是「喜歡你喜歡的大多數物品的人......」。
  • 我需要計算用戶之間的相似度,並在查看他們的配置文件時顯示它們(品味度量單位)。
  • 有些項目被評分,其他項目沒有。等級從1-10開始,而不是布爾值。在大多數情況下,如果它不存在(例如,如果用戶喜歡某件物品,但尚未對其進行評級,則可以從其他統計數據中扣除評級值,我可以將其評爲9)。
  • 它必須以某種方式與Python代碼進行交互。最好,它應該使用一個單獨的(可能是NoSQL)數據庫,並暴露一個API用於我的網絡後端。我正在製作的項目使用Pyramid和SQLAlchemy。
  • 我想考慮物品類型。
  • 我想根據其流派(可能是標籤)和喜歡該項目的用戶喜歡的項目頁面(如亞馬遜的「購買此項目的人」和Last.fm藝術家頁面)顯示類似的項目。仍然會顯示來自不同流派的項目,但具有較低的相似性值。
  • 我寧願有一些例子的一個有充分記錄的算法實現。

請不要給出像「使用pysuggest或mahout」的答案,因爲那些實現了大量的算法,我正在尋找一個最適合我的數據/使用的算法。我一直對Neo4j感興趣,並且如何將它全部表達爲用戶和項目之間的連接圖。

回答

4

實際上,這是像Neo4j這樣的圖形數據庫的甜點之一。

所以,如果你的數據模型是這樣的:

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

您可以輕鬆地獲得建議的用戶與CYPHER聲明是這樣的:

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 

這也可以使用Neo4j的完成Core-API或Traversal-API。

Neo4j有一個Python API,它也能夠運行密碼查詢。

聲明:我Neo4j的

工作,也有通過Marko Rodriguez關於協同過濾一些有趣的文章。

+0

對於流派我推薦項目連接到的流派類別節點,你可以在匹配條款中考慮這些 –

+1

這確實很方便,發佈的鏈接將信息存儲在圖形數據庫中,而不是圖形基於方法的建議。 – Steve

+0

謝謝!我已經做了一些更多的閱讀,看看Neo4j文檔中的密碼菜譜,它完全符合我需要它做的事情。我決定採用圖形數據庫的方式來推薦我的推薦引擎。 – 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的,在集體智慧的書叫編程使他們所有的Python樣本,以便去拿起一個副本,並閱讀第一章。

佔全部本作的圖形會隨着你的不朽表示有些problamatic是Bipartile Graph。有很多推薦方法使用基於圖的方法,但通常不是最好的方法。

1

我可以建議看看我的開源項目Reco4j。它是一個基於圖形的推薦引擎,可以以非常直接的方式在像您這樣的圖形數據庫上使用。我們支持圖形數據庫neo4j。它在早期版本中,但很快會有更完整的版本可用。同時,我們正在尋找我們項目的一些用例,所以請與我聯繫,以便我們瞭解我們如何進行協作。