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

MrZONT發表於2016-02-15

0.前言

  1. 作業系統:Windows 64

  2. 開發工具:pycharm

  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以外的程式識別

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函式,因此計算結果可能會和一般的公式計算結果有區別

相關文章