您的位置:首页 > 其它

【命名实体识别】HMM-Viterbi角色标注中国人名识别

2017-12-04 13:21 453 查看

实战HMM-Viterbi角色标注中国人名识别

这几天写完了人名识别模块,与分词放到一起形成了两层隐马模型。虽然在算法或模型上没有什么新意,但是胜在训练语料比较新,对质量把关比较严,实测效果很满意。比如这句真实的新闻“签约仪式前,秦光荣、李纪恒、仇和等一同会见了参加签约的企业家。”,分词结果:[签约/v,
仪式/n, 前/f, ,/w, 秦光荣/nr, 、/w, 李纪恒/nr, 、/w, 仇和/nr, 等/u, 一同/d, 会见/v, 了/ul, 参加/v, 签约/v, 的/uj, 企业家/n, 。/w],三个人名“秦光荣”“李纪恒”“仇和”一个不漏。一些比较变态的例子也能从容应对,比如下面:

原始句子HanLPansj分词
签约仪式前,秦光荣、李纪恒、仇和等一同会见了参加签约的企业家。[签约/v, 仪式/n, 前/f,   ,/w, 秦光荣/nr, 、/w, 李纪恒/nr, 、/w, 仇和/nr, 等/u, 一同/d, 会见/v, 了/ul, 参加/v, 签约/v,   的/uj, 企业家/n, 。/w][签约/v, 仪式/n, 前/f,   ,/w, 秦/nr, 光荣/a, 、/w, 李纪恒/nr, 、/w, 仇/nr, 和/c, 等/u, 一同/d, 会见/v, 了/ul, 参加/v,   签约/v, 的/uj, 企业家/n, 。/w]
王国强、高峰、汪洋、张朝阳、韩寒、小四[王国强/nr, 、/w, 高峰/n,   、/w, 汪洋/n, 、/w, 张朝阳/nr, 、/w, 韩寒/nr, 、/w, 小/a, 四/m][王国/n, 强/a, 、/w,   高峰/n, 、/w, 汪洋/n, 、/w, 张/q, 朝阳/ns, 、/w, 韩寒/nr, 、/w, 小/a, 四/m]
张浩和胡健康复员了[张浩/nr, 和/c, 胡健康/nr,   复员/vn, 了/ul][张浩/nr, 和/c, 胡/nr,   健康/a, 复员/vn, 了/ul]
王总和小丽结婚了[王总/nr, 和/c, 小丽/nr,   结婚/v, 了/ul][王/nr, 总和/n, 小丽/nr,   结婚/v, 了/ul]
编剧邵钧林和稽道青说[编剧/n, 邵钧林/nr, 和/c,   稽道青/nr, 说/v][编剧/n, 邵钧林/nr, 和/c,   稽/nr, 道青/nr, 说/v]
这里有关天培的壮烈[这里/r, 有/v, 关天培/nr,   的/uj, 壮烈/a][这里/r, 有关/vn, 天培/nr,   的/uj, 壮烈/a]
龚学平等领导,邓颖超生前[龚学平/nr, 等/u, 领导/n,   ,/w, 邓颖超/nr, 生前/t][龚学平/nr, 等/nw, 领导/n,   ,, 邓颖超/nr, 生前/t]
这是我将自己的分词与ansj作比较得出的结果,由于自己可以随时调整算法,所以主场占了很大便宜。但是第一句绝对没有放水,说实话能识别出“仇和”这么冷僻的名字着实让我惊喜了一下。

开源项目

本文代码已集成到HanLP中开源:http://www.hankcs.com/nlp/hanlp.html

原理

推荐仔细阅读《基于角色标注的中国人名自动识别研究》这篇论文,该论文详细地描述了算法原理和实现。从语料库的整理、标注到最后的模式匹配都讲得清清楚楚。我在这篇论文的基础上做了改进,主要步骤我总结如下:
1、对语料库自动标注,将原来的标注转化为角色标注。角色标注一共有如下几种:
编码

代码

意义

例子

B

Pf

姓氏

张华平先生

C

Pm

双名的首字

张华平先生

D

Pt

双名的末字

张华平先生

E

Ps

单名

张浩说:“我是一个好人”

F

Ppf

前缀

老刘、小李  

G

Plf

后缀

王总、刘老、肖氏、吴妈、叶帅

K

Pp

人名的上文

又来到于洪洋的家。

L

Pn

人名的下文

新华社记者黄文摄

M

Ppn

两个中国人名之间的成分

编剧邵钧林和稽道青说

U

Ppf

人名的上文和姓成词

这里有关天培的壮烈

V

Pnw

人名的末字和下文成词

龚学平等领导, 邓颖超生前

X

Pfm

姓与双名的首字成词

王国维、

Y

Pfs

姓与单名成词

高峰、汪洋

Z

Pmt

双名本身成词

张朝阳

A

Po

以上之外其他的角色

表1 中国人名的构成角色表
我在此基础上拓展了一个S,代表句子的开始。
2、统计标签的出现频次,标签的转移矩阵。
3、对粗分结果角色标注,模式匹配。
我对论文中的几个模式串做了拓充,并且采用了AC模式匹配算法。

体会

论文中将三字名称拆分为BCD,我实测在2-gram模型下,C很容易被识别为E,导致人名缺一半。
人民日报2014中的人名并不能覆盖所有常用字,所以我去别的地方找了个人名库,拆成BCD或BE补充了进去。
人民日报2014语料库中有很多错误,比如

去/vf 年老/vi 张中秋/nr 去/vf “/w 泡茶/vi ”/w ,/w 送礼/vi 遭到/v 了/ule 拒绝/v ,/w 老张/nz 担心/v 金额/n 不够/a

中秋很明显不是人名的组成部分,这个必须手工剔除。
“中秋安全”会识别出“中 秋安全”来,因为2-gram词典中没有“中秋@安全”这种接续,而有“中@未##人”这种接续。初步的解决方法是手工往2-gram词典里面加一条“中秋@安全”。这反映了这种方法的局限性,另一方面也说明词典的重要性。

转载自:http://www.hankcs.com/nlp/chinese-name-recognition-in-actual-hmm-viterbi-role-labeling.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: