这几天写完了人名识别模块,与分词放到一起形成了两层隐马模型。虽然在算法或模型上没有什么新意,但是胜在训练语料比较新,对质量把关比较严,实测效果很满意。比如这句真实的新闻 “签约仪式前,秦光荣、李纪恒、仇和等一同会见了参加签约的企业家。”,分词结果: [ 签约 /v, 仪式 /n, 前 /f, , /w, 秦光荣 /nr, 、 /w, 李纪恒 /nr, 、 /w, 仇和 /nr, 等 /u, 一同 /d, 会见 /v, 了 /ul, 参加 /v, 签约 /v, 的 /uj, 企业家 /n, 。 /w] ,三个人名“秦光荣”“李纪恒”“仇和”一个不漏。一些比较变态的例子也能从容应对,比如下面:
这是 hankcs 将自己的分词与 ansj 作比较得出的结果,由于自己可以随时调整算法,所以主场占了很大便宜。但是第一句绝对没有放水,说实话能识别出“仇和”这么冷僻的名字着实让 人 惊喜了一下。
开源项目
本文代码已集成到 HanLP 中开源: https://github.com/hankcs/HanLP
原理
推荐仔细阅读《基于角色标注的中国人名自动识别研究 .doc 》这篇论文,该论文详细地描述了算法原理和实现。从语料库的整理、标注到最后的模式匹配都讲得清清楚楚。 hankcs 在这篇论文的基础上做了改进,主要步骤总结如下:
1 、 对熟语料库自动标注,将原来的标注转化为角色标注。角色标注一共有如下几种:
hankcs 在此基础上拓展了一个 S ,代表句子的开始。
2 、统计标签的出现频次,标签的转移矩阵。
3 、对粗分结果角色标注,模式匹配。
hankcs 对论文中的几个模式串做了拓充,并且采用了 AC 模式匹配算法。
体会
论文中将三字名称拆分为 BCD ,实测在 2-gram 模型下, C 很容易被识别为 E ,导致人名缺一半。
人民日报 2014 中的人名并不能覆盖所有常用字,所以 hankcs 去别的地方找了个人名库,拆成 BCD 或 BE 补充了进去。
人民日报 2014 语料库中有很多错误,比如
去 /vf 年老 /vi 张中秋 /nr 去 /vf “ /w 泡茶 /vi ” /w , /w 送礼 /vi 遭到 /v 了 /ule 拒绝 /v , /w 老张 /nz 担心 /v 金额 /n 不够 /a
中秋很明显不是人名的组成部分,这个必须手工剔除。
“中秋安全”会识别出“中 秋安全”来,因为 2-gram 词典中没有“中秋 @ 安全”这种接续,而有“中 @ 未 ## 人”这种接续。初步的解决方法是手工往 2-gram 词典里面加一条“中秋 @ 安全”。这反映了这种方法的局限性,另一方面也说明词典的重要性。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31524777/viewspace-2217055/ ,如需转载,请注明出处,否则将追究法律责任。