使用文本挖掘實現站點個性化推薦
作者:韋瑋,重慶韜翔網路科技有限公司(上海)董事長兼總經理,IT作家,CSDN社區專家。
技術背景
一條信息是否能夠讓用戶感興趣,主要取決於這條信息的內容是否是用戶關注的內容。而將用戶感興趣的信息推送給對應的用戶,可以更好地發揮該信息的價值,否則,不僅對應信息的價值無法有效發揮,甚至會引起用戶的情緒,因為如果用戶對這條信息不感興趣,那麼這條信息對於該用戶來說就相當於垃圾信息。
現在關鍵的問題是,如何判斷出現有的信息中,哪些信息是用戶感興趣的信息,從而把這些用戶可能感興趣的信息推送給用戶,這樣對於用戶來說,可以獲取期望的內容,對於企業來說,這可以更好地獲取商業利益。
比如,我們在使用今日頭條的時候,你會發現推送過來的文章基本上都是我們感興趣的文章,這些文章都是個性化推薦過來的。其實,如果我們可以將這項技術更好的利用,這可以改變更多領域。
可以想像,如果小說站點採用個性化推薦技術,那麼當讀者在讀一本小說的時候,我們可以判斷該讀者的興趣,並從小說庫中選擇出讀者可能最感興趣的小說,並將篩選出來的小說推薦給該讀者,那麼此時,對於讀者和網站來說是雙贏的,比如就讀者而言,節省了小說篩選的成本,並且可以很方便地獲得自己感興趣的內容,就網站而言,將合適的內容推薦給合適的用戶,更有利於用戶的付費。除此之外,個性化推薦技術還可以應用到新聞站點、商城、視頻站點等等方面。
在本篇文章中,我們將為大家講解如何採用Python文本挖掘技術實現個性化推薦技術。
文本挖掘技術(Text Mining)簡介
文本挖掘技術(Text Mining)是數據挖掘技術中的一種,簡單來說,文本挖掘技術就是對現有的一些文本信息進行分析、處理等,從而提取或計算出一些有價值的信息供我們使用的一種技術。
而在這篇文章中,我們主要用到文本挖掘技術中的分詞、文本相似度計算等技術,而文本相似度計算我們主要會採用TF-IDF演算法,相關理論知識各位讀者可以自行了解,本篇文章中主要會進行實戰的講解。
將文本挖掘技術應用於個性推薦的思路
那麼,我們如何將文本挖掘技術應用於個性推薦呢?
看起來這兩者確實不太相關,但實際上這兩者關係密切。比如,我們可以這樣實現個性推薦:
1、首先,記錄用戶在網站中的行為,比如看了哪些文章、閱讀了哪些小說等等行為。 2、其次,將用戶長時間觀看的這些小說(以小說站點為例)數據提取出來,得到數據1(data1)。 3、然後,將data1與站點內的所有小說數據分別進行文本相似度計算,最終篩選出相似度高的小說數據,比如取前兩本相似度最高的小說,得到小說2(data2)、小說3(data3)。 4、將data2、data3推薦給該用戶。因為這兩本小說用戶目前長時間閱讀的小說相似度最高,所以一般這兩本小說與用戶手頭上這本小說的風格、類型會基本一致,所以,一般用戶同樣會對這兩本小說感興趣。5、對於其他用戶,我們同樣可以採用1-4的方式給其推薦相似度高的小說。
此時我們以小說站點為例講解了用文本挖掘技術實現個性化推薦的思路,我們可以看到,關鍵點在於文本相似度的計算,其他站點的實現思路也可以參照該思路進行。核心步驟
現在我們已經明確了個性化推薦需求的實現思路,接下來我們整理一下實現的核心步驟。
我們可以採用以下步驟進行(以小說站點為例,其他站點類似):
1、讀取站點中所有小說數據 2、對要計算的多本小說數據分別進行分詞 3、對要計算的多本小說數據分別整理成指定格式,方便後續進行計算 4、計算出詞語的頻率 5、(可選)過濾掉頻率低的詞語 6、通過語料庫建立詞典7、讀取用戶當前關注的小說的數據
8、將用戶當前關注的小說的數據通過doc2bow轉化為稀疏向量 9、對稀疏向量進行進一步處理,得到新語料庫 10、將新語料庫通過tfidfmodel進行處理,得到tfidf 11、通過token2id得到特徵數 12、稀疏矩陣相似度計算,從而建立索引 13、分別得到用戶當前關注的小說與小說庫中各小說的相似度結果 14、提取出相似度高的小說,推薦給該用戶實現過程
上面我們已經講解了實踐的核心步驟,接下來我們進行具體的實現,在此採用的開發語言是Python,需要的第三方庫有:jieba、gensim,需要提前使用pip安裝好,如下:
pip install jiebapip install genism
首先我們假設一下情景(為了保證前後一致,同樣以小說站點為例,其他類型站點參考即可),假如現在我們的伺服器中有3本小說,分別是盜墓筆記(伺服器中文件名為dmbj.html)、老九門(伺服器中文件名為ljm.html)、鬼吹燈(伺服器中文件名為gcd.html),現在讀者正在看盜墓筆記,需要我們從老九門與鬼吹燈中(加入小說庫中小說更多,計算方法也是一樣的)推薦一本相似度高的小說給讀者。
首先,我們需要讀取站點中除讀者當前正在閱讀的這本小說之外的所有小說數據(當然也可以把讀者正在閱讀的這本小說讀取一下,只不過這樣的話後面的結果需要去除相似度為1的小說數據),如下所示:
import urllib.request#讀取老九門這本小說d1=urllib.request.urlopen("http://127.0.0.1/ljm.html").read().decode("utf-8","ignore")#讀取鬼吹燈這本小說d2=urllib.request.urlopen("http://127.0.0.1/gcd.html").read().decode("utf-8","ignore")
讀取了小說數據之後,接下來我們需要對要計算的多本小說數據分別進行分詞,在這裡,我們會使用jieba庫進行分詞處理,如下所示:
import jiebadata1=jieba.cut(d1)data2=jieba.cut(d2)
分詞之後,我們需要對要計算的多本小說數據分別整理成指定格式,方便後續進行計算,如下所示:
data11=""for item in data1: data11+=item+" "data21=""for item in data2: data21+=item+" "docs=[data11,data21]
隨後,我們需要計算出各詞語的頻數,如下所示:
tall=[[w1 for w1 in doc.split()]for doc in docs]from collections import defaultdictfrequency=defaultdict(int)for text in tall:for token in text: frequency[token]+=1
統計出頻數之後,我們可以過濾掉頻率低的詞語,當然這是在詞語很多的情況下,如果本來就詞語量有限,比如小說的內容非常少,那麼此時我們就不需要過濾了。也就是說,是否需要過濾,主要取決於詞語量的大小,若詞語量大,連過濾之後分析效率會更高,若詞語量過小,顯然不應該再過濾,否則過濾之後的詞語就更少了。具體過濾的方式如下,由於這幾本小說的詞語量很大,所以頻數在25以下的詞語我們都過濾掉了:
tall=[[token for token in text if frequency[token]>25]for text in tall]
進行了詞語的過濾之後,我們需要通過語料庫建立詞典,具體如下所示:
dictionary=corpora.Dictionary(tall)
接下來,我們需要讀取用戶當前關注的小說的數據,由於剛才我們假設的情景中,用戶正在讀盜墓筆記這本小說,所以此時我們需要載入盜墓筆記這本小說的數據,具體如下所示:
thisnoveldata=urllib.request.urlopen("http://127.0.0.1/dmbj.html").read().decode("utf-8","ignore")data3=jieba.cut(thisnoveldata)data31=""for item in data3: data31+=item+" "this_novel=data31
讀取了用戶當前關注的小說數據之後,我們可以將用戶當前關注的小說的數據通過doc2bow轉化為稀疏向量,具體如下所示:
new_vec=dictionary.doc2bow(this_novel.split())
隨後,我們可以對稀疏向量進行進一步處理,得到新語料庫,如下所示:
corpus=[dictionary.doc2bow(text) for text in tall]
得到新語料庫之後,我們可以將新語料庫通過tfidfmodel進行處理,得到tfidf:
tfidf=models.TfidfModel(corpus)
然後,可以通過token2id得到特徵數,如下所示:
num=len(dictionary.token2id.keys())
得到特徵數之後,通過SparseMatrixSimilarity進行稀疏矩陣相似度計算,從而建立索引:
index = similarities.SparseMatrixSimilarity(tfidf[corpus], num_features=num)
接下來,我們分別得到用戶當前關注的小說與小說庫中各小說的相似度結果:
sim=index[tfidf[new_vec]]
此時,sim中就包含了對應的相似度計算結果,我們可以通過print(sim) 將該結果列印出來,得到的結果如下所示:
================= RESTART: D:我的教學Python dmbj.py =================Warning (from warnings module):File "D:Python35libsite-packagesgensimutils.py", line 840 warnings.warn("detected Windows; aliasing chunkize to chunkize_serial")UserWarning: detected Windows; aliasing chunkize to chunkize_serialWarning (from warnings module):File "D:Python35libsite-packagesgensimutils.py", line 1015 warnings.warn("Pattern library is not installed, lemmatization won"t be available.")UserWarning: Pattern library is not installed, lemmatization won"t be available.Building prefix dict from the default dictionary ...Loading model from cache C:UsersmeAppDataLocalTempjieba.cacheLoading model cost 0.823 seconds.Prefix dict has been built succesfully.[ 0.12281458 0.36768654]
可以看到,此時盜墓筆記跟老九門的相似度為0.12,鬼吹燈的相似度為0.37。
最後,我們可以提取出相似度高的小說,推薦給該用戶,顯然此時我們會將鬼吹燈這本小說推送給當前的讀者。寫在後面的話
在這篇文章中,我們以小說站點為例對個性化推薦進行了細緻的講解,其他類型的站點也可以參照這種方法來實現個性化推薦,比如新聞網站可以計算站點所有新聞用戶當前花較長時間閱讀的新聞的相似度,從而進行個性化推薦。
在電商網站或視頻網站中,如果要採用這種方式實現個性化推薦,由於文本資料比較缺乏,所以此時我們可以將對應視頻或者對應商品的評論信息或描述信息作為文本資料進行計算,方可解決文本資料缺乏的問題。
同時,這篇文章中只是給出了個性化推薦的其中一種解決方案,實現個性化推薦還有多種多樣的方案,在此,希望能夠拋磚引玉,讓大家對個性化推薦問題有一個較好的思考。
作者新書推薦
《精通Python網路爬蟲》,機械工業出版社2017年4月出版,已經全倉到貨。
本書從技術、工具與實戰3個維度講解了Python網路爬蟲:
技術維度:詳細講解了Python網路爬蟲實現的核心技術,包括網路爬蟲的工作原理、如何用urllib庫編寫網路爬蟲、爬蟲的異常處理、正則表達式、爬蟲中Cookie的使用、爬蟲的瀏覽器偽裝技術、定向爬取技術、反爬蟲技術,以及如何自己動手編寫網路爬蟲;
工具維度:以流行的Python網路爬蟲框架Scrapy為對象,詳細講解了Scrapy的功能使用、高級技巧、架構設計、實現原理,以及如何通過Scrapy來更便捷、高效地編寫網路爬蟲;
實戰維度:以實戰為導向,是本書的主旨,除了完全通過手動編程實現網路爬蟲和通過Scrapy框架實現網路爬蟲的實戰案例以外,本書還有博客爬取、圖片爬取、模擬登錄等多個綜合性的網路爬蟲實踐案例。
作者在Python領域有非常深厚的積累,不僅精通Python網路爬蟲,在Python機器學習、Python數據分析與挖掘、Python Web開發等多個領域都有豐富的實戰經驗。
京東正版購買入口(推薦):點擊進入
======================================================================
作者:韋瑋
博客:韋瑋
推薦閱讀:
※Python黑帽編程 3.4 跨越VLAN
※【記錄】Python批量修改文件名
※Python騷操作 | 用python爆破某會員網站
※通過聚類分析吃雞亞洲,北美,歐洲前百名玩家的行為