CRF++模板構建分為兩類,一類是Unigram標注,一類是Bigram標注。
Unigram和Bigram模板分別生成CRF的狀態特征函數 和轉移特征函數
。其中
是標簽,
是觀測序列,
是當前節點位置。
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