接着上次的【windows下CRF++的安裝與使用】。
得到了一個CRF模型檔案:4_model.txt
檔案中的大緻内容:
version: 100
cost-factor: 1
maxid: 1000212
xsize: 1
B
E
M
S
U00:%x[-1,0]
U01:%x[0,0]
U02:%x[1,0]
U03:%x[-1,0]/%x[0,0]
U04:%x[0,0]/%x[1,0]
U05:%x[-1,0]/%x[1,0]
B
0 B
16 U00:_B-1
20 U00:±
24 U00:·
28 U00:—
32 U00:…
36 U00:℃
40 U00:Ⅱ
44 U00:○
48 U00:一
52 U00:丁
56 U00:七
60 U00:萬
64 U00:丈
68 U00:三
72 U00:上
76 U00:下
80 U00:不
84 U00:與
88 U00:醜
92 U00:專
96 U00:且
100 U00:世
104 U00:丘
108 U00:丙
112 U00:業
116 U00:叢
120 U00:東
124 U00:絲
……
879904 U05:點/持
879908 U05:點/新
879912 U05:點/方
879916 U05:點/時
879920 U05:點/是
879924 U05:點/有
879928 U05:點/查
879932 U05:點/标
879936 U05:點/校
879940 U05:點/滴
879944 U05:點/點
879948 U05:點/物
879952 U05:點/生
879956 U05:點/用
879960 U05:點/的
……
999360 U05:8/和
999364 U05:8/國
999368 U05:8/在
999372 U05:8/實
999376 U05:8/宣
999380 U05:8/對
999384 U05:8/将
999388 U05:8/年
999392 U05:8/廣
999396 U05:8/底
999400 U05:8/開
……
1000188 U05:r/o
1000192 U05:s/o
1000196 U05:s/t
1000200 U05:t/_B+1
1000204 U05:t/r
1000208 U05:v/r
-
6.9686606396030255
5.9844827873959154
-
4.4185688865372637
-
-
4.7936848979753899
-
5.3435599245402976
4.9866536107248614
-
3.6863946819974251
-
-
5.0938604828406104
……
-.0854856428715045
0.2216443338134583
-.87407772868
-.8125836646
-.92046486542575
0.1337969064644119
-.886
-.9742785
-.8799763
-.828136905
0.0017908016679605
-.
-.0977943428724233
0.2306923414979798
-.923392592181
-.896745179
-.9497355857
0.1053652143241086
-.9139654
依次說明
檔案頭:
version: 100
cost-factor: 1
maxid: 1000212
xsize: 1
說明了模型的版本,通過-c參數指定的cost-factor,特征函數的最大id,xsize是特征維數,也就是訓練語料列數-1。
值得注意的是maxid比我們從文本中觀察到的最大id(maxid)大了4,這是為什麼呢?且聽下文分解。
标簽
B
E
M
S
也就是最終的輸出。
模闆
U00:%x[-,]
U01:%x[,]
U02:%x[,]
U03:%x[-,]/%x[,]
U04:%x[,]/%x[,]
U05:%x[-,]/%x[,]
B
特征函數
B
U00:_B-
U00:±
U00:·
U00:—
U00:…
U00:℃
U00:Ⅱ
U00:○
U00:一
U00:丁
U00:七
U00:萬
U00:丈
U00:三
U00:上
U00:下
U00:不
U00:與
U00:醜
U00:專
U00:且
U00:世
U00:丘
U00:丙
U00:業
U00:叢
U00:東
U00:絲
……
U05:點/持
U05:點/新
U05:點/方
U05:點/時
U05:點/是
U05:點/有
U05:點/查
U05:點/标
U05:點/校
U05:點/滴
U05:點/點
U05:點/物
U05:點/生
U05:點/用
U05:點/的
……
U05:8/和
U05:8/國
U05:8/在
U05:8/實
U05:8/宣
U05:8/對
U05:8/将
U05:8/年
U05:8/廣
U05:8/底
U05:8/開
……
U05:r/o
U05:s/o
U05:s/t
U05:t/_B+
U05:t/r
U05:v/r
按照[id] [參數o]的格式排列,你可能會奇怪,f(s, o)應該接受兩個參數才對。其實s隐藏起來了,注意到id不是連續的,而是隔了四個,這表示這四個标簽(s=b|m|e|s)和公共的參數o組合成了四個特征函數。特别的,0-15為BEMS轉移到BEMS的轉移函數,也就是f(s’, s, o=null)。
值得注意的是,_B-1表示句子第一個單詞前面的一個單詞,_B+1表示末尾後面的一個單詞,你可以在最大熵的模型中找到類似的邏輯處理,依次類推。
特征函數權值
後面的小數依id順序對應每個特征函數的權值。
-
6.9686606396030255
5.9844827873959154
-
4.4185688865372637
-
-
4.7936848979753899
-
5.3435599245402976
4.9866536107248614
-
3.6863946819974251
-
-
5.0938604828406104
……
-.0854856428715045
0.2216443338134583
-.87407772868
-.8125836646
-.92046486542575
0.1337969064644119
-.886
-.9742785
-.8799763
-.828136905
0.0017908016679605
-.
-.0977943428724233
0.2306923414979798
-.923392592181
-.896745179
-.9497355857
0.1053652143241086
-.9139654
關于解碼
嚴格來講,解碼并不屬于本文的範圍,但是不說說解碼的話,對特征函數權值的了解就僅僅限于“浮點數”這一表面。是以簡要地說說解碼,比如說我們有一個句子“商品和服務”,對于每個字都按照上述模闆生成一系列U特征函數的參數代入,得到一些類似010101的函數傳回值,乘上這些函數的權值求和,就得到了各個标簽的分數,由大到小代表輸出這些标簽的可能性。
至于B特征函數(這裡特指簡單的f(s’, s)),在Viterbi後向解碼的時候,前一個标簽确定了後就可以代入目前的B特征函數,計算出每個輸出标簽的分數,再次求和排序即可。
參考:
http://www.hankcs.com/nlp/the-crf-model-format-description.html