很多產(chǎn)品想要加入推薦系統(tǒng)模塊卒煞,最簡(jiǎn)單的就是做內(nèi)容相似推薦痪宰,雖然技術(shù)簡(jiǎn)單但是效果卻很好,對(duì)于增加用戶粘性畔裕、提升用戶留存有較多的效果衣撬,甚至很多產(chǎn)品后來加入了很多推薦模塊之后,還是發(fā)現(xiàn)導(dǎo)流效果最好的依然是內(nèi)容的相似推薦扮饶。
比如看完了一片《Python怎樣讀取MySQL》之后具练,在相似推薦中看到了一片題目為《Python操作MySQL的效果優(yōu)化》的文章,很自然的就像多深入了解一下贴届,于是就點(diǎn)進(jìn)去看一看靠粪,那么對(duì)于整個(gè)網(wǎng)站來說,就會(huì)降低跳出率毫蚓,增加用戶的留存,是一個(gè)很好的用戶體驗(yàn)昔善。
實(shí)現(xiàn)一個(gè)內(nèi)容相似推薦的方案比較簡(jiǎn)單元潘,大體上包含以下步驟:
1、獲取內(nèi)容數(shù)據(jù)君仆,比如標(biāo)題翩概、關(guān)鍵字、分類返咱、甚至全文本钥庇;
一般文檔、數(shù)據(jù)等內(nèi)容都存儲(chǔ)于mysql咖摹,可以使用python/java等語(yǔ)言直接讀取mysql導(dǎo)出到文件.txt格式评姨,或者直接用shell的mysql -e sql > data.txt的方式導(dǎo)出。
一般情況下萤晴,全文本內(nèi)容太散吐句,不會(huì)作為候選字段胁后,但是有些視頻之類的實(shí)體,因?yàn)闃?biāo)題和簡(jiǎn)介文字太少嗦枢,如果有詳情全文本的話攀芯,也可以加入候選數(shù)據(jù)字段。
2文虏、對(duì)內(nèi)容數(shù)據(jù)做中文分詞侣诺;
如果是python語(yǔ)言,可以使用“結(jié)巴分詞”氧秘,地址為:https://github.com/fxsjy/jieba
或者可以直接使用百度云的中文分詞紧武,百度的NLP自然語(yǔ)言處理技術(shù)還是很厲害的。
3敏储、提取內(nèi)容數(shù)據(jù)的關(guān)鍵詞阻星;
當(dāng)分詞之后,分詞結(jié)果中包含很多“的”已添、“也”等無意義的詞語(yǔ)妥箕,這些詞語(yǔ)不能稱之為關(guān)鍵詞,一般會(huì)通過TF/IDF的方法計(jì)算每個(gè)詞語(yǔ)的權(quán)重更舞,將一個(gè)文檔的所有詞語(yǔ)的TF/IDF權(quán)重倒序排列畦幢,取TOPN個(gè)作為關(guān)鍵詞;
如果使用的是jieba分詞缆蝉,那么直接就自帶了提取關(guān)鍵詞的支持宇葱;當(dāng)然也可以自己計(jì)算,TF就是計(jì)算一篇文章中每個(gè)詞語(yǔ)出現(xiàn)的次數(shù)刊头、IDF就是這個(gè)詞語(yǔ)在所有文章中出現(xiàn)的次數(shù)黍瞧,TF除以IDF就是權(quán)重值;
4原杂、將關(guān)鍵詞映射成數(shù)字向量印颤;
我們最終的目標(biāo)是計(jì)算文檔之間的相似度,要計(jì)算相似度那就需要把內(nèi)容映射成向量穿肄,第一步就是先把每個(gè)詞語(yǔ)映射成向量年局,映射的方式有幾種:
使用one hot方法映射成向量
自己訓(xùn)練word2vec密度向量;
使用業(yè)界的訓(xùn)練好的word2vec向量
一般情況下咸产,自己的數(shù)據(jù)集比較小矢否,效果會(huì)比業(yè)界的word2vec效果差一些,比如這里推薦騰訊開源的200維度全網(wǎng)word2vec向量脑溢,地址在:https://ai.tencent.com/ailab/nlp/embedding.html
5僵朗、計(jì)算文檔粒度的數(shù)字向量;
得到每個(gè)詞語(yǔ)的向量之后,通過加權(quán)平均的方式可以計(jì)算整個(gè)文檔的向量衣迷;
權(quán)重可以使用每個(gè)詞語(yǔ)的頻率次數(shù)歸一化畏鼓,或者直接平均即可;
6壶谒、計(jì)算文檔之間的相似度云矫;
使用cosin算法就能夠計(jì)算文檔向量之間的相似度;
cosin算法很簡(jiǎn)單汗菜,java让禀、python自己實(shí)現(xiàn)就可以,也可用https://scikit-learn.org或者h(yuǎn)ttp://surpriselib.com/中的相似度計(jì)算模塊直接調(diào)用實(shí)現(xiàn)陨界。
計(jì)算完之后巡揍,對(duì)于每個(gè)文檔,將它跟每個(gè)文檔的相似度做倒序排列菌瘪,比如TOP 30個(gè)作為推薦的結(jié)果集合腮敌。
7、將文檔的相似度關(guān)系存入mysql/redis等緩存俏扩;
第6步驟會(huì)得到一個(gè)這樣的結(jié)果:(文檔ID糜工、相似文檔ID列表),將這樣的數(shù)據(jù)直接存入mysql或者redis录淡,key就是文檔ID捌木,value是相似文檔ID列表即可。
8嫉戚、當(dāng)頁(yè)面展示一個(gè)內(nèi)容的時(shí)候刨裆,提取相似推薦進(jìn)行展示;
當(dāng)用戶訪問一個(gè)頁(yè)面的時(shí)候彬檀,后端服務(wù)python/java從緩存redis或者mysql中根據(jù)展示的頁(yè)面的文檔ID帆啃,提取相似ID列表;
因?yàn)榍皫撞襟E是提前計(jì)算好的列表凤覆,這里也可能做一些過濾已下線的事情链瓦,然后根據(jù)ID提取對(duì)應(yīng)的標(biāo)題、簡(jiǎn)介等信息盯桦,組裝成相似推薦列表返回給前端即可;
總結(jié)
以上就是離線計(jì)算相似推薦的步驟渤刃,其實(shí)還可以用在線的方式進(jìn)行拥峦,把這個(gè)問題按照搜索的架構(gòu)實(shí)現(xiàn)即可,新來一個(gè)文檔就分詞卖子、計(jì)算關(guān)鍵詞列表存儲(chǔ)略号,然后每次訪問的時(shí)候根據(jù)關(guān)鍵詞列表查詢相同關(guān)鍵詞列表的文檔也可以實(shí)現(xiàn)。
當(dāng)相似內(nèi)容推薦上線后,就能夠不斷積累一些用戶點(diǎn)擊玄柠、查看文檔的行為數(shù)據(jù)突梦,基于行為數(shù)據(jù)就能訓(xùn)練協(xié)同過濾的模型,實(shí)現(xiàn)內(nèi)容不相似但是行為相似的協(xié)同過濾推薦羽利。