CRF++是著名的條件隨機場的開源工具,也是目前綜合性能最佳的CRF工具。在這裏咱們簡單介紹一下windows系統下CRF++的使用。算法
CRF 的工具備兩種,一種是支持Linux環境的,一種是支持Windows環境的,你們能夠自行根據本身的系統進行下載。
(在此我下載的是CRF++0.58)
安裝
在此先簡單說一下Linux環境下的安裝,後面咱們主要介紹Windows環境下的使用。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是線程數量。.net
舉一個帶參數的命令例子:
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 < <評測文件>