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非常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


免責聲明!

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



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