用CRF做命名实体识别(一)

作者: 炼己者 | 来源:发表于2018-06-15 23:34 被阅读234次

    摘要

    本文主要讲述了关于人民日报标注语料的预处理,利用CRF++工具包对模型进行训练以及测试

    目录

    • 明确我们的标注任务
    • 语料和工具
    • 数据预处理
      1.数据说明
      2.数据预处理
    • 模型训练及测试
      1.流程
      2.标注集
      3.特征模板
      4.CRF++包的使用说明
    • 总结与展望

    正文

    1.明确我们的标注任务

    这篇文章主要是介绍用CRF模型去提取人民日报语料的时间、人物、地点及组织机构名,也就是提取TIME、PERSON、LOCATION、ORGANIZATION四种实体。训练我们直接使用CRF++工具包。

    2.语料和工具

    人民日报1998中文标注语料库
    CRF++安装包

    3.数据预处理

    3.1 数据说明

    • 首先打开下载的人民日报标注语料的文件,要转为utf-8格式。我们需要提取的实体是时间、人名、地名、组织机构名,根据语料库的词性标记说明,对应的词性分别为/t、/nr、/ns、/nt。

    3.2 数据预处理

    • 语料库里的姓名标注是将姓和名分开标注的,因此需要合并姓名
    合并姓名前:
    '19980101-01-001-002/m中共中央/nt总书记/n、/w国家/n主席/n江/nr泽民/nr'
    合并姓名后:
    '19980101-01-001-002/m中共中央/nt总书记/n、/w国家/n主席/n江泽民/nr'
    
    • 需要将中括号里的内容合并
    合并中括号前:
    '[中国/ns  政府/n]nt  顺利/ad  恢复/v  对/p  香港/ns  行使/v  主权/n  ,/w '
    合并中括号后:
    '中国政府nt顺利/ad恢复/v对/p香港/ns行使/v主权/n,/w'
    

    **4.1- 时间合并

    合并时间前:
    '1999年/t  12月/t  澳门/ns  的/u  回归/vn  一定/d  能够/v  顺利/ad  实现/v  。/w'
    合并时间后:
    '1999年12月/t澳门/ns的/u回归/vn一定/d能够/v顺利/ad实现/v。/w'
    
    • 全角字符统一转为半角字符
    • 人民日报语料有些地方不是两个空格的,例如11042行 '副教授/n 叹/Vg 道/v ,/w 成/v', 中的“叹/Vg” 和“道/v”之间是单空格,需要变成双空格。否则代码运行会报错

    4.模型训练及测试

    流程**

    image.png
    4.2 标注集
    用的是BMEWO做标注体系
    B代表实体的首部,M代表实体的中部,E代表实体的尾部,W代表单个的实体,O代表非实体
    新   O
    世   O
    纪   O
    —   O
    —   O
    一   B_TIME
    九   M_TIME
    九   M_TIME
    八   M_TIME
    年   E_TIME
    新   B_TIME
    年   E_TIME
    讲   O
    话   O
    (   O
    附   O
    图   O
    片   O
    1   O
    张   O
    )   O
    
    中   B_ORGANIZATION
    共   M_ORGANIZATION
    中   M_ORGANIZATION
    央   E_ORGANIZATION
    总   O
    书   O
    记   O
    

    CRF++训练的数据格式如上图所示

    4.3 特征模板
    特征模板template如下

    # Unigram
    U00:%x[-2,0]
    U01:%x[-1,0]
    U02:%x[0,0]
    U03:%x[1,0]
    U04:%x[2,0]
    U05:%x[-2,0]/%x[-1,0]/%x[0,0]
    U06:%x[-1,0]/%x[0,0]/%x[1,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]
    
    # Bigram
    B
    

    4.4 CRF++包的使用说明
    下载工具包之后,打开文件夹

    image.png

    1.在此处新建一个文件夹chinese

    2.我们复制crf_learn.exe,crf_test.exe和libcrfpp.dll这三个文件到我们新建的chinese文件夹里面,然后再把之前生成的CRF++数据格式的数据文件train.data放到chinese里面,再把我们自己定义的特征模板文件放到chinese文件夹里面(一共五个文件)

    3.在chinese里面打开cmd
    敲入以下代码,这便是开始训练模型

    crf_learn -a MIRA template train.data model
    

    template就是我们上面定义的特征模板
    训练好之后会产生一个model文件

    4.自己写几个测试文本,并将其转为CRF++的数据格式,注意标签要全部一样,如下图所示

    扬   B
    帆   B
    远   B
    东   B
    做   B
    与   B
    中   B
    国   B
    合   B
    作   B
    的   B
    先   B
    行   B
    
    希   B
    腊   B
    的   B
    经   B
    济   B
    结   B
    构   B
    较   B
    特   B
    殊   B
    。   B
    

    同样把这个测试数据的文件test.data放到chinese文件夹里面

    5.在chinese里面打开cmd
    敲入以下代码,这便是开始模型预测

    crf_test -m model test.data >> output.txt
    

    打开output.txt文件你就会看到预测的结果

    扬   B   O
    帆   B   O
    远   B   O
    东   B   O
    做   B   O
    与   B   O
    中   B   B_LOCATION
    国   B   E_LOCATION
    合   B   O
    作   B   O
    的   B   O
    先   B   O
    行   B   O
    
    希   B   B_LOCATION
    腊   B   E_LOCATION
    的   B   O
    经   B   O
    济   B   O
    结   B   O
    构   B   O
    较   B   O
    特   B   O
    殊   B   O
    。   B   O
    

    5.总结与展望

    现在仅仅只是粗暴的把这个流程实现了一遍,测试的效果并不是很好,有部分的人名没有识别出来,还需要再添加特征,以及更改template特征模板,这些还在学习。CRF的原理也不是很懂,也需要去完整的学习一下。后续还会更新

    相关文章

      网友评论

      • fc47298e6bb8:请问,能不能分布你的chinese文件夹吗?
        炼己者:@宁静致远_f797 不好意思哈,之前电脑键盘进水,坏掉,然后就整个重装了一下,文件已经没了。
      • 窝窝窝窝窝头:文本有36M,运行命令:crf_learn -f 8 -c 1.5 template training.data model_file 之后,没有显示迭代次数,也不生成model了,如果我换个9M大小的文件基本上是没有问题的,大佬能为我解释下是为什么吗
        窝窝窝窝窝头:@炼己者 我问我们助教,助教不太乐意搭理我,说更大的语料他都跑过,肯定能生成模型。我再改参数试试吧,谢谢大佬
        炼己者:@窝窝窝窝窝头 这个问题我没有遇到,也许数据量太大,你可以更改命令里的参数,试试看
        窝窝窝窝窝头:https://bbs.csdn.net/topics/392335817?page=1
        就和这个帖子描述的问题一样

      本文标题:用CRF做命名实体识别(一)

      本文链接:https://www.haomeiwen.com/subject/ckqveftx.html