zoukankan      html  css  js  c++  java
  • 基于条件随机场(CRF)的命名实体识别

      很久前做过一个命名实体识别的模块,现在有时间,记录一下。

      一、要识别的对象

        人名、地名、机构名

      二、主要方法

        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

  • 相关阅读:
    用户画像
    华为离职副总裁徐家骏:年薪千万的工作感悟
    JAVA CAS原理深度分析-转载
    彻底理解ThreadLocal二
    彻底理解ThreadLocal一
    观察者模式(浅谈监听器工作原理)
    Java编程提高性能时需注意的地方
    Spring对Quartz的封装实现简单需注意事项
    FileInputStream和BufferedInputStream的区别
    java
  • 原文地址:https://www.cnblogs.com/nocml/p/3543236.html
Copyright © 2011-2022 走看看