HanLP收词特别是实体比较多,所以特别容易形成误识别。下边举几个地名误识别的例子,须要指出的是,后边的机构名识别也以地名识别为基础,所以,若是地名识别不许确,也会致使机构名识别不许确。app
类型1 数字+地名机器学习
[1] 暗访哈尔滨网约车:下10单来7辆“黑车” 1辆套牌ide
[2] 房天下每日成交5月12日海宁商品房销售备案43套函数
[3] 广西近视手术专家-黄明汉院长9月9日百色见面会学习
类型2 前词+地名首词成词或地名尾词+后词成词测试
[1] 西安国企4000元工资至关于私企多少钱?spa
[2] 七月份从包头到山东,十五天左右,有自驾游路线推荐吗?深度学习
[3] 最受考研人欢迎的城市,有你报考高校所在的城市吗?it
类型3 地名自己成词io
[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解决方法不是根本方法,直接去除掉某些词,会致使一些生僻实体识别不出来。咱们是否能够考虑左右信息熵之类的测度函数来解决这种词是否须要拆开与其先后构成词。针对词法分析推荐你们使用深度学习的方法,毕竟了解这些方法也是必须的,虽然你能够在实际种不用,可是不表明你能够偷懒而不去学习。