用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'
**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.模型训练及测试
流程**
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++包的使用说明
下载工具包之后,打开文件夹
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的原理也不是很懂,也需要去完整的学习一下。后续还会更新