中文分詞方法
平台: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
https://travis-ci.org/tpeng/python-crfsuite.svg?branch=master
python-crfsuite is a python binding to CRFsuite.
Installation
pip install python-crfsuite
可以得到python下的CRFsuite子產品
使用的時候直接
import python_crfsuite
3、結巴分詞
https://github.com/fxsjy/jieba
“結巴”中文分詞:做最好的Python中文分詞元件 “Jieba”
支援三種分詞模式:
1)精确模式,試圖将句子最精确地切開,适合文本分析;
2)全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義;
3)搜尋引擎模式,在精确模式的基礎上,對長詞再次切分,提高召回率,适合用于搜尋引擎分詞。
同樣支援繁體分詞
支援自定義詞典
線上示範
http://jiebademo.ap01.aws.af.cm/
網站代碼:https://github.com/fxsjy/jiebademo
Python 2.x 下的安裝
全自動安裝:easy_install jieba 或者 pip install jieba
通過import jieba 來引用
import jieba
不報錯,說明jieba元件安裝成功。
結巴采用的算法:
基于Trie樹結構實作高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖(DAG),采用了動态規劃查找最大機率路徑, 找出基于詞頻的最大切分組合對于未登入詞,采用了基于漢字成詞能力的HMM模型,使用了Viterbi算法。
4.哈工大ltp平台
官方連結:
http://www.ltp-cloud.com/
具體使用方法可參考官網簡介
線上示範:
http://www.ltp-cloud.com/demo/