专栏首页hadoop学习笔记hanlp自然语言处理包的人名识别代码解析
原创

hanlp自然语言处理包的人名识别代码解析

HanLP发射矩阵词典nr.txt中收录单字姓氏393个。袁义达在《中国的三大姓氏是如何统计出来的》文献中指出:当代中国100个常见姓氏中,集中了全国人口的87%,根据这一数据我们只保留nr.txt中的100个常见词语的姓氏角色,其他词语去掉其姓氏角色状态。过滤后,nr.txt中具有姓氏角色的单字共计97个。

列于下表:

丁 万 乔 于 任 何 余 侯 傅 冯 刘 卢 史 叶 吕 吴 周 唐 夏 姚

姜 孔 孙 孟 宋 尹 崔 常 康 廖 张 彭 徐 戴 方 易 曹 曾 朱 李

杜 杨 林 梁 武 段 毛 江 汤 汪 沈 潘 熊 王 田 白 石 秦 程 罗

胡 苏 范 萧 董 蒋 薛 袁 许 谢 谭 贺 贾 赖 赵 邓 邱 邵 邹 郑

郝 郭 金 钟 钱 阎 陆 陈 雷 韩 顾 马 高 魏 黄 黎 龚

实验效果

姓氏过滤前,各命名实体识别准确率

nr 33%

ns 83%

nt 43%

姓氏过滤后,各命名实体识别准确率

nr 36%

ns 83%

nt 81%

这里没有开层叠隐马预测机构名和地名,nt上升原因估计是由于很多不是人名的词语没被标为人名,那么nt的模式匹配规则匹配不上了,所以机构名准确率上来了。错误识别的人名,100个常用姓氏的不多,很多恐怕是HanLP里其他词表干预进来的。

隐马一般用于分词和词性标注是比较好的,为什么通常的序列标注方法也就是BIEO方法直接用到实体识别不合适呢。用词性标注为例,每一个词它所对应的词性标记子集是有限的,而这个子集相对于词性标记全集来说是小的。但是到了实体识别则不一定,拿人名来说,除了姓氏以外,名字词语部分可以填充的词语是任意的,也就是说任何词语都有可能出现在中间位置,此时发射矩阵中的某些词实际上就没有太大意义了,因为它可能等可能的由BIEO标记发出,而如果指利用四种标记之间的转移概率信息来确定最优的标记序列势必就影响效果。因此,我们通过引入角色标记,实际上这就引入了先验知识,比如某些字只能由姓氏标记产生,某些字一般情况都充当名字首字,某些字一般情况都充当名字末字,通过给这些不同情况下的字集按照其出现的位置的分布和其语法意义做角色定义,可以缩小每种角色标记可发出的词语集合,也就是每种词语(字)所对应的标记集的大小,相当于使发射概率分布不是均匀分布,那么预测的准确性肯定就得到提高了。

下边介绍一下HanLP人名识别的主要流程

1.使用使用匹配法求出各种分词路径用变量wordNetAll存储

2.用viterbi方法找到一条最优的分词路径,这里主要使用用户自定义词典以及核心词典,用序列变量vertexList存储。

3.角色观察,也就是根据发射概率矩阵列出vertexList中每个词语可能对应的角色标记。roleObserve(...)方法实现。

4.角色标注,利用viterbi方法求出最优角色标记序列。viterbiComputeSimply(...)方法实现。

5.对角色序列进行模式匹配得到人名。模式匹配定义在NRPattern类中。

在精度要求比较高且时间紧的情况下,最好的提高准确率的方法为,只保留常用姓氏,只保留最可能的2gram角色标记模式。在做人名识别时还有一个注意的点,如果你的预测语料和训练语料完全在文体上差别很大,或者说你就是在公开的训练语料上训练而不在预测语料上训练的话,基本上上下文信息是没有用处的,甚至有可能上下文信息会给实体边界标注带来干扰,我想任何机器学习包括深度学习,不管是文本分类领域还是实体识别领域都会有这种泛化能力的问题,这种问题恐怕通过算法是没法解决的,如果可以解决那么任何语种任何领域都可以使用一种模型,一劳永逸了。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

相关文章

  • 中文分词工具之基于字标注法的分词

    中文分词字标注通常有2-tag,4-tag和6-tag这几种方法,其中4-tag方法最为常用。标注集是依据汉字(其中也有少量的非汉字字符)在汉语词中的位置设计的...

    IT小白龙
  • spark集群使用hanlp进行分布式分词操作说明

    本篇分享一个使用hanlp分词的操作小案例,即在spark集群中使用hanlp完成分布式分词的操作,文章整理自【qq_33872191】的博客,感谢分享!以下为...

    IT小白龙
  • Hadoop体系结构中的服务解决介绍

    翻了一下最近一段时间写的分享,DKHadoop发行版本下载、安装、运行环境部署等相关内容几乎都已经写了一遍了。虽然有的地方可能写的不是很详细,个人理解水平有限还...

    IT小白龙
  • [Leetcode][python][Java]Reverse Linked List/Reverse Linked List II/反转链表/反转链表 II

    必看: http://blog.csdn.net/autumn20080101/article/details/7607148 以下代码若理解不通请务必...

    后端技术漫谈
  • 解读目标检测新范式:Segmentations is All You Need

    作者利用注释质量较差的边界框在困难环境中实现稳健的目标检测性能,避免了与 anchor 框或 NMS 相关的所有超参数。他们提出的模型超越了之前基于 ancho...

    机器之心
  • 解读目标检测新范式:Segmentations is All You Need

    作者利用注释质量较差的边界框在困难环境中实现稳健的目标检测性能,避免了与 anchor 框或 NMS 相关的所有超参数。他们提出的模型超越了之前基于 ancho...

    AI算法与图像处理
  • finecms同时调用子栏目和子栏目的文章怎么操作

      之前ytkah写过dedecms如何调用当前栏目的子栏目及子栏目文章,那如果是finecms如何同时调用子栏目和子栏目的文章呢?           {li...

    ytkah
  • 快讯 | FireEye在GitHub上开源密码破解工具GoCrack

    近日,FireEye 开源了一款密码破解工具 GoCrack,可在多机器上部署破解任务。 GoCrack 是由 FireEye’s Innovation and...

    FB客服
  • 老外的成人玩具又来了,走心的设计,牛X依旧...

    在一些人的观念里认为,设计只是另一种形式的装饰。对于设计师来说,设计是一种心力。因为好的设计都是走心的!它不仅让生活变得更美好,更是让生活变得更便捷。 ? ▲...

    前朝楚水
  • Python分解路径名

        Python分解路径名的实际操作步骤的介绍,其中我们会设定很多的假设,以及一些相关代码的介绍,以方便你在学习的过程中更好的掌握Python分解路径名的...

    py3study

扫码关注云+社区

领取腾讯云代金券