很久前做过一个命名实体识别的模块,现在有时间,记录一下。
一、要识别的对象
人名、地名、机构名
二、主要方法
1、使用CRF模型进行识别(识别对象都是最基础的序列,所以使用了好评率较高的序列识别算法CRF)
2、使用规则对相关数据进行后过滤、
三、具体实现
1、训练数据的生成
主要使用了人民日报免费部分,以及一些及它从网上找到的资源(时间长了,记不住了,好像还自己标注了些)
2、模板的生成
使用的是Unigram,由于考虑到要识别的实体一般情况下没有长距离依赖 以及训练时的效率问题,所以模板没有写得过长。经过几次测试,最终确定的模板如下。
#Unigram U00:%x[-3,0] U01:%x[-2,0] U02:%x[-1,0] U03:%x[0,0] U04:%x[1,0] U05:%x[2,0] U06:%x[3,0] U07:%x[-3,0]/%x[-2,0] U8:%x[-2,0]/%x[-1,0] U9:%x[-1,0]/%x[0,0] U10:%x[0,0]/%x[1,0] U11:%x[1,0]/%x[2,0] U12:%x[2,0]/%x[3,0] # Bigram B
3、参数寻优
参数寻优,使用网上提供的python脚本,进行参数寻优。(脚本的具体使用方法不在这里赘述)
4、迭代训练
a)使用初始的训练数据及调优过的参数进行训练
b)使用训练好的model对文本进行实体识别
c)对识别错误的结果进行人工标注,添加到训练集,转至步骤a)
这里的采用了人工干预的方法,来提高识别高性能,可能有些麻烦,但这是个比较有效的方法。
5、总体性能
经测试,总体准确度(Accuracy)在94%以上。
注:没有经过严格的测试,只是取了300篇文章,对其中的实体标注了,然后用模型识别了一遍,统计了Acc,而recall几乎100%,我感觉测试文章比较少,所以这个测试结果可能不太严谨,由于最后领导感觉达到要求了,所以我也没有继续提高。
四、小结
1、首先来说,训练模型使用语料有点偏少,如果有大量的训练语料,第四步迭代训练的压力可能就会比较小。
2、总体来说,这个模块还是很快的做完了,效果也还可以。在这里主要感谢一下人民日报那几个月的免费语料,做模型最怕的就是没有基础数据,特别是人民日报这样的高质量的数据,有了这种高质量的数据,对于机器学习来说是事伴功倍。
转载请注明出处:本文地址 http://www.cnblogs.com/nocml/p/3543236.html