CRF++使用小结
1. 簡述
??? 最近要應用CRF模型,進行序列識別。選用了CRF++工具包,具體來說是在VS2008的C#環(huán)境下,使用CRF++的windows版本。本文總結(jié)一下了解到的和CRF++工具包相關(guān)的信息。
??? 參考資料是CRF++的官方網(wǎng)站:CRF++: Yet Another CRF toolkit,網(wǎng)上的很多關(guān)于CRF++的博文就是這篇文章的全部或者部分的翻譯,本文也翻譯了一些。
2. 工具包下載
??? 第一,版本選擇,當前最新版本是2010-05-16日更新的CRF++ 0.54版本,不過這個版本以前我用過一次好像運行的時候存在一些問題,網(wǎng)上一些人也說有問題,所以這里用的是2009-05-06: CRF++ 0.53版本。關(guān)于運行出錯的信息有http://ir.hit.edu.cn/bbs/viewthread.php?action=printable&tid=7945為證。
??? 第二,文件下載,這個主頁上面只有最新的0.54版本的文件,網(wǎng)上可以搜索,不過不是資源不是很多,我在CSDN上面下載了一個CRF++0.53版本的,包含linux和windows版本,其要花掉10個積分。因為,我沒有找到比較穩(wěn)定、長期、免費的鏈接,這里上傳一份這個文件:CRF++ 0.53 Linux和Windows版本。
3. 工具包文件
???
??? doc文件夾:就是官方主頁的內(nèi)容。
??? example文件夾:有四個任務的訓練數(shù)據(jù)、測試數(shù)據(jù)和模板文件。
??? sdk文件夾:CRF++的頭文件和靜態(tài)鏈接庫。
??? crf_learn.exe:CRF++的訓練程序。
??? crf_test.exe:CRF++的預測程序
??? libcrfpp.dll:訓練程序和預測程序需要使用的靜態(tài)鏈接庫。
??? 實際上,需要使用的就是crf_learn.exe,crf_test.exe和libcrfpp.dll,這三個文件。
4. 命令行格式
4.1 訓練程序
????命令行:
??? % crf_learn template_file train_file model_file
??? 這個訓練過程的時間、迭代次數(shù)等信息會輸出到控制臺上(感覺上是crf_learn程序的輸出信息到標準輸出流上了),如果想保存這些信息,我們可以將這些標準輸出流到文件上,命令格式如下:
??? % crf_learn template_file train_file model_file >> train_info_file
??? 有四個主要的參數(shù)可以調(diào)整:
????-a CRF-L2 or CRF-L1?????
????規(guī)范化算法選擇。默認是CRF-L2。一般來說L2算法效果要比L1算法稍微好一點,雖然L1算法中非零特征的數(shù)值要比L2中大幅度的小。
??? -c float
??? 這個參數(shù)設置CRF的hyper-parameter。c的數(shù)值越大,CRF擬合訓練數(shù)據(jù)的程度越高。這個參數(shù)可以調(diào)整過度擬合和不擬合之間的平衡度。這個參數(shù)可以通過交叉驗證等方法尋找較優(yōu)的參數(shù)。
??? -f NUM
????這個參數(shù)設置特征的cut-off threshold。CRF++使用訓練數(shù)據(jù)中至少NUM次出現(xiàn)的特征。默認值為1。當使用CRF++到大規(guī)模數(shù)據(jù)時,只出現(xiàn)一次的特征可能會有幾百萬,這個選項就會在這樣的情況下起到作用。
??? -p NUM
??? 如果電腦有多個CPU,那么那么可以通過多線程提升訓練速度。NUM是線程數(shù)量。
????帶兩個參數(shù)的命令行例子:
??? % crf_learn -f? 3 -c 1.5 template_file train_file model_file
4.2 測試程序?
???? 命令行:
?????% crf_test -m model_file test_files
???? 有兩個參數(shù)-v和-n都是顯示一些信息的,-v可以顯示預測標簽的概率值,-n可以顯示不同可能序列的概率值,對于準確率,召回率,運行效率,沒有影響,這里不說明了。
????? 與crf_learn類似,輸出的結(jié)果放到了標準輸出流上,而這個輸出結(jié)果是最重要的預測結(jié)果信息(測試文件的內(nèi)容+預測標注),同樣可以使用重定向,將結(jié)果保存下來,命令行如下。
????? % crf_test -m model_file test_files >> result_file
5. 文件格式
5.1 訓練文件
??? 下面是一個訓練文件的例子:
???
??? 訓練文件由若干個句子組成(可以理解為若干個訓練樣例),不同句子之間通過換行符分隔,上圖中顯示出的有兩個句子。每個句子可以有若干組標簽,最后一組標簽是標注,上圖中有三列,即第一列和第二列都是已知的數(shù)據(jù),第三列是要預測的標注,以上面例子為例是,根據(jù)第一列的詞語和和第二列的詞性,預測第三列的標注。
???當然這里有涉及到標注的問題,這個就是很多paper要研究的了,比如命名實體識別就有很多不同的標注集。這個超出本文范圍。
5.2 測試文件
??? 測試文件與訓練文件格式自然是一樣的,用過機器學習工具包的這個一般都理解吧。
?? ?與SVM不同,CRF++沒有單獨的結(jié)果文件,預測結(jié)果通過標準輸出流輸出了,因此前面4.2節(jié)的命令行中,將結(jié)果重定向到文件中了。結(jié)果文件比測試文件多了一列,即為預測的標簽,我們可以計算最后兩列,一列的標注的標簽,一列的預測的標簽,來得到標簽預測的準確率。
5.3 模板文件
5.3.1 模板基礎
??? 模板文件中的每一行是一個模板。每個模板都是由%x[row,col]來指定輸入數(shù)據(jù)中的一個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++會產(chǎn)生如下的一些特征函數(shù)集合(func1 ... funcN) 。
???
??? 這幾個函數(shù)我說明一下,%x[0,1]這個特征到前面的例子就是說,根據(jù)詞語(第1列)的詞性(第2列)來預測其標注(第3列),這些函數(shù)就是反應了訓練樣例的情況,func1反映了“訓練樣例中,詞性是DT且標注是B-NP的情況”,func2反映了“訓練樣例中,詞性是DT且標注是I-NP的情況”。
????模板函數(shù)的數(shù)量是L*N,其中L是標注集中類別數(shù)量,N是從模板中擴展處理的字符串種類。
??? Bigram template: first character, 'B'
??? 這個模板用來描述二元特征。這個模板會自動產(chǎn)生當前output token和前一個output token的合并。注意,這種類型的模板會產(chǎn)生L * L * N種不同的特征。
????Unigram feature?和 Bigram feature有什么區(qū)別呢??
????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. 樣例數(shù)據(jù)
??? example文件夾中有四個任務,basenp,chunking,JapaneseNE,seg。前兩個是英文數(shù)據(jù),后兩個是日文數(shù)據(jù)。第一個應該是命名實體識別,第二個應該是分詞,第三個應該是日文命名實體識別,第四個不清楚。這里主要跑了一下前兩個任務,后兩個是日文的搞不懂。
??? 根據(jù)任務下面的linux的腳步文件,我寫了個簡單的windows批處理(其中用重定向保存了信息),比如命名為exec.bat,跑了一下。批處理文件放在要跑的任務的路徑下就行,批處理文件內(nèi)容如下:
??? ..\..\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. 總結(jié)
??? 命令行(命令行格式,參數(shù),重定向)
??? 調(diào)參數(shù)(一般也就調(diào)訓練過程的c值)?
??? 標注集(這個很重要,研究相關(guān))
??? 模板文件(這個也很重要,研究相關(guān))
??? 模板文件的Unigram feature?和 Bigram feature,前面也說了,這里指的是output的一元/二元,這個應用的情況暫時還不是特別了解,還需要看一些paper可能才能知道。
轉(zhuǎn)載于:https://www.cnblogs.com/pangxiaodong/archive/2011/11/21/2256264.html
總結(jié)
- 上一篇: 【原创】sharepoint webpa
- 下一篇: 十进制转换成N进制