操做系統:Windows 64python
開發工具:pycharmwindows
所有代碼以及使用材料下載
下載地址函數
本次實驗的評論comment2中的內容爲:工具
使用了一週多才來評價 優化事後開機10秒左右 運行不卡頓 屏幕清晰無漏光 巧克力鍵盤觸感很是不錯 音質也很好 外觀漂亮 質量輕巧 尤爲值得稱讚的是其散熱系統 我玩LOL三四個小時徹底沒有發燙 暫時沒有發現什麼缺點 若是有光驅就更好了 值得入手 值得入手 值得入手~ 不枉費我浪費了12期免息券加首單減免*的優惠最後換了這臺適合辦公的 以前是買的惠普的暗夜精靈 玩遊戲超棒的開發工具
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之外的程序識別code
經過這段代碼分割以後,生成的comment5的內容:
使用/了/一週/多才/來/評價/ /優化/事後/開機/10/秒左右/ /運行/不卡頓/ /屏幕/清晰/無/漏光/ /巧克力/鍵盤/觸感/很是/不錯/ /音質/也/很/好/ /外觀/漂亮/ /質量/輕巧/ /尤爲/值得稱讚/的/是/其/散熱/系統/ /我/玩/LOL/三四個/小時/徹底/沒有/發燙/ /暫時/沒有/發現/什麼/缺點/ /若是/有/光驅/就/更好/了/ /值得/入手/ /值得/入手/ /值得/入手/~/ /不/枉費/我/浪費/了/12/期/免息/券加/首單/減免/*/的/優惠/最後/換/了/這臺/適合/辦公/的/ /以前/是/買/的/惠普/的/暗夜精靈/ /玩遊戲/超棒/的
先後對比:
使用了一週多才來評價 優化事後開機10秒左右 運行不卡頓 屏幕清晰無漏光 巧克力鍵盤觸感很是不錯 音質也很好 外觀漂亮 質量輕巧 尤爲值得稱讚的是其散熱系統 我玩LOL三四個小時徹底沒有發燙 暫時沒有發現什麼缺點 若是有光驅就更好了 值得入手 值得入手 值得入手~ 不枉費我浪費了12期免息券加首單減免*的優惠最後換了這臺適合辦公的 以前是買的惠普的暗夜精靈 玩遊戲超棒的
使用/了/一週/多才/來/評價/ /優化/事後/開機/10/秒左右/ /運行/不卡頓/ /屏幕/清晰/無/漏光/ /巧克力/鍵盤/觸感/很是/不錯/ /音質/也/很/好/ /外觀/漂亮/ /質量/輕巧/ /尤爲/值得稱讚/的/是/其/散熱/系統/ /我/玩/LOL/三四個/小時/徹底/沒有/發燙/ /暫時/沒有/發現/什麼/缺點/ /若是/有/光驅/就/更好/了/ /值得/入手/ /值得/入手/ /值得/入手/~/ /不/枉費/我/浪費/了/12/期/免息/券加/首單/減免/*/的/優惠/最後/換/了/這臺/適合/辦公/的/ /以前/是/買/的/惠普/的/暗夜精靈/ /玩遊戲/超棒/的
咱們能夠看出,此評論已經被成功分詞。
測試文本分爲comment4和comment5,其內容以下:
comment4:
從 下單 到手 只用 了 3 個 多 小時 , 真快 啊 , 贊 一下 京東 的 配送 速度 , 機子 收到 是 原封 的 , 深圳 產 , 沒有 陰陽 屏 和 跑馬燈 , 還 不錯 , 三星 的 U , 但 不 糾結 , 也 沒有 感受 有 多 費電 , 激活 後 買 了 ac + , 能夠 隨意 裸機 體驗 了 , 總體 來講 很 滿意
comment5:
使用 了 一週 多才 來 評價 優化 事後 開機 10 秒左右 運行 不卡頓 屏幕 清晰 無 漏光 巧克力 鍵盤 觸感 很是 不錯 音質 也 很 好 外觀 漂亮 質量 輕巧 尤爲 值得稱讚 的 是 其 散熱 系統 我 玩 LOL 三四個 小時 徹底 沒有 發燙 暫時 沒有 發現 什麼 缺點 若是 有 光驅 就 更好 了 值得 入手 值得 入手 值得 入手 ~ 不 枉費 我 浪費 了 12 期 免息 券加 首單 減免 * 的 優惠 最後 換 了 這臺 適合 辦公 的 以前 是 買 的 惠普 的 暗夜精靈 玩遊戲 超棒 的
注意:以上內容均通過結巴分詞處理,且以空格爲間隔進行分詞。
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值。
不卡頓 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函數,所以計算結果可能會和通常的公式計算結果有區別