CRF++命名实体识别
我在大半年前,刚刚读研的时候,导师给我一篇文章(本科毕业论文),以及一些数据叫我把它实现。这是小导师指导的清华的一名本科生的毕设,也非常感谢他的那篇写得通俗易懂的文章,给我这个自然语言处理的门外汉入了门。其实也就一周时间,入门了自然语言处理,并且也很快用CRF++做了个命名实体识别的工作。不需要编程,而且效果还挺好,非常赞的开源工具。
win10平台的操作指南
在win10下使用CRF++的话需要一些工具包:
首先我们需要安装一个软件,perl解释器:activeperl,我们可以在官网下到,下完安装就可以了,没什么注意事项。官网下载
接下来,我们看到CRF++中的一些文件:
crf_learn.exe:CRF++的训练程序。
crf_test.exe:CRF++的预测程序
libcrfpp.dll:训练程序和预测程序需要使用的静态链接库。
打开cmd,输入下面三行代码:
1、crf_learn template train.txt model 训练数据
2、crf_test -m model test.txt >output.txt 测试数据
3、conlleval.pl -r -d "\t" < output.txt 评估效果
最后一行尤其注意,不用将文件中的tab键换成空格,直接这行命令就完事。
其中:iter是迭代次数;terr是词错误率;serr是句错误率;act: number of active examples in working set ;obj是当前对象值,当它收敛时,迭代结束;diff是与上一对象的差。
参数调整细节
有四个主要的参数可以调整:
-a CRF-L2 or CRF-L1
规范化算法选择。默认是CRF-L2。一般来说L2算法效果要比L1算法稍微好一点,虽然L1算法中非零特征的数值要比L2中大幅度的小。
-c float
这个参数设置CRF的hyper-parameter。c的数值越大,CRF拟合训练数据的程度越高。这个参数可以调整过度拟合和不拟合之间的平衡度。这个参数可以通过交叉验证等方法寻找较优的参数。
-f NUM
这个参数设置特征的cut-off threshold。CRF++使用训练数据中至少NUM次出现的特征。默认值为1。当使用CRF++到大规模数据时,只出现一次的特征可能会有几百万,这个选项就会在这样的情况下起到作用。
-p NUM
如果电脑有多个CPU,那么那么可以通过多线程提升训练速度。NUM是线程数量。
带两个参数的命令行例子:
crf_learn -f 3 -c 1.5 template_filetrain_file model_file
特征模板
另外一个需要确定的就是特征模板了:
U00:%x[-5,0]
U01:%x[-4,0]
U02:%x[-3,0]
U03:%x[-2,0]
U04:%x[-1,0]
U05:%x[0,0]
U06:%x[1,0]
U07:%x[2,0]
U08:%x[3,0]
U09:%x[4,0]
U10:%x[5,0]
U11:%x[-5,0]/%x[-4,0]
U12:%x[-4,0]/%x[-3,0]
U13:%x[-3,0]/%x[-2,0]
U14:%x[-2,0]/%x[-1,0]
U15:%x[-1,0]/%x[0,0]
U16:%x[0,0]/%x[1,0]
U17:%x[1,0]/%x[2,0]
U18:%x[2,0]/%x[3,0]
U19:%x[3,0]/%x[4,0]
U20:%x[4,0]/%x[5,0]