2009-09-10 73 views
35

這幾天我對推薦引擎感興趣,我想在這方面提高自己。我目前正在閱讀「Programming Collective Intelligence」我認爲這是關於這個主題的最好的書,來自O'Reilly。但我對如何實現引擎沒有任何想法;我的意思是「不知道」是「不知道如何開始」。在我看來,我有一個像Last.fm這樣的項目。如何創建我自己的推薦引擎?

  1. 哪裏做(應該在數據庫端或後端執行)我開始創建 推薦引擎?
  2. 需要什麼水平的數據庫知識?
  3. 是否有任何可用於幫助或任何資源的開源軟件?
  4. 我應該做的第一步是什麼?
+0

你的背景是什麼?你已經知道如何編程?用什麼語言?什麼是你的重點 - 我會猜測後端的邏輯,但如果你也想要頁面看起來不錯,這是一個額外challgenge ;-) – 2009-09-10 21:37:47

+0

我是cs學生我有良好的知識c,c + +,java和c#上網站方面我有數據庫中間的MySQL和一個小oracle的PHP。 – 2009-09-10 21:40:22

+0

您需要的是一些軟件工程知識,例如如何引出和分析需求。如果你知道你真的想要什麼,其他技術已經不再是問題了。 – 2011-12-25 01:15:44

回答

22

我已經建立了一個自己的視頻門戶。我的主要想法是收集關於一切的數據:

  • 誰上傳了視頻?
  • 誰對視頻發表了評論?
  • 哪個標籤在哪裏創建?
  • 誰訪問過視頻? (也跟蹤匿名訪客)
  • 誰收藏了視頻?
  • 誰給視頻加油?
  • 視頻分配給哪個頻道?
  • 標題,描述,標籤,頻道和評論的文本流由全文索引器收集,該全文索引器對每個數據源賦予權重。

接下來我創建了函數,它返回上面每個點的(id,weight)元組列表。有些人只考慮有限數量的視頻(例如,最後50人),有些人通過例如評分,標籤計數(更常被標記=表達不足)來修改權重。有跡象表明,返回下面的列表功能:通過全文檢索

  • 類似的影片由同一用戶上傳
  • 影片
  • 其他視頻從這些評論還評論了
  • 其他視頻從用戶的用戶這些收藏夾也被收藏
  • 其他視頻從以上的評分也額定(加權)
  • 其他視頻在相同的信道評估者
  • 具有相同標籤的其他視頻
  • 由誰
  • 通過評論全文類似的影片通過標題全文
  • 類似視頻玩過這個視頻(XY最新戲劇)的人在玩其他的視頻(通過變量「表現」加權)
  • 按說明全文類似的視頻
  • 通過標籤全文類似的視頻

這些都將通過視頻ID的權重只是總結合併成一個列表,T母雞按重量分類。這對於大約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 

我會感興趣的其他人如何解決這樣的算法。

+0

這已經成爲一顆寶石了嗎? – 2012-05-17 02:45:04

+0

Apperently沒有,該項目被凍結,我想它會永遠持續...... :-(所以,除非會有另一個項目對我來說,這使得利用這一點,我可能不會 – hurikhan77 2012-05-27 15:47:03

+0

拆分出來。@ hurikhan77我在一個類似的音樂推薦引擎上工作,我對選擇數據庫感到困惑,我想過的是將靜態數據存儲在關係數據庫中,並且用戶事件(比如play等)存儲在Elastic-search中並處理它。 – Gaurav 2015-03-25 15:58:58

2

這真的是一個非常大的問題,所以即使我能給你一個詳細的答案,我懷疑我會有時間......但我有一個建議,看看格林·林登的博客和他的關於基於項目的協作過濾的論文。 Greg在亞馬遜使用基於項目的方法實現了推薦引擎的想法,他真的知道他的東西,他的博客和論文非常可讀。

博客:http://glinden.blogspot.com/ 紙:http://www.computer.org/portal/web/csdl/doi/10.1109/MIC.2003.1167344(恐怕你需要登錄全讀它,因爲你是一個CS的學生,這應該是可能的)。

編輯 你也可以看看Infer.Net,它們包括建立一個推薦系統對電影數據的例子。

27

提出建議可以在可劃分爲兩個主要部分:

  1. 特徵提取
  2. 建議

特徵提取對於推薦的對象非常具體。例如,對於音樂,對象的某些功能可能是歌曲的頻率響應,功率,流派等。用戶的功能可能是年齡,位置等。然後,您爲每個用戶創建一個矢量,歌曲與矢量的各種元素對應於不同的感興趣的特徵。

執行實際建議只需要經過深思熟慮的特徵向量。請注意,如果您不選擇正確的功能,您的推薦引擎將失敗。這就像要求你根據我的年齡告訴我我的性別。當然,我的年齡可能會提供一些信息,但我認爲你可以想象更好的問題。無論如何,一旦你有每個用戶和歌曲的特徵向量,你將需要培訓推薦引擎。我認爲最好的方法是讓大量用戶進行人口統計測試,然後告訴你他們喜歡的特定歌曲。在這一點上,你有你需要的所有信息。你的工作是根據你所掌握的信息繪製一個決策邊界。考慮一個簡單的例子。你想預測一個用戶是否喜歡AC/DC的基於年齡和性別的「Back in Black」。想象一下顯示100個數據點的圖表。 x軸是年齡,y軸是性別(1是男性,2是女性)。黑色標記表示用戶喜歡這首歌,而紅色標記表示他們不喜歡這首歌。我的猜測是,這個圖表可能會有很多與男性和年齡在12到37歲之間的用戶相對應的黑色標記,而其餘的標記將是紅色的。所以,如果我們要手動選擇一個決策邊界,那麼這個區域就是一個矩形,它佔據了大部分黑色標記。這就是所謂的決策邊界,因爲如果一個全新的人來找你並告訴你他們的年齡和性別,你只需要在圖表上畫出他們,並詢問他們是否屬於這個框。

所以,這裏最困難的部分是找到決策邊界。好消息是你不需要知道如何做到這一點。你只需要知道如何使用一些常用工具。你可以看看使用神經網絡,支持向量機,線性分類器等。再次,不要讓大牌騙你。大多數人不能告訴你這些事情真的在做什麼。他們只知道如何插入並獲得結果。

我知道這有點遲,但我希望這可以幫助任何人在這個線程上絆倒。