CRF++原理
训练文件&测试文件格式
文件中每一行中的每一列通过空格或者制表符\t分割,每一行为一个token,一个token对应一个词,每行中,除最后一列作为标注外,其他列作为特征。格式如下所示。
中 B
国 E
发 O
展 O
历 O
史 O
上 O
非 O
常 O
重 O
要 O
模板文件
模板文件中每一行代表一个特征模板,通常用%x[row,col]来定义,row表示当前token的行偏移,用相对位置来指定行(+n表示下面第n行,-n表示上面第n行),col直接用绝对位置来指定列。比如当前token为"国",%x[-1,0]表示"国"的前一行第0列:“中”。模板文件中包含两种类型的特征模板:Unigram和Bigram。Unigram下生成的特征函数为条件随机场中的f(yi,x)即状态特征,x为当前token的上下文。Bigram下生成的特征函数为转移特征即f(yi-1,yi,x),如果只写一个B的话,默认生成f(yi-1,yi),这意味着前一个状态标签和当前状态标签将组合成bigram features
格式如下:
#Unigram
U00:%x[-1,0]
U01:%x[0,0]
U02:%x[1,0]
U03:%x[2,0]
U04:%x[-2,0]
U05:%x[1,0]/%x[2,0]
U06:%x[0,0]/%x[-1,0]/%x[-2,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]
U10:%x[-1,0]/%x[1,0]
#Bigram
B
每一个特征模板都会生成一组特征函数,以U00:%x[-1,0]为例,输出的类型有3种:B,E,O。第0列的不同的特征为11个。所以生成的特征函数共3*11=33。
即:
func1 = if (output = B and feature="U00:国") return 1 else return 0
func2 = if (output = E and feature="U00:国") return 1 else return 0
func3 = if (output = O and feature="U00:国") return 1 else return 0
....
funccx = if (output = B and feature="U00:中") return 1 else return 0
funccy = if (output = O and feature="U00:中") return 1 else return 0
CRF++使用
使用命令
使用下列命令可以得到一个model文件。
crf_learn -f 3 -c 4.0 template train.txt model
命令参数如下:
可选参数
-f, –freq=INT使用属性的出现次数不少于INT(默认为1)
-m, –maxiter=INT设置INT为LBFGS的最大迭代次数 (默认10k)
-c, –cost=FLOAT 设置FLOAT为代价参数,过大会过度拟合 (默认1.0)
-e, –eta=FLOAT设置终止标准FLOAT(默认0.0001)
-C, –convert将文本模式转为二进制模式
-t, –textmodel为调试建立文本模型文件
-a, –algorithm=(CRF|MIRA)
选择训练算法,默认为CRF-L2
-p, –thread=INT线程数(默认1),利用多个CPU减少训练时间
-H, –shrinking-size=INT
设置INT为最适宜的跌代变量次数 (默认20)
-v, –version显示版本号并退出
-h, –help显示帮助并退出
通过以下方式可以将为模型文件保存一份文本模型。
crf_learn -f 3 -c 4.0 template train.txt model -t
输出内容
iter=0 terr=0.98787 serr=1.00000 act=2148836 obj=2055386.56193 diff=1.00000
iter=1 terr=0.03155 serr=0.44360 act=2148836 obj=812577.76905 diff=0.60466
iter=2 terr=0.03155 serr=0.44360 act=2148836 obj=266469.74848 diff=0.67207
iter=3 terr=0.03155 serr=0.44360 act=2148836 obj=253568.61956 diff=0.04841
iter=4 terr=0.03155 serr=0.44360 act=2148836 obj=205211.82052 diff=0.19070
输出的参数含义如下:
iter:迭代次数。当迭代次数达到maxiter时,迭代终止
terr:标记错误率
serr:句子错误率
obj:当前对象的值。当这个值收敛到一个确定值的时候,训练完成
diff:与上一个对象值之间的相对差。当此值低于eta时,训练完成
act:working set 中,active 的样本的数量
模型格式
version: 100
cost-factor: 1
maxid: 2148836
xsize: 1
B
E
M
O
U00:%x[-1,0]
U01:%x[0,0]
U02:%x[1,0]
U03:%x[2,0]
U04:%x[-2,0]
U05:%x[1,0]/%x[2,0]
U06:%x[0,0]/%x[-1,0]/%x[-2,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]
U10:%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:‰
...
14812 U01:±
14816 U01:·
14820 U01:×
14824 U01:—
14828 U01:‘
14832 U01:’
14836 U01:“
14840 U01:”
...
2013280 U10:王/平
2013284 U10:王/庆
2013288 U10:王/廉
2013292 U10:王/志
2013296 U10:王/忠
2013300 U10:王/成
2013304 U10:王/报
...
0.0018177959813861
-0.0013774176366184
-0.0009305290448709
-0.0005209483020642
0.0028288949846762
文件头
version: 100
cost-factor: 1
maxid: 2148836
xsize: 1
maxid描述了特征函数的最大id,xsize是特征维数,也就是训练语料列数-1。
标签
B
E
M
O
模板
U00:%x[-1,0]
U01:%x[0,0]
U02:%x[1,0]
U03:%x[2,0]
U04:%x[-2,0]
U05:%x[1,0]/%x[2,0]
U06:%x[0,0]/%x[-1,0]/%x[-2,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]
U10:%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:‰
...
14812 U01:±
14816 U01:·
14820 U01:×
14824 U01:—
14828 U01:‘
14832 U01:’
14836 U01:“
14840 U01:”
...
2013280 U10:王/平
2013284 U10:王/庆
2013288 U10:王/廉
2013292 U10:王/志
2013296 U10:王/忠
2013300 U10:王/成
2013304 U10:王/报
特征函数权值
0.0018177959813861
-0.0013774176366184
-0.0009305290448709
-0.0005209483020642
0.0028288949846762
CRF++软件包、训练集和测试集的语料以及训练的模型和保存的文本模型可以通过以下链接下载
链接:https://pan.baidu.com/s/1Ky15HrewDCBuYg_FHiaqJQ
提取码:1je5
参考文献
[1] https://www.hankcs.com/nlp/the-crf-model-format-description.html
[2] https://www.meiwen.com.cn/subject/zupdjftx.html