1. 程式人生 > >python資料分析與挖掘學習筆記(3)_小說文字資料探勘part1

python資料分析與挖掘學習筆記(3)_小說文字資料探勘part1

這一節主要是對小說文字資料的挖掘專案。
文字挖掘的一個重要的應用是進行站點的個性化推薦。將使用者感興趣的資訊推送給對應的使用者,可以更好地發揮該資訊的價值。比如,我們常常會在瀏覽網頁的時候看到相關的廣告是我們感興趣的,新聞推送的是我們感興趣的文章,閱讀小說推薦的是我們想看的小說,逛淘寶的時候也會發現有一部分猜你喜歡,推薦的是你多半感興趣的商品;網易雲音樂的每日推薦曲目也是根據使用者的聽歌記錄進行類似推薦的,等等。


這都是文字挖掘以及相關資訊挖掘的技術實現。文字挖掘是資料探勘技術的其中一種。文字挖掘是對現有的一些文字資訊進行分析,處理,從而提取出一些有價值的資訊供我們使用的一種技術。
進行個性化推薦的本質其實就是計算文字之間的相似度,推薦與使用者瀏覽資料最相似的內容作為推薦,能夠在最大程度上給使用者推薦起感興趣的內容。
實現的核心步驟為:
1、讀取文件
2、對要計算的多篇文件進行分詞
3、對文件進行整理成指定格式,方便後續進行計算
4、計算出詞語的頻率
5【可選】、對頻率低的詞語進行過濾
6、通過語料庫建立詞典
7、載入要對比的文件
8、將要對比的文件通過doc2bow轉化為稀疏向量
9、對稀疏向量進行進一步處理,得到新語料庫
10、將新語料庫通過tfidfmodel進行處理,得到tfidf
11、通過token2id得到特徵數
12、稀疏矩陣相似度,從而建立索引
13、得到最終相似度結果



要實現以上思路,我們需要用到python的中文分詞工具包jieba,它的處理思路簡單,主要思路如下:
1. 載入詞典dict.txt, 我們是可以在該詞典中新增詞語的;
2. 從記憶體的詞典中構建該句子的DAG(有向無環圖);
3. 對於詞典未收錄詞,使用HMM模型的viterbi演算法嘗試分詞處理;
4. 已收錄詞和未收錄詞全部分詞完畢後,使用dp尋找DAG的最大概率路徑;
5. 輸出分詞結果。
當時記得有人問到,有沒有英文分詞工具,這個貌似是沒有的,因為英文分詞就是靠空格分割,不需要專門分詞工具。


首先描述一下jieba的一些基本用法:

1. 全模式

sentence="我喜歡上海東方明珠"

w1=jieba.cut(sentence,cut_all=True)
for item in w1:
    print(item)
print("")
全模式,就是會將所有的分詞結果都輸出來,任何的詞語組合。

2. 精準模式

#精準模式
w2=jieba.cut(sentence,cut_all=False)
for item in w2:
    print(item)
print("")
精準模式,是根據詞語的權重分得的最為準確的分詞模式。


3. 搜尋引擎模式
w3=jieba.cut_for_search(sentence)
for item in w3:
    print(item)
print("")
搜尋引擎模式,是用於分詞之後的索引。


4. 預設模式

w4=jieba.cut(sentence)
for item in w4:
    print(item)
print("")

預設的不加引數的模式為精準模式。


jieba還可以標註詞語的詞性:

#詞性標註
import jieba.posseg
w5=jieba.posseg.cut(sentence)
#.flag詞性
#.word詞語
for item in w5:
    print(item.word+"----"+item.flag)
print("")


常用的一些符號及詞性的對應關係為:
a:形容詞
c:連詞
d:副詞
e:嘆詞
f:方位詞
i:成語
m:數詞
n:名詞
nr:人名
ns:地名
nt:機構團體
nz:其他專有名詞
p:介詞
r:代詞
t:時間
u:助詞
v:動詞
vn:名動詞
w:標點符號
un:未知詞語

5. 詞典載入

需要匯入jieba.posseg的包

import jieba.posseg
#詞典載入
jieba.load_userdict("/home/hadoop/jieba/jieba/dict.txt")
sentence2 = "上海交通大學是一個很好的學校"
w6 = jieba.posseg.cut(sentence2)
for item in w6:
    print(item.word+"----"+item.flag)
print("")


7. 提取關鍵字

需要匯入jieba.analyse的包

import jieba.analyse
sentence3="我喜歡上海東方明珠"
print("")
#提取關鍵詞
tag=jieba.analyse.extract_tags(sentence3, 3)
print(tag)
print("")


其中jieba.analyse.extract_tags(xx, num)中的num是指定提取的關鍵字的個數。

8. 返回詞語的位置

可以通過tokenize中設定mode來制定模式

#返回詞語的位置
w9=jieba.tokenize(sentence)
for item in w9:
    print(item)
print("")

w10 = jieba.tokenize(sentence, mode="search")
for item in w10:
    print(item)
print("")


在匯入一些中文的文件時,使用open(path).read()可能會出現編碼問題,因此有老師建議將文件轉為html,上傳到本地伺服器,使用urllib.request包來解決這個問題。

#編碼問題解決方案
#data=open("./fiction.txt","r",encoding='utf-8').read()
import urllib.request
data = urllib.request.urlopen("http://127.0.0.1/fiction.html").read().decode("utf-8", "ignore")
tag = jieba.analyse.extract_tags(data, 30)  #jieba.analyse.extract_tags(sentence, topK), topK的預設值為20
print(tag)
"""

好了。基礎部分差不多介紹到這裡,下面就是開始進行文字挖掘和相似度的計算。

部分內容引用自:https://segmentfault.com/a/1190000004061791