比如看完了壹片《Python怎樣讀取MySQL》之後,在相似推薦中看到了壹片題目為《Python操作MySQL的效果優化》的文章,很自然的就像多深入了解壹下,於是就點進去看壹看,那麽對於整個網站來說,就會降低跳出率,增加用戶的留存,是壹個很好的用戶體驗。
實現壹個內容相似推薦的方案比較簡單,大體上包含以下步驟:
1、獲取內容數據,比如標題、關鍵字、分類、甚至全文本;
壹般文檔、數據等內容都存儲於mysql,可以使用python/java等語言直接讀取mysql導出到文件.txt格式,或者直接用shell的mysql -e sql > data.txt的方式導出。
壹般情況下,全文本內容太散,不會作為候選字段,但是有些視頻之類的實體,因為標題和簡介文字太少,如果有詳情全文本的話,也可以加入候選數據字段。
2、對內容數據做中文分詞;
如果是python語言,可以使用“結巴分詞”,地址為: /fxsjy/jieba
或者可以直接使用百度雲的中文分詞,百度的NLP自然語言處理技術還是很厲害的。
3、提取內容數據的關鍵詞;
當分詞之後,分詞結果中包含很多“的”、“也”等無意義的詞語,這些詞語不能稱之為關鍵詞,壹般會通過TF/IDF的方法計算每個詞語的權重,將壹個文檔的所有詞語的TF/IDF權重倒序排列,取TOPN個作為關鍵詞;
如果使用的是jieba分詞,那麽直接就自帶了提取關鍵詞的支持;當然也可以自己計算,TF就是計算壹篇文章中每個詞語出現的次數、IDF就是這個詞語在所有文章中出現的次數,TF除以IDF就是權重值;
4、將關鍵詞映射成數字向量;
我們最終的目標是計算文檔之間的相似度,要計算相似度那就需要把內容映射成向量,第壹步就是先把每個詞語映射成向量,映射的方式有幾種:
使用one hot方法映射成向量
自己訓練word2vec密度向量;
使用業界的訓練好的word2vec向量
壹般情況下,自己的數據集比較小,效果會比業界的word2vec效果差壹些,比如這裏推薦騰訊開源的200維度全網word2vec向量,地址在: /ailab/nlp/embedding.html
5、計算文檔粒度的數字向量;
得到每個詞語的向量之後,通過加權平均的方式可以計算整個文檔的向量;
權重可以使用每個詞語的頻率次數歸壹化,或者直接平均即可;
6、計算文檔之間的相似度;
使用cosin算法就能夠計算文檔向量之間的相似度;
cosin算法很簡單,java、python自己實現就可以,也可用/中的相似度計算模塊直接調用實現。
計算完之後,對於每個文檔,將它跟每個文檔的相似度做倒序排列,比如TOP 30個作為推薦的結果集合。
7、將文檔的相似度關系存入mysql/redis等緩存;
第6步驟會得到壹個這樣的結果:(文檔ID、相似文檔ID列表),將這樣的數據直接存入mysql或者redis,key就是文檔ID,value是相似文檔ID列表即可。
8、當頁面展示壹個內容的時候,提取相似推薦進行展示;
當用戶訪問壹個頁面的時候,後端服務python/java從緩存redis或者mysql中根據展示的頁面的文檔ID,提取相似ID列表;
因為前幾步驟是提前計算好的列表,這裏也可能做壹些過濾已下線的事情,然後根據ID提取對應的標題、簡介等信息,組裝成相似推薦列表返回給前端即可;
總結
以上就是離線計算相似推薦的步驟,其實還可以用在線的方式進行,把這個問題按照搜索的架構實現即可,新來壹個文檔就分詞、計算關鍵詞列表存儲,然後每次訪問的時候根據關鍵詞列表查詢相同關鍵詞列表的文檔也可以實現。
當相似內容推薦上線後,就能夠不斷積累壹些用戶點擊、查看文檔的行為數據,基於行為數據就能訓練協同過濾的模型,實現內容不相似但是行為相似的協同過濾推薦。