CRF++使用小结
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很容易混淆,因為通過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可能才能知道。
轉載于:https://www.cnblogs.com/pangxiaodong/archive/2011/11/21/2256264.html
總結
- 上一篇: 【原创】sharepoint webpa
- 下一篇: 十进制转换成N进制