CRF++命名实体识别

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]
发布了30 篇原创文章 · 获赞 16 · 访问量 1157

猜你喜欢

转载自blog.csdn.net/qq_34523665/article/details/104787154