1. 程式人生 > >利用jieba進行中文分詞並進行詞頻統計

利用jieba進行中文分詞並進行詞頻統計

1.安裝jieba庫

在windows的Anaconda環境下如果沒有設定環境變數,則從Dos命令先進入...\Anaconda3\Scripts 目錄中,然後執行以下命令即可:

pip install jieba

2.分詞示例

我們先用一段文字來進行分詞並做詞頻統計:

央視網訊息:當地時間11日,美國國會參議院以88票對11票的結果通過了一項動議,允許國會“在總統以國家安全為由決定徵收關稅時”發揮一定的限制作用。這項動議主要針對加徵鋼鋁關稅的232調查,目前尚不具有約束力。動議的主要發起者——共和黨參議員鮑勃·科克說,11日的投票只是一小步,他會繼續推動進行有約束力的投票。

可以看到,這段文本當中還包含了很多標點符號和數字,顯然這不是我們想要的,所以在分詞的時候要去掉這些。

2.1 普通分詞模式

import jieba
import re
cut_words=[]
for line in open('./text1.txt',encoding='utf-8'):
    line.strip('\n')
    line = re.sub("[A-Za-z0-9\:\·\—\,\。\“ \”]", "", line)
    seg_list=jieba.cut(line,cut_all=False)
    cut_words.append(" ".join
(seg_list)) print(cut_words) >> 結果 ['央視網 訊息 當地 時間 日 美國國會參議院 以票 對票 的 結果 通過 了 一項 動議 允許 國會 在 總統 以 國家 安全 為 由 決定 徵收 關稅 時 發揮 一定 的 限制 作用 這項 動議 主要 針對 加徵 鋼鋁 關稅 的 調查 目前 尚 不 具有 約束力 動議 的 主要 發起者 共和黨 參議員 鮑勃 科克 說 日 的 投票 只是 一 小步 他會 繼續 推動 進行 有 約束力 的 投票']

2.1 全分詞模式

import jieba
import re
cut_words=[]
for
line in open('./text1.txt',encoding='utf-8'): line.strip('\n') line = re.sub("[A-Za-z0-9\:\·\—\,\。\“ \”]", "", line) seg_list=jieba.cut(line,cut_all=True) cut_words.append(" ".join(seg_list)) print(cut_words) >> 結果 ['央視 央視網 視網 訊息 當地 時間 日 美國 美國國會 美國國會參議院 國會 參議 參議院 議院 以 票 對 票 的 結果 通過 了 一項 動議 允許 許國 國會 在 總統 以 國家 家安 安全 為 由 決定 徵收 關稅 時 發揮 一定 的 限制 製作 作用 這項 動議 的 主要 發起 發起者 共和 共和黨 黨蔘 參議 參議員 議員 鮑 勃 科克 說 日 的 投票 只是 一小 小步 他 會 繼續 推動 進行 有 約束 約束力 的 投票']

3.詞頻統計

做詞頻統計需要用到另外一個包collection中的Counter計數器(如果沒有自行安裝,安裝方法同jieba一樣)。但是需要注意的是,像上面那樣分詞後的形式不能做詞頻統計,因為Counter是將list中的一個元素視為一個詞,所以在上面要略微修改。

import jieba
import re
from collections import Counter
cut_words=""
for line in open('./text1.txt',encoding='utf-8'):
    line.strip('\n')
    line = re.sub("[A-Za-z0-9\:\·\—\,\。\“ \”]", "", line)
    seg_list=jieba.cut(line,cut_all=False)
    cut_words+=(" ".join(seg_list))
all_words=cut_words.split()
print(all_words)
c=Counter()
for x in all_words:
    if len(x)>1 and x != '\r\n':
        c[x] += 1

print('\n詞頻統計結果:')
for (k,v) in c.most_common(2):# 輸出詞頻最高的前兩個詞
    print("%s:%d"%(k,v))


>> 結果

['央視網', '訊息', '當地', '時間', '日', '美國國會參議院', '以票', 
'對票', '的', '結果', '通過', '了', '一項', '動議', '允許', '國會',
 '在', '總統', '以', '國家', '安全', '為', '由', '決定', '徵收', 
 '主要', '針對', '加徵', '鋼鋁', '關稅', '的', '調查', '目前', '尚', 
 '參議員', '鮑勃', '科克', '說', '日', '的', '投票', '只是', '一', 
 '小步', '他會', '繼續', '推動', '進行', '有', '約束力', '的', '投票']

詞頻統計結果:
動議:3
關稅:2

4.新增自定義分詞規則

什麼叫新增自定義規則呢? 比如下面這個詞:“南京市”。

import jieba
jieba.load_userdict('../data/user_cut_dic.txt')
str = "南京市"
r = jieba.cut(str,cut_all=False)
temp = ' '.join(r)
print(temp)

jieba預設會將它看成一個整體。明顯這也是大多數情況下我們期望的結果,但真的就不會有“南京”和“市”這種分詞方式嗎?

jieba提供了兩種方式來解決:

第一種:匯入使用者自定義的分詞樣例(就像是自定義停用詞一樣)的本地檔案;
比如在此處,我在../data/user_cut_dic.txt中添加了如下樣例:

南京 999999999 

得到了如下結果:“南京 市”,其中後面的數字是傾向於這種分詞的權重(比重),中間用一個空格隔開。

第二種:在程式碼中新增分詞建議;

import jieba
jieba.suggest_freq(('南京',"市"), True)
str = "南京市"
r = jieba.cut(str,cut_all=False)
temp = ' '.join(r)
print(temp)