使用文本挖掘實現站點個性化推薦

作者:韋瑋,重慶韜翔網絡科技有限公司(上海)董事長兼總經理,IT作家,CSDN社區專家。 
本文爲韋瑋原創文章,未經允許不得轉載,點此查看作者有關《Python數據分析與挖掘經典案例實戰》經驗分享。

技術背景

一條信息是否能夠讓用戶感興趣,主要取決於這條信息的內容是否是用戶關注的內容。而將用戶感興趣的信息推送給對應的用戶,可以更好地發揮該信息的價值,否則,不僅對應信息的價值無法有效發揮,甚至會引起用戶的情緒,因爲如果用戶對這條信息不感興趣,那麼這條信息對於該用戶來說就相當於垃圾信息。

現在關鍵的問題是,如何判斷出現有的信息中,哪些信息是用戶感興趣的信息,從而把這些用戶可能感興趣的信息推送給用戶,這樣對於用戶來說,可以獲取期望的內容,對於企業來說,這可以更好地獲取商業利益。

比如,我們在使用今日頭條的時候,你會發現推送過來的文章基本上都是我們感興趣的文章,這些文章都是個性化推薦過來的。其實,如果我們可以將這項技術更好的利用,這可以改變更多領域。

可以想象,如果小說站點採用個性化推薦技術,那麼當讀者在讀一本小說的時候,我們可以判斷該讀者的興趣,並從小說庫中選擇出讀者可能最感興趣的小說,並將篩選出來的小說推薦給該讀者,那麼此時,對於讀者和網站來說是雙贏的,比如就讀者而言,節省了小說篩選的成本,並且可以很方便地獲得自己感興趣的內容,就網站而言,將合適的內容推薦給合適的用戶,更有利於用戶的付費。除此之外,個性化推薦技術還可以應用到新聞站點、商城、視頻站點等等方面。 
在本篇文章中,我們將爲大家講解如何採用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 jieba
pip 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 jieba
data1=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 defaultdict
frequency=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:\Python35\lib\site-packages\gensim\utils.py", line 840
    warnings.warn("detected Windows; aliasing chunkize to chunkize_serial")
UserWarning: detected Windows; aliasing chunkize to chunkize_serial

Warning (from warnings module):
  File "D:\Python35\lib\site-packages\gensim\utils.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:\Users\me\AppData\Local\Temp\jieba.cache
Loading model cost 0.823 seconds.
Prefix dict has been built succesfully.
[ 0.12281458  0.36768654]

可以看到,此時盜墓筆記跟老九門的相似度爲0.12,鬼吹燈的相似度爲0.37。 
最後,我們可以提取出相似度高的小說,推薦給該用戶,顯然此時我們會將鬼吹燈這本小說推送給當前的讀者。

寫在後面的話

在這篇文章中,我們以小說站點爲例對個性化推薦進行了細緻的講解,其他類型的站點也可以參照這種方法來實現個性化推薦,比如新聞網站可以計算站點所有新聞用戶當前花較長時間閱讀的新聞的相似度,從而進行個性化推薦。

在電商網站或視頻網站中,如果要採用這種方式實現個性化推薦,由於文本資料比較缺乏,所以此時我們可以將對應視頻或者對應商品的評論信息或描述信息作爲文本資料進行計算,方可解決文本資料缺乏的問題。

同時,這篇文章中只是給出了個性化推薦的其中一種解決方案,實現個性化推薦還有多種多樣的方案,在此,希望能夠拋磚引玉,讓大家對個性化推薦問題有一個較好的思考。

點此查看作者有關《Python數據分析與挖掘經典案例實戰》經驗分享

圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章