標籤:style blog http io os 使用 ar for strong
1. 簡述
近期要應用CRF模型,進行序列識別。選用了CRF++工具包,詳細來說是在VS2008的C#環境下,使用CRF++的windows版本號碼。本文總結一下瞭解到的和CRF++工具包相關的資訊。
參考資料是CRF++的官方網站:CRF++: Yet Another CRF toolkit,網上的非常多關於CRF++的博文就是這篇文章的所有或者部分的翻譯,本文也翻譯了一些。
2. 工具包下載
第一,版本號碼選擇,當前最新版本號碼是2010-05-16日更新的CRF++ 0.54版本號碼,只是這個版本號碼曾經我用過一次好像執行的時候存在一些問題,網上一些人也說有問題,所以這裡用的是2009-05-06: CRF++ 0.53版本號碼。關於執行出錯的資訊有http://ir.hit.edu.cn/bbs/viewthread.php?action=printable&tid=7945為證。
第二,檔案下載,這個首頁上面僅僅有最新的0.54版本號碼的檔案,網上能夠搜尋,只是不是資源不是非常多,我在CSDN上面下載了一個CRF++0.53版本號碼的,包括linux和windows版本號碼,其要花掉10個積分。由於,我沒有找到比較穩定、長期、免費的連結,這裡上傳一份這個檔案:CRF++ 0.53 Linux和Windows版本號碼。
3. 工具包檔案
doc目錄:就是官方首頁的內容。
example目錄:有四個任務的訓練資料、測試資料和模板檔案。
sdk目錄:CRF++的標頭檔和靜態連結庫。
crf_learn.exe:CRF++的訓練程式。
crf_test.exe:CRF++的預測程式
libcrfpp.dll:訓練程式和預測程式須要使用的靜態連結庫。
實際上,須要使用的就是crf_learn.exe,crf_test.exe和libcrfpp.dll,這三個檔案。
4. 命令列格式
4.1 訓練程式
命令列:
% crf_learn template_file train_file model_file
這個訓練過程的時間、迭代次數等資訊會輸出到控制台上(感覺上是crf_learn程式的輸出資訊到標準輸出資料流上了),假設想儲存這些資訊,我們能夠將這些標準輸出資料流到檔案上,命令格式例如以下:
% crf_learn template_file train_file model_file >> train_info_file
有四個基本的參數能夠調整:
-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是線程數量。
帶兩個參數的命令列範例:
% crf_learn -f 3 -c 1.5 template_file train_file model_file
4.2 測試程式
命令列:
% crf_test -m model_file test_files
有兩個參數-v和-n都是顯示一些資訊的,-v能夠顯示預測標籤的機率值,-n能夠顯示不同可能序列的機率值,對於準確率,召回率,執行效率,沒有影響,這裡不說明了。
與crf_learn類似,輸出的結果放到了標準輸出資料流上,而這個輸出結果是最重要的預測結果資訊(測試檔案的內容+預測標註),相同能夠使用重新導向,將結果儲存下來,命令列例如以下。
% crf_test -m model_file test_files >> result_file
5. 檔案格式
5.1 訓練檔案
以下是一個訓練檔案的範例:
訓練檔案由若干個句子組成(能夠理解為若干個訓練例子),不同句子之間通過分行符號分隔,中顯示出的有兩個句子。每一個句子能夠有若干組標籤,最後一組標籤是標註,中有三列,即第一列和第二列都是已知的資料,第三列是要預測的標註,以上面例子為例是,依據第一列的詞語和和第二列的詞性,預測第三列的標註。
當然這裡有涉及到標註的問題,這個就是非常多paper要研究的了,比方具名實體識別就有非常多不同的標註集。這個超出本文範圍。
5.2 測試檔案
測試檔案與訓練檔案格式自然是一樣的,用過機器學習工具包的這個一般都理解吧。
與SVM不同,CRF++沒有單獨的結果檔案,預測結果通過標準輸出資料流輸出了,因此前面4.2節的命令列中,將結果重新導向到檔案裡了。結果檔案比測試檔案多了一列,即為預測的標籤,我們能夠計算最後兩列,一列的標註的標籤,一列的預測的標籤,來得到標籤預測的準確率。
5.3 模板檔案
5.3.1 模板基礎
模板檔案裡的每一行是一個模板。每一個模板都是由%x[row,col]來指定輸入資料中的一個token。row指定到當前token的行位移,col指定列位置。
由可見,當前token是the這個單詞。%x[-2,1]就就是the的前兩行,1號列的元素(注意,列是從0號列開始的),即為PRP。
5.3.2 模板類型
有兩種類型的模板,模板類型通過第一個字元指定。
Unigram template: first character, ‘U‘
當給出一個"U01:%x[0,1]"的模板時,CRF++會產生例如以下的一些特徵函數集合(func1 ... funcN) 。
這幾個函數我說明一下,%x[0,1]這個特徵到前面的例子就是說,依據詞語(第1列)的詞性(第2列)來預測其標註(第3列),這些函數就是反應了訓練例子的情況,func1反映了“訓練例子中,詞性是DT且標註是B-NP的情況”,func2反映了“訓練例子中,詞性是DT且標註是I-NP的情況”。
模板函數的數量是L*N,當中L是標註集中類別數量,N是從模板中擴充處理的字串種類。
Bigram template: first character, ‘B‘
這個模板用來描寫敘述二元特徵。這個模板會自己主動產生當前output token和前一個output token的合并。注意,這樣的類型的模板會產生L * L * N種不同的特徵。
Unigram feature 和 Bigram feature有什麼差別呢?
unigram/bigram非常easy混淆,由於通過unigram-features也能夠寫出類似%x[-1,0]%x[0,0]這種單詞層級的bigram(二元特徵)。而這裡的unigram和bigram features指定是uni/bigrams的輸出標籤。
unigram: |output tag| x |all possible strings expanded with a macro|
bigram: |output tag| x |output tag| x |all possible strings expanded with a macro|
這裡的一元/二元指的就是輸出標籤的情況,這個詳細的範例我還沒看到,example目錄中四個範例,也都是僅僅用了Unigram,沒實用Bigarm,因此感覺一般Unigram feature就夠了。
5.3.3 模板範例
這是CoNLL 2000的Base-NP chunking任務的模板範例。僅僅使用了一個bigram template (‘B‘)。這意味著僅僅有前一個output token和當前token被當作bigram features。“#”開始的行是凝視,空行沒有意義。
6. 例子資料
example目錄中有四個任務,basenp,chunking,JapaneseNE,seg。前兩個是英文資料,後兩個是日文資料。第一個應該是具名實體識別,第二個應該是分詞,第三個應該是日文具名實體識別,第四個不清楚。這裡主要跑了一下前兩個任務,後兩個是日文的搞不懂。
依據任務以下的linux的腳步檔案,我寫了個簡單的windows批處理(當中用重新導向儲存了資訊),比方命名為exec.bat,跑了一下。批次檔放在要跑的任務的路徑下即可,批次檔內容例如以下:
..\..\crf_learn -c 10.0 template train.data model >> train-info.txt
..\..\crf_test -m model test.data >> test-info.txt
這裡簡單解釋一下批處理,批次檔執行後的當前檔案夾就是該批次檔所在的檔案夾(至少我的是這樣,假設不是,能夠使用cd %~dp0這句命令,~dp0表示了“當前盤符和路徑”),crf_learn和crf_test程式在當前檔案夾的前兩級檔案夾上,所以用了..\..\。
7. 總結
命令列(命令列格式,參數,重新導向)
調參數(一般也就調訓練過程的c值)
標註集(這個非常重要,研究相關)
模板檔案(這個也非常重要,研究相關)
模板檔案的Unigram feature 和 Bigram feature,前面也說了,這裡指的是output的一元/二元,這個應用的情況臨時還不是特別瞭解,還須要看一些paper可能才幹知道。
轉自:http://www.cnblogs.com/pangxiaodong/archive/2011/11/21/2256264.html
CRF++使用小結(轉)