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 < < 評測文件 >
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
