CRF++官方文檔


前言


  CRF++是著名的條件隨機場的開源工具,也是目前綜合性能最佳的CRF工具。在這里我們簡單介紹一下windows系統下CRF++的使用。

一、工具包的下載:


CRF 的工具有兩種,一種是支持Linux環境的,一種是支持Windows環境的,大家可以自行根據自己的系統進行下載。
(在此我下載的是CRF++0.58)
安裝
在此先簡單說一下Linux環境下的安裝,后面我們主要介紹Windows環境下的使用。

解壓到某一個目錄下面
打開控制台,切換到解壓目錄
依次輸入命令:
./configure
make
su
make install
注意:需要root權限才能成功安裝。
在Windows下的安裝很簡單,其實嚴格來講不能說是安裝。我們解壓我們下載的壓縮包文件到某一個目錄下面。你可能會得到如下所示的文件,(版本不同,可能會有所不同。)

 


doc文件夾:就是官方主頁的內容
example文件夾:有四個任務的訓練數據(test.data)、測試數據(train.data)和模板文件(template),還有一個執行腳本文件exec.sh。
sdk文件夾:CRF++的頭文件和靜態鏈接庫。
clr_learn.exe:CRF++的訓練程序
crl_test.exe:CRF++的測試程序
libcrffpp.dll:訓練程序和測試程序需要使用的靜態鏈接庫。
實際上,需要使用的就是crf_learn.exe,crf_test.exe和libcrfpp.dll,這三個文件。


二.一個小例子


訓練過程
  為了讓大家盡快練練手,看到結果,我們先拿example中的某個例子做一下測試。例如:example中chunking文件夾,其中原有4個文件:exec.sh;template;test.data;train.data。將crf_learn.exe;crf_test.exe;libcrfpp.dll三個文件復制到這個文件夾(chunking)底下。
  在命令窗口中,cd到該文件夾,然后輸入以下命令進行訓練模型。
  crf_learn template_file train_file model_file
  eg:crf_learn template train.data model
  你可以看到控制台上打印處的信息,並會產生一個新的文件:model。這個訓練過程的時間、迭代次數等信息就會輸出到控制台上(感覺是crf_learn程序的輸出信息到標准輸出流上了),如果想要保存這些信息,我們可以將這些標准輸出流到文件,命令格式為:
crf_learn template_file train_file model_file >> train_info_file
eg:crf_learn template train.data model >> model_out.txt

在這里有四個參數可以調整:
-a CRF-L2 or CRF-L1
規范化算法的選擇。默認是CRF-L2。一般來說L2算法效果要比L1算法稍微好一點,雖然L1算法中非零特征的數值要比L2中大幅度的小。

-c float
這個參數設置CRF的hyper-parameter。c的數值越大,CRF擬合訓練數據的程度越高。這個參數可以調整過擬合和不擬合之間的平衡度。這個參數可以通過交叉驗證等方法尋找較優的參數。

-f NUM
這個參數設置特征的cut-off threshold。CRF++使用訓練數據中至少出現NUM次的特征。默認值為1。當使用CRF++到大規模數據的時候,只出現一次的特征可能會有百萬個,這個選項就會在這樣的情況下起作用了。

-p NUM
如果電腦有多個CPU ,那么可以通過多線程提升訓練速度。NUM是線程數量。

舉一個帶參數的命令例子:
clr_learn -f 3 -c 1.5 tempalte train.data model##過濾掉了頻數低於3的特征,並且設超參數為1.5

測試過程
輸入命令進行測試數據,測試程序的命令為:
crf_test -m model_file test_file
eg: crf_test -m model test.data
同樣,與crf_learn類似,輸出的結果放到了標准輸出流上,而這個輸出結果是最重要的預測結果信息(預測文件的內容+預測標注),同樣可以使用重定向,將結果保存下來,命令為:
crf_test -m model_file test_files >> result_file
eg:crf_test -m model test.data >> output.txt
你會發現生成一個新的文件output.txt,就是我們的測試結果。

在這里的參數有兩個-v 和-n,都是用來顯示一些信息的。-v 可以用來預測標簽概率值, -n可以顯示不同可能序列的概率值。對於准確率、召回率、運行效率,沒有影響。
做到這里,心里應該有一絲小興奮吧,畢竟看到了點東西嘛。

 三、訓練語料格式


訓練語料至少應該具有兩列,列間由空格或者制表位間隔,且所有行(空行除外)必須具有相同的列數。句子間使用空行間隔。
示例:

有兩列特征的:

太 Sd N
短 Sa N
而 Bu N
已 Eu N
。 Sw N

以 Sp N
家 Bn N
鄉 En N
的 Su N

只有一列特征的:
太 N
短 N
而 N
已 N
。 N

以 N
家 N
鄉 N
的 N

特征選取及模板的編寫
特征選取的行是相對的,列數絕對的,一般選取相對行前后m行,選取n-1列(假設語料總共有n列),特征表示方法為:%x[行,列],行列的初始位置都為0。
例如:
“ Sw N
北 Bns B-LOC
京 Mns I-LOC
市 Ens I-LOC
首 Bn N
假設當前行為“京”字這一行,那么特征可以這樣選取:


模板分為兩類:Unigram和Bigram。其中Unigram/Bigram是指輸出token的Unigram/Bigrams,而不是特征的。

以前面的示例中的特征為特征,制作模板如下:

Unigram類型 :每一行%x[#,#]生成一個CRFs中的點(state)函數:f(s,o),其中s為t時刻的標簽(output),o為t時刻的上下文。

Bigram類型:每一行%x[#,#]生成CRFs中的邊(Edge)函數:f(s’,s,o),其中s’為t-1時刻的標簽,也就是說,Bigram類型與Unigram類型大致相同,只是還要考慮到t-1時刻的標簽,如果直線一個B的話,默認生成f(s’,s).
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。后面的數字用於區分特征,當然這些數字不是一定要連續。

訓練方法
語料的訓練可以使用命令(在終端或DOS命令行中):crf_learn <模板> <訓練語料> <模板文件>。其中模板和訓練語料是需要事先准備好的,模板文件在訓練完成后生成。

注意:
1) 如果提示語料格式錯誤,則注意檢查語料的存儲編碼,有些編碼CRF++是會讀取錯誤的;
2)文件路徑要正確,如果文件沒在當前目錄,那么要使用絕對路徑。
1
2
3
訓練中一些參數的說明:

ter:迭代次數
terr:標記錯誤率
serr:句字錯誤率
obj:當前對象的值。當這個值收斂到一個確定值的時候,訓練完成
diff:與上一個對象值之間的相對差

六、解碼方法(測試)


可以使用命令:crf_test -m <模板文件> <測試文件1> <測試文件2> ……進行測試,這樣會在控制台上看到測試結果。
利用上面的命令進行測試,測試結果會直接輸出到屏幕上,如果你想讓測試結果保存到文件里,那么在此需要使用重定向,就是在上面命令后面加上一個開關“>保存文件”即可:crf_test -m <模板文件> <測試文件1> > <保存位置>。例如:crf_test -m model test.txt > result.txt


七 結果測評(本部分暫時是轉載,因為還沒進行實踐)


下載(注意需要先安裝perl):
i. http://download.csdn.net/source/1425687

使用它是用來評分,所以要求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值等。

使用評測工具前要將評測文件中的所有制表位轉換成空格,否則評測工具會出錯。

評測命令為:perl conlleval.pl < <評測文件>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM