**:
英文版官網,使用手冊的感覺。
2,crf++-0.58.zip
doc資料夾為官網位址;example為給的4個例子。
實際需要的:crf_learn.exe;crf_test.exe;libcrfpp.dll三個檔案
可以先拿example中的某個例子,做一下測試。例如:example中chunking資料夾,其中原有4個檔案:exec.sh;template;test.data;train.data。
template為特徵模版;test.data為測試資料;train.data為訓練資料。關於它們具體格式和內容,待會詳細介紹。
可以選擇example裡的某個例子做測試,比如選chunking。將crf_learn.exe;crf_test.exe;libcrfpp.dll三個檔案複製到到,含有exec.sh;template;test.data;train.data的資料夾(chunking)裡。
cmdcd進入該資料夾
crf_learn template train.data model 訓練資料
crf_test -m model test.data > output.txt 測試資料
conlleval.pl < output.txt 評估效果
3,訓練
命令列:
% crf_learn template train.data model
這個訓練過程的時間、迭代次數等資訊會輸出到控制台上(感覺上是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,測試
命令列:
% crf_test -m model test.data
有兩個引數-v和-n都是顯示一些資訊的,-v可以顯示**標籤的概率值,-n可以顯示不同可能序列的概率值,對於準確率,召回率,執行效率,沒有影響,這裡不說明了。
與crf_learn類似,輸出的結果放到了標準輸出流上,而這個輸出結果是最重要的**結果資訊(測試檔案的內容+**標註),同樣可以使用重定向,將結果儲存下來,命令列如下。
% crf_test -m model_file test_files > result_file
5,評估
若訓練過程:% crf_test -m model test.data > output.txt
訓練的結果在output.txt裡。評估的就是這個檔案,即待**標籤與**標籤的對比。
%conlleval.pl < output.txt
.pl字尾為perl檔案,所以需要安裝perl
conlleval.pl為 將這個貼到txt,然後重新命名為conlleval。我當時這麼做的。
特別注意:output.txt在crf++輸出中空格為tab鍵,需要全部替換為真正空格鍵。conlleval.pl識別的是空格鍵。
6,train.data和test.data的格式
我做的實驗關於中文。
每行的格式為:分詞後的詞 詞性標註 標籤
中間是空格隔開;空行表示句子的邊界;分詞後的詞和詞性標註是nlpir(原ictclas)生成的結果;標籤o表示不是目標值,place表示目標值,若乙個詞被分開了,則b-palce為第乙個詞,i-place為接著的詞
一定要嚴格按格式要求來,否則會報錯。
另外,標籤不能全部一樣,否則會報這麼錯誤:
the line search routine mcsrch failed: error code:0
routine stops with unexpected error
crf_l2 execute error
下面是乙個訓練樣本的例子:
訓練檔案由若干個句子組成(可以理解為若干個訓練樣例),不同句子之間通過換行符分隔,上圖中顯示出的有兩個句子。每個句子可以有若干組標籤,最後一組標籤是標註,上圖中有三列,即第一列和第二列都是已知的資料,第三列是要**的標註,以上面例子為例是,根據第一列的詞語和和第二列的詞性,**第三列的標註。
7,template格式
a) 特徵選取的行是相對的,列是絕對的,一般選取相對行前後m行,選取n-1列(假設語料總共有n列),特徵表示方法為:%x[行,列],行列的初始位置都為0。例如:
i. 以前面語料為例
「 sw n
北 bns b-loc
京 mns i-loc
市 ens i-loc
首 bn n
假設當前行為「京」字這一行,那麼特徵可以這樣選取:
特徵模板
意義代表特徵
%x[-2,0]
-2行,0列
%x[-1,0]
-1行,0列
北%x[0,0]
0行,0列
京%x[1,0]
1行,0列
市%x[2,0]
2行,0列
首%x[-2,1]
-2行,1列
sw%x[-1,1]
-1行,1列
bns%x[0,1]
0行,1列
mns%x[1,1]
1行,1列
ens%x[2,1]
2行,1列
sw%x[-1,0]/%x[0,0]
-1行0列與0行0列的組合
北/京%x[0,0]/%x[1,0]
0行0列與1行0列的組合
京/市%x[-2,1]/%x[-1,1]
-2行1列與-1行1列的組合
sw/ bns
%x[-1,1]/%x[0,1]
-1行1列與0行1列的組合
bns/mns
%x[0,1]/%x[1,1]
0行1列與1行1列的組合
mns/ens
%x[1,1]/%x[2,1]
1行1列與2行1列的組合
ens/sw
%x[-2,1]/%x[-1,1]/%x[0,1]
-2行1列、-1行1列、0行1列的組合
sw/bns/mns
%x[-1,1]/%x[0,1]/%x[1,1]
-1行1列、0行1列、1行1列的組合
bns/mns/ens
%x[0,1]/%x[1,1]/%x[2,1]
0行1列、1行1列、2行1列的組合
mns/ens/sw
b) 模板製作:模板分為兩類:unigram和bigram。
其中unigram/bigram是指輸出token的unigram/bigrams,而不是特徵。
c) 以前面示例中的特徵為特徵,製作為unigram模板如下:
#unigram
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。後面的數字用於區分特徵,當然這些數字不是一定要連續。
參考:
CRF 的簡單使用
crf 是著名的條件隨機場開源工具,也是目前綜合性能最佳的crf工具。本文簡要介紹其使用方法。a b 兩種版本打成乙個包了。二 安裝 a windows版的無須安裝,直接解壓即可使用 b linux版本的安裝方法是 i.解壓到某目錄下 ii.開啟控制台,將當前目錄切換到解壓目錄 iii.依次輸入命令...
CRF原理和CRF 安裝與使用
普通的分類問題是把 x,y 看做乙個樣本,序列分類問題是把 x1,xt,y1,yt 整體看做乙個樣本。比如以前用 svm,輸入x輸出y是標量,表示類別 現在用crf,輸入x輸出y是個序列,表示不同位置 時刻的類別。通過訓練迭代出各個特徵函式的類別。crf通過迭代各特徵函式的權重使得對狀態序列的所有位...
CRF簡單理解總結
條件隨機場 conditional random fields,以下簡稱crf 是給定一組輸入隨機變數條件下另一組輸出隨機變數的條件概率分布模型,其特點是假設輸出隨機變數構成馬爾科夫隨機場。條件隨機場是一種判別式模型 crf的作用 簡單理解就是從可選的標註序列中,選擇最靠譜的乙個序列。比如一句話中有...