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
特別注意: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。後面的數字用於區分特徵,當然這些數字不是一定要連續。
conlleval CRF 的測試結果統計
crf 是乙個開源工具,是自然語言處理的一把利器。它可以編譯為 crf learn 和crf test兩個bin檔案。測試的效果是進行比對。可惜這東西比對完也不給個統計,真教人不爽。幸虧有人做了個perl工具 conlleval 說明文件見 這兒 txt文件,改名為 conlleval.pl 或者任...
類的使用,物件的使用
一 類的使用 class student school luffycity def eat self print yes defdrink self print drink 檢視print student.dict 增student.teacher gaohui print student.dict...
messagebox的使用(使用整理)
定義 messagebox顯示乙個模態對話方塊,其中包含乙個系統圖示 一組按鈕和乙個簡短的特定於應用程式訊息,如狀態或錯誤的資訊。訊息框中返回乙個整數值,該值指示使用者單擊了哪個按鈕。messagebox hwnd hwnd text,caption pchar type word hwnd 訊息框...