CRF++是著名的條件隨機場開源工具,也是目前綜合性能最佳的CRF工具。本文簡要介紹其使用方法。
一、工具包的下載:
a) http://crfpp.sourceforge.net
其中有兩種,一種是Linux下(帶源碼)的,一種是win32的,當然是在什么平台下用就下載什么版本了。
b) http://download.csdn.net/source/1425683
兩種版本打成一個包了。
二、安裝:
a) Windows版的無須安裝,直接解壓即可使用;
b) Linux版本的安裝方法是:
i. 解壓到某目錄下
ii. 打開控制台,將當前目錄切換到解壓目錄
iii. 依次輸入命令:
./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]
說明:
i. 其中#開頭的行不起作為,為注釋;
ii. 行與行之間可以有空行;
iii. 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 < <評測文件>