2012年5月17日 星期四

基於lucene實現自己的推薦引擎


採用基於資料採擷的演算法來實現推薦引擎是各大電子商務網站、SNS社區最為常用的方法,推薦引擎常用Content-Based 推薦演算法及協同過濾演算法(Item-Based User-based)。但從實際應用來看,對於大部分中小型企業來說,要在電子商務系統完整採用以上演算法還有很大的難度。
1、常用推薦引擎演算法問題
1)、相對成熟、完整、現成的開源解決方案較少
粗略分來,目前與資料採擷及推薦引擎相關的開源專案主要有如下幾類:
資料採擷相關:主要包括WekaR-ProjectKnimeRapidMinerOrange
文本挖掘相關:主要包括OpenNLPLingPipeFreeLingGATE Carrot2 等,具體可以參考LingPipe’s Competition
推薦引擎相關:主要包括Apache MahoutDuine frameworkSingular Value Decomposition (SVD) ,其他包可以參考Open Source Collaborative Filtering Written in Java
搜尋引擎相關:LuceneSolrSphinxHibernate Search
2
)、常用推薦引擎演算法相對複雜,入門門檻較高
3
)、常用推薦引擎演算法性能較低,並不適合海量資料採擷
以上這些包或演算法,除了Lucene/Sor相對成熟外,大部分都還處於學術研究使用,並不能直接應用於互聯網規模的資料採擷及推薦引擎引擎使用。
2、採用Lucene實現推薦引擎的優勢
對很多眾多的中小型網站而言,由於開發能力有限,如果有能夠集成了搜索、推薦一體化的解決方案,這樣的方案肯定大受歡迎。採用Lucene來實現推薦引擎具有如下優勢:
1
)、Lucene 入門門檻較低,大部分網站的站內搜索都採用了Lucene
2
)、相對於協同過濾演算法,Lucene性能較高
3
)、LuceneText Mining、相似度計算等相關演算法有很多現成方案
在 開源的項目中,Mahout或者Duine Framework用於推薦引擎是相對完整的方案,尤其是Mahout 核心利用了Lucene,因此其架構很值得借鑒。只不過Mahout目前功能還不是很完整,直接用其實現電子商務網站的推薦引擎尚不是很成熟。只不過從 Mahout實現可以看出採用Lucene實現推薦引擎是一種可行方案。
3、採用Lucene實現推薦引擎需要解決的核心問題
Lucene對於Text Mining較為擅長,在contrib包中提供了MoreLikeThis功能,可以較為容易實現Content- Based的推薦,但對於涉及用戶協同過濾行為的結果(所謂的Relevance Feedback),Lucene目前並沒有好的解決方案。需要在Lucene中內容相似演算法中加入使用者協同過濾行為對因素,將用戶協同過濾行為結果轉化 為Lucene所支援的模型。
4、推薦引擎的資料來源
電子商務網站與推薦引擎相關典型的行為:
·  購買本商品的顧客還買過
·  流覽本商品的顧客還看過
·  流覽更多類似商品
·  喜歡此商品的人還喜歡
·  用戶對此商品的平均打分
因此基於Lucene實現推薦引擎主要要處理如下兩大類的資料
1
)、內容相似度
例如:商品名稱、作者/譯者/製造商、商品類別、簡介、評論、使用者標籤、系統標籤
2
)、用戶協同行為相似度
例如:打標籤、購買商品、點擊流、搜索、推薦、收藏、打分、寫評論、問答、頁面停留時間、所在群組等等
5、實現方案
5.1、內容相似度 基於Lucene MoreLikeThis實現即可。
5.2
、對用戶協同行為的處理
1
)、用戶每一次協同行為都使用lucene來進行索引,每次行為一條記錄
2
)、索引記錄中包含如下重要資訊:
商品名、商品id、商品類別、商品簡介、標籤等重要特徵值、用戶關聯行為的其他商品的特徵元素、商品縮略圖位址、協同行為類型(購買、點擊、收藏、評分等)、Boost值(各協同行為在setBoost時候的權重值)
3
)、對評分、收藏、點擊等協同行為以商品特徵值(標籤、標題、概要資訊)來表徵
4
)、不同的協同行為類型(例如購買、評分、點擊)設置不同的值setBoost
5
)、搜索時候採用Lucene MoreLikeThis演算法,將使用者協同轉化為內容相似度
以上方案只是基於Lucene來實現推薦引擎最為簡單的實現方案,方案的準確度及細化方案以後再細說。
更為精細的實現,可以參考Mahout的演算法實現來優化。

沒有留言: