1. 程式人生 > >自然語言處理的中文分詞方法

自然語言處理的中文分詞方法

中文分詞方法

平臺:win7,python,vs2010

1、CRF++

CRF++是著名的條件隨機場開源工具,也是目前綜合性能最佳的CRF工具。
一、工具包的下載:
其中有兩種,一種是Linux下(帶原始碼)的,一種是win32的,下載
http://download.csdn.net/source/1425683將這兩種版本打成一個包了。
二、安裝:
a) Windows版的無須安裝,直接解壓即可使用;
b) Linux版本的安裝方法是:
1) 解壓到某目錄下
2) 開啟控制檯,將當前目錄切換到解壓目錄
3)依次輸入命令:
./configure
make
su
make install
注:需要root許可權才能成功安裝。
三、訓練語料格式:
a) 訓練語料至少應具有兩列,列間由空格或製表位間隔,且所有行(空行除外)必須具有相同的列數。句子間使用空行間隔。
b) 一些合法的語料示例:
i. 有兩列特徵的
太 Sd N
短 Sa N
而 Bu N
已 Eu N
。 Sw N

以 Sp N
家 Bn N
鄉 En N
的 Su N
ii. 只有一列特徵的
太 N
短 N
而 N
已 N
。 N

以 N
家 N
鄉 N
的 N
四、特徵的選取及模板的編寫:
a) 特徵選取的行是相對的,列是絕對的,一般選取相對行前後m行,選取n-1列(假設語料總共有n列),特徵表示方法為:%x[行,列],行列的初始位置都為0。例如:
i. 以前面語料為例
“ Sw N
北 Bns B-LOC
京 Mns I-LOC
市 Ens I-LOC
首 Bn N
假設當前行為“京”字這一行,那麼特徵可以這樣選取:
特徵模板
意義
代表特徵
%x[-2,0]
-2行,0列

%x[-1,0]
-1行,0列

%x[0,0]
0行,0列

%x[1,0]
1行,0列

%x[2,0]
2行,0列

%x[-2,1]
-2行,1列
Sw
%x[-1,1]
-1行,1列
Bns
%x[0,1]
0行,1列
Mns
%x[1,1]
1行,1列
Ens
%x[2,1]
2行,1列
Sw
%x[-1,0]/%x[0,0]
-1行0列與0行0列的組合
北/京
%x[0,0]/%x[1,0]
0行0列與1行0列的組合
京/市
%x[-2,1]/%x[-1,1]
-2行1列與-1行1列的組合
Sw/ Bns
%x[-1,1]/%x[0,1]
-1行1列與0行1列的組合
Bns/Mns
%x[0,1]/%x[1,1]
0行1列與1行1列的組合
Mns/Ens
%x[1,1]/%x[2,1]
1行1列與2行1列的組合
Ens/Sw
%x[-2,1]/%x[-1,1]/%x[0,1]
-2行1列、-1行1列、0行1列的組合
Sw/Bns/Mns
%x[-1,1]/%x[0,1]/%x[1,1]
-1行1列、0行1列、1行1列的組合
Bns/Mns/Ens
%x[0,1]/%x[1,1]/%x[2,1]
0行1列、1行1列、2行1列的組合
Mns/Ens/Sw
b) 模板製作:模板分為兩類:Unigram和Bigram。
其中Unigram/Bigram是指輸出token的Unigram/Bigrams,而不是特徵。
c) 以前面示例中的特徵為特徵,製作為Unigram模板如下:

Unigram

U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-2,1]
U06:%x[-1,1]
U07:%x[0,1]
U08:%x[1,1]
U09:%x[2,1]
U10:%x[-1,0]/%x[0,0]
U11:%x[0,0]/%x[1,0]
U12:%x[-2,1]/%x[-1,1]
U13:%x[-1,1]/%x[0,1]
U14:%x[0,1]/%x[1,1]
U15:%x[1,1]/%x[2,1]
U16:%x[-2,1]/%x[-1,1]/%x[0,1]
U17:%x[-1,1]/%x[0,1]/%x[1,1]
U18:%x[0,1]/%x[1,1]/%x[2,1]
說明:
1) 其中#開頭的行不起作為,為註釋;
2) 行與行之間可以有空行;
3) Unigram的特徵前使用字母U,而Bigram的特徵前使用字母B。後面的數字用於區分特徵,當然這些數字不是一定要連續。
五、訓練方法
a) 語料的訓練可以使用命令(在終端或DOS命令列中):crf_learn <模板> <訓練語料> <模板檔案>
其中模板和訓練語料是需要事先準備好的,模板檔案在訓練完成後生成
注意:
1) 如果提示語料格式錯誤,則注意檢查語料的儲存編碼,有些編碼CRF++是會讀取錯誤的;
2) 檔案路徑要正確,如果檔案沒在當前目錄,那麼要使用絕對路徑。
b) 訓練中一些引數的說明:
ter:迭代次數
terr:標記錯誤率
serr:句字錯誤率
obj:當前物件的值。當這個值收斂到一個確定值的時候,訓練完成
diff:與上一個物件值之間的相對差
六、解碼方法
a) 可以使用crf_test -m <模板檔案> <測試檔案1> <測試檔案2> ……。
b) 結果會直接輸出到螢幕上面,如果想讓結果儲存到檔案中,那麼使用重定向,在上面命令後面加上一個開關“>”即可:crf_test -m <模板檔案> <測試檔案1> > <儲存位置>。例如:crf_test -m model test.txt > result.txt
七、評測工具CoNLL 2000的用法
a) 下載:
i.

http://download.csdn.net/source/1425687
ii. http://www.cnts.ua.ac.be/conll2000/chunking/output.html
b) 使用它是用來評分,所以要求crf_test一步使用的測試檔案中本身帶有答案,這樣解碼後生成的結果會在答案的後一列。比如原來為:
使 En N
、 Sw N
交 Bni B-ORG
通 Mni I-ORG
部 Eni I-ORG
部 Bn N
那麼解碼後變成:
使 En N N
、 Sw N N
交 Bni B-ORG B-ORG
通 Mni I-ORG I-ORG
部 Eni I-ORG I-ORG
部 Bn N N
CoNLL 2000將把最後一列與倒數第二列進行對比,統計出最後各類的正確率,召回率、F值等。
c) 使用評測工具前要將評測檔案中的所有制表位轉換成空格,否則評測工具會出錯。
d) 評測命令為:perl conlleval.pl < <評測檔案>

2、CRFsuite

python-crfsuite

Installation

pip install python-crfsuite

可以得到python下的CRFsuite模組
使用的時候直接

import python_crfsuite

3、結巴分詞

“結巴”中文分詞:做最好的Python中文分片語件 “Jieba”

支援三種分詞模式:

1)精確模式,試圖將句子最精確地切開,適合文字分析;
2)全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義;
3)搜尋引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於搜尋引擎分詞。
同樣支援繁體分詞

支援自定義詞典

Python 2.x 下的安裝
全自動安裝:easy_install jieba 或者 pip install jieba

通過import jieba 來引用

import jieba

不報錯,說明jieba元件安裝成功。

結巴採用的演算法:
基於Trie樹結構實現高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖(DAG),採用了動態規劃查詢最大概率路徑, 找出基於詞頻的最大切分組合對於未登入詞,採用了基於漢字成詞能力的HMM模型,使用了Viterbi演算法。

4.哈工大ltp平臺