0.前言
-
作業系統:Windows 64
-
開發工具:pycharm
-
全部程式碼以及使用材料下載
下載地址
1.使用jieba對中文進行分詞
1.1 測試文字
本次實驗的評論comment2中的內容為:
使用了一週多才來評價 優化過後開機10秒左右 執行不卡頓 螢幕清晰無漏光 巧克力鍵盤觸感非常不錯 音質也很好 外觀漂亮 質量輕巧 尤其值得稱讚的是其散熱系統 我玩LOL三四個小時完全沒有發燙 暫時沒有發現什麼缺點 如果有光碟機就更好了 值得入手 值得入手 值得入手~ 不枉費我浪費了12期免息券加首單減免*的優惠最後換了這臺適合辦公的 之前是買的惠普的暗夜精靈 玩遊戲超棒的
1.2 分詞程式碼
with open(`./comment2.txt`) as f:
tmp_line = f.read()
tmp_line_decode = tmp_line.decode(`GBK`)
jieba_cut = jieba.cut(tmp_line_decode)
ans = `/`.join(jieba_cut)
ans = ans.encode(`utf-8`)
with open(`./comment5_forward_slash.txt`, `w`) as f2:
f2.write(ans)
程式碼解析:
-
第4行主要是編碼問題,本機使用的是windows環境,預設編碼是GBK,而python裡面都是用的unicode來處理字元,因此要先從GBK解碼成unicode。
-
第5行就是結巴的分詞函式,
jieba.cut
這個函式返回的是一個生成器(Generator)物件,迭代一次之後裡面的內容就消失了。 -
第6行主要是把分詞過後產生的生成器拼成一個新的字串,並且通過/來進行分割詞,這裡使用/來分割詞語僅僅是為了展示分詞效果,真正要和nltk聯合使用的使用要改成
ans=` `.join(jieba_cut)
,即用空格連線,因為英文預設是通過空格來分詞的,因此nltk也是通過空格來讀取分詞。 -
第8行就是將拼接好的unicode字串拼接成utf-8,方便python以外的程式識別
1.3 分詞結果
通過這段程式碼分割之後,生成的comment5的內容:
使用/了/一週/多才/來/評價/ /優化/過後/開機/10/秒左右/ /執行/不卡頓/ /螢幕/清晰/無/漏光/ /巧克力/鍵盤/觸感/非常/不錯/ /音質/也/很/好/ /外觀/漂亮/ /質量/輕巧/ /尤其/值得稱讚/的/是/其/散熱/系統/ /我/玩/LOL/三四個/小時/完全/沒有/發燙/ /暫時/沒有/發現/什麼/缺點/ /如果/有/光碟機/就/更好/了/ /值得/入手/ /值得/入手/ /值得/入手/~/ /不/枉費/我/浪費/了/12/期/免息/券加/首單/減免/*/的/優惠/最後/換/了/這臺/適合/辦公/的/ /之前/是/買/的/惠普/的/暗夜精靈/ /玩遊戲/超棒/的
前後對比:
使用了一週多才來評價 優化過後開機10秒左右 執行不卡頓 螢幕清晰無漏光 巧克力鍵盤觸感非常不錯 音質也很好 外觀漂亮 質量輕巧 尤其值得稱讚的是其散熱系統 我玩LOL三四個小時完全沒有發燙 暫時沒有發現什麼缺點 如果有光碟機就更好了 值得入手 值得入手 值得入手~ 不枉費我浪費了12期免息券加首單減免*的優惠最後換了這臺適合辦公的 之前是買的惠普的暗夜精靈 玩遊戲超棒的
使用/了/一週/多才/來/評價/ /優化/過後/開機/10/秒左右/ /執行/不卡頓/ /螢幕/清晰/無/漏光/ /巧克力/鍵盤/觸感/非常/不錯/ /音質/也/很/好/ /外觀/漂亮/ /質量/輕巧/ /尤其/值得稱讚/的/是/其/散熱/系統/ /我/玩/LOL/三四個/小時/完全/沒有/發燙/ /暫時/沒有/發現/什麼/缺點/ /如果/有/光碟機/就/更好/了/ /值得/入手/ /值得/入手/ /值得/入手/~/ /不/枉費/我/浪費/了/12/期/免息/券加/首單/減免/*/的/優惠/最後/換/了/這臺/適合/辦公/的/ /之前/是/買/的/惠普/的/暗夜精靈/ /玩遊戲/超棒/的
我們可以看出,此評論已經被成功分詞。
2.nltk計算評論的TF_IDF值
2.1 測試文字
測試文字分為comment4和comment5,其內容如下:
comment4:
從 下單 到手 只用 了 3 個 多 小時 , 真快 啊 , 贊 一下 京東 的 配送 速度 , 機子 收到 是 原封 的 , 深圳 產 , 沒有 陰陽 屏 和 跑馬燈 , 還 不錯 , 三星 的 U , 但 不 糾結 , 也 沒有 感覺 有 多 費電 , 啟用 後 買 了 ac + , 可以 隨意 裸機 體驗 了 , 整體 來說 很 滿意
comment5:
使用 了 一週 多才 來 評價 優化 過後 開機 10 秒左右 執行 不卡頓 螢幕 清晰 無 漏光 巧克力 鍵盤 觸感 非常 不錯 音質 也 很 好 外觀 漂亮 質量 輕巧 尤其 值得稱讚 的 是 其 散熱 系統 我 玩 LOL 三四個 小時 完全 沒有 發燙 暫時 沒有 發現 什麼 缺點 如果 有 光碟機 就 更好 了 值得 入手 值得 入手 值得 入手 ~ 不 枉費 我 浪費 了 12 期 免息 券加 首單 減免 * 的 優惠 最後 換 了 這臺 適合 辦公 的 之前 是 買 的 惠普 的 暗夜精靈 玩遊戲 超棒 的
注意:以上內容均經過結巴分詞處理,且以空格為間隔進行分詞。
2.3 匯入及計算IF_IDF程式碼
corpus_root = `./`
allText = ``
allText = PlaintextCorpusReader(corpus_root, [`comment4.txt`, `comment5.txt`])
print type(allText)
sinica_text = nltk.Text(allText.words())
mytexts = TextCollection(allText)
print len(mytexts._texts)
print len(mytexts)
the_set = set(sinica_text)
print len(the_set)
for tmp in the_set:
print tmp, "tf", mytexts.tf(tmp, allText.raw([`comment4.txt`])), "idf", mytexts.idf(tmp), mytexts.tf_idf(tmp, allText.raw([`comment4.txt`]))
程式碼解析
-
第1行
corpus_root
是用來指明語料庫的地址,可用相對路徑或者絕對路徑,我這裡用的是相對路徑。 -
第5行
PlaintextCorpusReader(corpus_root, [`comment4.txt`, `comment5.txt`])
,其第一個引數是語料庫的路徑,第二個引數指的是該路徑下要加在檔案的檔名,既可以為[`comment4.txt`, `comment5.txt`]
的list格式,也可以使用萬用字元載入,如.*.txt
-
第9行
allText.words()
,用於返回所載入文件的所有詞彙 -
第11~15行
TextCollection
,用於返回一個文件集合,其中len(mytexts._texts)
表示裡面包含的文件個數,len(mytexts)
表示裡面包含的詞彙個數。 -
第17行通過
set(sinica_text)
來去除文件中重複的詞彙,從而形成詞彙表。 -
第18~20行,通過
tf
,idf
,tf_idf
函式來計算每個詞彙在語料庫以及對應文章中的值。其中allText.raw([`comment4.txt`])
用於返回對應文章的所有內容,用於計算tf和tf_idf值。
2.4 測試結果(部分)
不卡頓 tf 0.0 idf 0.69314718056 0.0
真快 tf 0.00584795321637 idf 0.69314718056 0.00405349228398
ac tf 0.00584795321637 idf 0.69314718056 0.00405349228398
了 tf 0.0175438596491 idf 0.0 0.0
很 tf 0.00584795321637 idf 0.0 0.0
注:python當中的log函式的底是以自然對數為基礎而nltk呼叫的就是基礎的log函式,因此計算結果可能會和一般的公式計算結果有區別