分词、词性标注(POS)、实体识别(NER)都属于序列标注问题,解决的套路可以是一样的,在文章分词-基于CRF中讲了如何使用CRF分词,照葫芦画瓢,本文将会使用CRF提取1998年人民日报语料中的时间(TIME)、人名(PERSON)、地名(LOCATION)、组织机构(ORGANIZATION)四类实体。
语料和工具
- 1998年人民日报标注语料
- CRF++0.58
- python
数据清洗
98年的人民日报语料据说是全人工标注,数据质量还是比较高的,需要清洗的主要有以下几点:
- 全角转半角, 数据中有些文字是全角字符,如“1998”,统一转成半角字符处理;
- 姓名合并,标注数据中,姓和名是分开的,如:“李/nr 鹏/nr”,需要合并成:”李鹏/nr”;
- 实体名合并,数据中对于部分实体是分开标注的,并用中括号引起来表明其为某个实体,如:“[中国/ns 政府/n]nt”,“[人民/n 大会堂/n]ns”,需要将中括号内非标签文字合并,整理成:“中国政府/nt”形式。
特征构建
在特征构建上,主要从字、字边界特征、词法特征、时间常用词、指示词(姓名、地名、组织机构)这六个方面去构建,如果有时间的话还可以整理下中国的姓名、地名、组织机构常用词特征的,anyway,构造特征的本质就是尽量找出对标签有利的信息
字、字边界特征
字边界分为:B(词语首部)、M(词语中标)、E(词语尾部)、S(单字),对每个词标记其字边界,并整理成以下格式:
不 B
依 M
不 M
饶 E
, S
喋 B
喋 M
不 M
休 E
...
词法特征
词法特征,人民日报语料是做好词性标注的,但是如果需要对外部语料测试的话,需要标注词性会比较麻烦,因此这里使用thulac(效率好慢好慢…)将语料重新做词性标注。
不 i
依 i
不 i
饶 i
, w
喋 i
喋 i
不 i
休 i
...
时间常用词
如果词语中包含:今、明、昨、年、月、日、时、分、秒 则标记为Y,否则标记为N。
把时间这个作为实体放上来,只是想测试下CRF的效果,时间的识别其实还是相对简单的,如果项目时间不充足,正则写的溜的话,基于正则识别时间应该也是没有问题的。
指示词
通常在人名、地名或者组织机构名出现的前后会有一些指示词,比如”国家/主席/XXX/发表”、“新华社/记者/XXX/摄”、“在/人民大会堂/召开”,这些指示词包含有上下文信息,能够有效地帮助我们识别实体,本文将出现实体的前后两个词作为候选指示词,然后从所有候选指示词中提取频数大于10的作为最终的指示词。如果是指示词则标记Y,否则标记N。
新 Y
华 Y
社 Y
记 Y
者 Y
樊 N
如 N
钧 N
摄 Y
模型构建
数据划分
将人民日报语料抽70%做训练集,30%做测试集。
训练数据
处理好的训练数据如下:
特征顺序依次为:字、字边界、词性、时间常用词、人名指示词、地名指示词、组织机构指示词、标签
迈 B v N N N N O
向 E v N N N N O
充 B v N N N N O
满 E v N N N N O
希 B n N Y Y N O
望 E n N Y Y N O
的 S u N Y Y Y O
新 S a N Y Y N O
世 B n N N Y N O
纪 E n N N Y N O
— B w N Y Y N O
— E w N Y Y N O
一 B t N N N N B_TIME
九 M t N N N N M_TIME
九 M t N N N N M_TIME
八 M t N N N N M_TIME
年 E t Y N N N E_TIME
新 B t N N Y N B_TIME
年 E t Y N Y N E_TIME
....
特征模板
# 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]
U10:%x[-2,1]
U11:%x[-1,1]
U12:%x[0,1]
U13:%x[1,1]
U14:%x[2,1]
U15:%x[-1,0]/%x[0,1]
U16:%x[0,0]/%x[1,1]
U17:%x[-1,0]/%x[-1,1]
U18:%x[-2,2]
U19:%x[-1,2]
U20:%x[0,2]
U21:%x[1,2]
U22:%x[2,2]
U23:%x[-2,0]/%x[0,2]
U24:%x[-1,0]/%x[0,2]
U25:%x[0,0]/%x[0,2]
U26:%x[-2,0]/%x[-1,0]/%x[0,2]
U27:%x[-1,0]/%x[0,0]/%x[0,2]
U28:%x[-2,3]
U29:%x[-1,3]
U30:%x[0,3]
U31:%x[-2,3]/%x[-1,3]/%x[0,3]
U32:%x[-2,4]/%x[-1,4]/%x[1,4]%x[2,4]
U33:%x[-2,5]/%x[-1,5]/%x[1,5]%x[2,5]
U34:%x[-2,6]/%x[-1,6]/%x[1,6]%x[2,6]
# Bigram
B
训练及效果评估
先来看下单字作为特征的情况,仅仅用单字特征识别实体效果勉强还行。
processed 552006 tokens with 73148 phrases; found: 69378 phrases; correct: 61864.
accuracy: 97.13%; precision: 89.17%; recall: 84.57%; FB1: 86.81
B_LOCATION: precision: 90.09%; recall: 85.84%; FB1: 87.91 6256
B_ORGANIZATION: precision: 84.47%; recall: 82.13%; FB1: 83.28 3193
B_PERSON: precision: 95.74%; recall: 89.97%; FB1: 92.76 5535
B_TIME: precision: 95.40%; recall: 92.58%; FB1: 93.97 5870
E_LOCATION: precision: 88.37%; recall: 84.21%; FB1: 86.24 6257
E_ORGANIZATION: precision: 85.78%; recall: 83.40%; FB1: 84.58 3193
E_PERSON: precision: 95.10%; recall: 89.37%; FB1: 92.15 5535
E_TIME: precision: 95.21%; recall: 92.40%; FB1: 93.78 5870
M_LOCATION: precision: 81.19%; recall: 73.40%; FB1: 77.10 3609
M_ORGANIZATION: precision: 78.75%; recall: 72.37%; FB1: 75.42 14725
M_PERSON: precision: 94.98%; recall: 93.18%; FB1: 94.07 5421
M_TIME: precision: 98.04%; recall: 97.36%; FB1: 97.70 3835
S_PERSON: precision: 96.20%; recall: 45.78%; FB1: 62.04 79