HanLP收词特别是实体比较多,因此特别容易造成误识别。下边举几个地名误识别的例子,需要指出的是,后边的机构名识别也以地名识别为基础,因此,如果地名识别不准确,也会导致机构名识别不准确。

类型1 数字+地名

[1] 暗访哈尔滨网约车:下10单来7辆“黑车” 1辆套牌

[2] 房天下每日成交5月12日海宁商品房销售备案43套

[3] 广西近视手术专家-黄明汉院长9月9日百色见面会

类型2 前词+地名首词成词或地名尾词+后词成词

[1] 西安国企4000元工资相当于私企多少钱?

[2] 七月份从包头到山东,十五天左右,有自驾游路线推荐吗?

[3] 最受考研人欢迎的城市,有你报考高校所在的城市吗?

类型3 地名本身成词

[1] 滴滴司机接跨省天价订单 乘客半路改道至今未付款

[2] 上联:山水不曾随我老,如何对下联?

[3] 上联:柳着金妆闲钓水,如何对下联?

Badcase分析及修正

下边介绍一下排查误判原因以及修正的方法

首先需要明确以下几点注意事项:

1.实体识别受分词精度影响。

2.实体识别同样涉及消歧的问题。

3.HanLP收录了一些不常见的实体词,会造成错误率升高。

4.HanLP基于隐马的命名实体识召回率没有特别要求的话,不需要再去训练。

这里我们以下边这个badcase的分析过程为例来说明

[5] 上联:山水不曾随我老,如何对下联?

打开提示模式 HanLP.Config.enableDebug()

运行人名识别代码

# HanLP命名实体识别

def hanlp_ner(text, ner_type):

global segment

ner_li = []

for term in segment.seg(text):

if str(term.nature) == ner_type:

ner_li.append(str(term.word))

return ner_li

这里ner_type为你要识别的实体类型,如果是人名则ner_type='nr',地名ner_type='ns',机构名ner_type='nt'。text为要抽取实体的文本。

识别结果,这里为了清晰,只截取了部分输出

粗分结果[上联/n, :/w, 山水/n, 不/d, 曾随/ns, 我/rr, 老/a, ,/w, 如何/ryv, 对/p, 下联/n, ?/w]

地名角色观察:[  S 1163565 ][上联 Z 20211628 ][: A 2701 B 439 X 11 ][山水 B 6 A 1 ][不 B 214 A 3 C 3 ][曾随 G 1 H 1 ]

[我 A 47 B 26 ][老 C 274 A 75 B 66 D 2 X 2 ][, A 40525 B 10497 X 418 ][如何 B 44 ][对 A 2896 B 454 X 215 ][下联 Z 20211628 ][? B 82 ][  B 1322 ]

地名角色标注:[ /S ,上联/Z ,:/B ,山水/A ,不/C ,曾随/H ,我/B ,老/B ,,/A ,如何/B ,对/A ,下联/Z ,?/B , /S]

识别出地名:不曾随 CH

hanlp_ns ['不曾随']

显然,曾随被认为是地名了,而且粗分结果表示的是未经地名识别模块分词和词性标注的结果,显然这是由于词表导致的。由于没有经过地名识别模块,所以不需要去地名的发射词表ns.txt中去找词语,只需要看核心词表CoreNatureDictionary.txt中去找

 

显然,在核心词表中“曾随“被标记为一个地名,把”曾随“从词表中删除掉,并删除词表文件CoreNatureDictionary.txt.bin,之后再次运行程序得到下边的输出结果

hanlp_ns []

从这个实例,我们也可以看出一些不常见地名如果做成地名词表,就有导致错误识别实体。因此,我们应该保留一份评测语料,每当修改了实体词表后,需要跑一下测试语料查看准确率,如果降低的太多,则表示这样加进来是不可行的。同时填加的实体名也有可能会造成分词错误。

下边说明一下HanLP中有关实体的词表文件名

1.CoreNatureDictionary.mini.txt

2.CoreNatureDictionary.txt

3.CustomDictionary.txt

4.机构名词典.txt

5.全国地名大全.txt

6.人名词典.txt

7.上海地名.txt

8.现代汉语补充词库.txt

9.ns.txt

10.nr.txt

11.nt.txt

当然这里列出的是通常最有可能导致误识别的词表,如果这些词表都没有找到,还需要在HanLP其他词典文件中寻找。

希望今天的内容对使用HanLP并对隐马情有独钟的小伙伴有帮助。这两天的一点小体会是,实体识别其实跟分词是密不可分的,两者都有共同的处理难点,比如词义消歧(边界的确定),词法分析其实才是真正的NLP的内容之一,而词法分析跟机器学习其实没有太大关系。上边的badcase解决方法不是根本方法,直接去除掉某些词,会导致一些生僻实体识别不出来。我们是否可以考虑左右信息熵之类的测度函数来解决这种词是否需要拆开与其前后构成词。针对词法分析推荐大家使用深度学习的方法,毕竟了解这些方法也是必须的,虽然你可以在实际种不用,但是不代表你可以偷懒而不去学习。

Hanlp-地名识别调试方法详解的更多相关文章

  1. HanLP分词命名实体提取详解

    HanLP分词命名实体提取详解   分享一篇大神的关于hanlp分词命名实体提取的经验文章,文章中分享的内容略有一段时间(使用的hanlp版本比较老),最新一版的hanlp已经出来了,也可以去看看新版 ...

  2. HTTP请求方法详解

    HTTP请求方法详解 请求方法:指定了客户端想对指定的资源/服务器作何种操作 下面我们介绍HTTP/1.1中可用的请求方法: [GET:获取资源]     GET方法用来请求已被URI识别的资源.指定 ...

  3. CURL使用方法详解

    php采集神器CURL使用方法详解 作者:佚名  更新时间:2016-10-21   对于做过数据采集的人来说,cURL一定不会陌生.虽然在PHP中有file_get_contents函数可以获取远程 ...

  4. Python调用C/C++动态链接库的方法详解

    Python调用C/C++动态链接库的方法详解 投稿:shichen2014 这篇文章主要介绍了Python调用C/C++动态链接库的方法,需要的朋友可以参考下 本文以实例讲解了Python调用C/C ...

  5. Python数据类型及其方法详解

    Python数据类型及其方法详解 我们在学习编程语言的时候,都会遇到数据类型,这种看着很基础也不显眼的东西,却是很重要,本文介绍了python的数据类型,并就每种数据类型的方法作出了详细的描述,可供知 ...

  6. telnet 命令使用方法详解,telnet命令怎么用

    telnet 命令使用方法详解,telnet命令怎么用? 文章类型:电脑教程 原创:天诺时空   什么是Telnet? 对于Telnet的认识,不同的人持有不同的观点,可以把Telnet当成一种通信协 ...

  7. php调用C代码的方法详解和zend_parse_parameters函数详解

    php调用C代码的方法详解 在php程序中需要用到C代码,应该是下面两种情况: 1 已有C代码,在php程序中想直接用 2 由于php的性能问题,需要用C来实现部分功能   针对第一种情况,最合适的方 ...

  8. (转)shell中test命令方法详解

    test命令用法.功能:检查文件和比较值 shell中test命令方法详解 原文:https://www.cnblogs.com/guanyf/p/7553940.html 1)判断表达式 if te ...

  9. Python内置方法详解

    1. 字符串内置方法详解 为何要有字符串?相对于元组.列表等,对于唯一类型的定义,字符串具有最简单的形式. 字符串往往以变量接收,变量名. 可以查看所有的字符串的内置方法,如: 1> count ...

随机推荐

  1. MySQL Data Directory -- Creating file-per-table tablespaces outside the data directory

    Creating file-per-table tablespaces outside the data directory 一. Data Directory 1.应对情况 当数据库所在空间不足的时 ...

  2. P2663 越越的组队

    原题链接  https://www.luogu.org/problem/P2663 很容易看出来是个背包问题嘛: 体积是总分的一半,求最高分,每个同学选或不选,是个 01背包问题. 自信地交上去之后发 ...

  3. Foundation-常用结构体

    复习 void test(){ struct Date{ int year; int month; int day; }; struct Date d={2015,5,14}; d.day=6; } ...

  4. MongoDB-查询关键字/排序等

    查询关键字 并列查询$and # 条件都成立才可以查询到结果 db.stutent.find({$and:[{name:"小漩涡"},{age:30}]}) 或查询$or # 有一 ...

  5. Flutter用dio封装http网络请求,设置统一的请求地址、headers及处理返回内容

    封装http请求是项目中经常需要做的,常用于设置通用请求地址.请求headers以及处理返回结果,例如在项目中开发地址.测试地址.上线地址是不一样的,当在封装的请求设置好默认地址之后只需要改一个地址而 ...

  6. 【English】What is a Java StringWriter, and when should I use it?(转帖)

    转帖地址:http://www.it1352.com/989366.html Question: What is a Java StringWriter, and when should I use ...

  7. [drf]model设置

    参考 //# 给model添加虚拟字段 class CeleryExampleResult(models.Model): task_id = models.BigIntegerField(defaul ...

  8. x86架构64位模式下的寄存器列表

    在此列出x86架构处理器在64位模式下的可用寄存器列表,方便查阅- 这里要注意的是,在64位模式下,所有通用寄存器都能访问第8位部分,低16位部分以及低32位部分. 以下是64位模式下AMD64 AB ...

  9. logback 和 log4j对比,及相关配置

    Logback 一.logback的介绍 Logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback-core,logback- classic和log ...

  10. python之selenium玩转鼠标操作(ActionChains)

    前提: 一般人用selenium自动化时,会用到模拟鼠标操作的情况,像单击,双击,右击,左击啊等,这个时候我们就要用到ActionChains了. 内容: 1.ActionChains用法整理 cli ...