jieba與nltk結合處理評論(一)

0.前言

  1. 操做系統:Windows 64python

  2. 開發工具:pycharmwindows

  3. 所有代碼以及使用材料下載
    下載地址函數

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)

代碼解析:測試

  1. 第4行主要是編碼問題,本機使用的是windows環境,默認編碼是GBK,而python裏面都是用的unicode來處理字符,所以要先從GBK解碼成unicode。優化

  2. 第5行就是結巴的分詞函數,jieba.cut這個函數返回的是一個生成器(Generator)對象,迭代一次以後裏面的內容就消失了。編碼

  3. 第6行主要是把分詞事後產生的生成器拼成一個新的字符串,而且經過/來進行分割詞,這裏使用/來分割詞語僅僅是爲了展現分詞效果,真正要和nltk聯合使用的使用要改爲ans=' '.join(jieba_cut),即用空格鏈接,由於英文默認是經過空格來分詞的,所以nltk也是經過空格來讀取分詞。操作系統

  4. 第8行就是將拼接好的unicode字符串拼接成utf-8,方便python之外的程序識別code

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. 第1行corpus_root是用來指明語料庫的地址,可用相對路徑或者絕對路徑,我這裏用的是相對路徑。

  2. 第5行PlaintextCorpusReader(corpus_root, ['comment4.txt', 'comment5.txt']),其第一個參數是語料庫的路徑,第二個參數指的是該路徑下要加在文件的文件名,既能夠爲['comment4.txt', 'comment5.txt']的list格式,也可使用通配符加載,如.*.txt

  3. 第9行allText.words(),用於返回所加載文檔的全部詞彙

  4. 第11~15行TextCollection,用於返回一個文檔集合,其中len(mytexts._texts)表示裏面包含的文檔個數,len(mytexts)表示裏面包含的詞彙個數。

  5. 第17行經過set(sinica_text)來去除文檔中重複的詞彙,從而造成詞彙表。

  6. 第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函數,所以計算結果可能會和通常的公式計算結果有區別

相關文章
相關標籤/搜索