接着上次的【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