CRF++模板使用(轉)


CRF++模板構建分為兩類,一類是Unigram標注,一類是Bigram標注。 

Unigram和Bigram模板分別生成CRF的狀態特征函數 s_{l}(y_{i},x,i) 和轉移特征函數 t_{k}(y_{i-1},y_{i},x,i) 。其中 y_{i} 是標簽, x 是觀測序列, i 是當前節點位置。
Bigram 下面只需要加一個B就ok了,其它還是用Unigram模板生成特征。

主要介紹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,0]/%x[-1,0]/%x[0,0] 
U06:%x[-1,0]/%x[0,0]/%x[1,0] 
U07:%x[0,0]/%x[1,0]/%x[2,0] 
U08:%x[-1,0]/%x[0,0] 
U09:%x[0,0]/%x[1,0] 

 

特征模板格式:%x[row,col]。x可取U或B,對應兩種類型。方括號里的編號用於標定特征來源,row表示相對當前位置的行,0即是當前行col對應訓練文件中的列。這里只使用第1列(編號0),即文字。

Unigram template:第一個字符是U,這是用於描述unigram feature的模板。每一行%x[#,#]生成一個CRFs中的點(state)函數: f(s, o), 其中s為t時刻的的標簽(output),o為t時刻的上下文.


這是CRF++例子中給出的模板,一共有9個模板,先看第一個模板,表示當前詞和其前面的第二個詞組成的特征,U02表示當前詞

CRF++遍歷每一個位置時,會查看此位置前一個位置(-1,0)和前兩個位置(-2,0)和后一個位置(1,0)和后兩個位置(2,0),這是U00,U01,U02,U03,U04所規定的。至於后面幾個特征函數,比如U05,它把前面的幾個位置合起來看。

以‘小明今天穿了一件紅色上衣’為例,符合CRF++處理格式的這句話應該變成如下形式: 
小 B 
明 I 
今 B 
天 I 
穿 S 
了 S 
一 B 
件 I 
紅 B 
色 I 
上 B 
衣 I 

假設我們有三個標記tag,B(表示一個詞的開頭那個字),I(表示一個詞的結尾那個字),S(表示單個字的詞)。

先看第一個模板U00:%x[-2,0],第一個模板產生的特征如下: 
如果當前詞是‘今’那-2位置對應的字就是‘小’, 
每個特征對應的字如下: 


U00:%x[-2,0]=====>小 
U01:%x[-1,0]=====>明 
U02:%x[0,0]=====>今 
U03:%x[1,0]=====>天 
U04:%x[2,0]=====>穿 
U05:%x[-2,0]/%x[-1,0]/%x[0,0]=====>小/明/今 
U06:%x[-1,0]/%x[0,0]/%x[1,0]=====>明/今/天 
U07:%x[0,0]/%x[1,0]/%x[2,0]=====>今/天/穿 
U08:%x[-1,0]/%x[0,0]=====>明/今 
U09:%x[0,0]/%x[1,0]=====>今/天 


根據第一個模板U00:%x[-2,0]能得到的轉移特征函數如下: 
func1=if(output=B and feature=’U00:小‘ ) return 1 else return 0 

func2=if(output=I and feature=’U00:小’) return 1 else return 0 
func3=if(output=S and feature=’U00:小) return 1 else return 0 


其中output=B 指的是當前詞(字)的預測標記,也就是’今‘的預測標記,每個模板會把所有可能的標記輸出都列一遍,然后通過訓練確定每種標記的權重,合理的標記在訓練樣本中出現的次數多,對應的權重就高,不合理的標記在訓練樣本中出現的少,對應的權重就少。

得到三個特征函數之后當前這個字’‘的特征函數利用第一個模板就全了。然后掃描下一個字‘‘,以’天‘字作為當前字預測這個字的標記tag,同樣會得到三個特征函數: 
func4=if(output=B and feature=’U00:明’) return 1 else return 0 
func5=if(output=I and feature=’U00:明’) return 1 else return 0 
func6=if(output=S and feature=’U00:明’) return 1 else return 0 

后面U01~U09都會按此方式繼續掃描生成特征函數。

func = if(output = B,and feature = “U05:小/明/今”) return 1 else return 0 
即當前位置輸出標簽為B,並且當前位置為,前一個位置是,前兩個位置是,則輸出1。

不管以何種方式掃描或者生成模板,最終會生成N*T*M個特征函數,N代表分詞中詞的個數,T代表分詞標注的tag標簽(B,I,S等),M代表模板個數。

 

Bigram類型

與Unigram不同的是,Bigram類型模板生成的函數會多一個參數:上個節點的標簽 。

生成函數類似於:

func1 = if (prev_output = B and output = B and feature=B01:"北") return 1 else return 0
這樣,每行模板則會生成 L*L*N 個特征函數。經過訓練后,這些函數的權值反映了上一個節點的標簽對當前節點的影響。

 

參考鏈接https://www.cnblogs.com/pangxiaodong/archive/2011/11/21/2256264.html


免責聲明!

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



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