2013-01-08 47 views
4

我有新聞報道的非常標準的Mahout的基於項目的推薦(使用點擊數據,因此偏好布爾):Mahout的推薦 - 加入基於內容的相似性基於項目的推薦

DataModel dataModel = new ReloadFromJDBCDataModel(
     new PostgreSQLBooleanPrefJDBCDataModel(localDB, ...) 
); 
ItemSimilarity itemSimilarity = new TanimotoCoefficientSimilarity(dataModel); 
ItemBasedRecommender recommender = new GenericBooleanPrefItemBasedRecommender(dataModel, itemSimilarity); 

我嘗試將基於內容的知識注入推薦人,這樣我就能夠推薦不僅在正常協作過濾意義上相似的文章,而且在他們共享許多常用術語的意義上也是類似的。

使用Mahout批次預先計算文章內容相似度(TF-IDF向量的餘弦相似度)並從DB讀取。但是,會有許多沒有相似性數據的文章對。這是因爲兩個原因:

  • 文章內容相似的數據將不是用戶項目的偏好的數據模型不經常更新,所以會有一個滯後之前,新的文章有自己的內容計算出的相似度。

  • 理想情況下,我想將所有內容相似度數據加載到內存中,因此我將只存儲每篇文章的前20個相似度。

所以,對於給定的一對物品,我有:

  • 項相似性(谷本)0 < = S1 < = 1
  • 內容相似性(餘弦)0 < = s2 < = 1(可能爲空)

在內容相似性不爲null的情況下,我想使用它的值來加權項目similarit y,以增強具有相似內容的文章。

我的問題是:

  • 是否合理嘗試將這些措施結合起來,還是我在嘗試一些瘋狂?
  • 將這兩個值合併爲一個相似度得分的合理公式是什麼?
  • 這是最好的自定義ItemSimilarityRescorer

回答

6

是的,它是完全合理的。如果兩種相似性都在[0,1]中,那麼最明智的組合就是他們的產品。這是你使用ItemSimilarity注入的東西,而不是IDRescorer

+1

感謝您的回覆。我要求一個「明智的公式」的原因是,與文​​章內容非常不相似的情況相比,簡單地乘以相似性會導致較低的分數,因此沒有可用的內容相似性分數。例如。 itemSimilarity = 0.9,contentSimilarity = 0.9 - > 0.9 x 0.9 = 0.81。 itemSimilarity = 0.9,contentSimilarity = null - > 0.9 x null = 0.9。我想我可以在這種情況下硬編碼一個非常低的內容相似度值。 –

+0

當然可以,但是它們在同樣的意義上都會更低。在基於項目鄰域的算法中,相似度只是加權平均的權重。它們的絕對大小並不重要;如果你把他們全部減半,結果將是相同的。 –

+0

@ChrisB - 你是如何測量內容相似度的? mahout會這麼做嗎?我雖然mahout純粹是基於協作的建議? – user1431072

相關問題