用CRF做命名实体识别

摘要

本文主要讲述了关于人民日报标注语料的预处理,利用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'
  • 时间合并

    合并时间前:
    '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的原理也不是很懂,也需要去完整的学习一下。后续还会更新

也欢迎大家看看我的简书[https://www.jianshu.com/p/12f2cdd86679]

猜你喜欢

转载自www.cnblogs.com/lookfor404/p/9189429.html