命名实体识别中最难的部分当属实体机构名了,这是因为机构名的组成成分十分复杂,可以是人名、地名、序数词、企业字号甚至是上级机构名。本文介绍一种基于角色标注的层叠HMM模型下中文机构名识别方法。目前代码已整合到HanLP中,即将开源。
开源项目
本文代码已集成到HanLP中开源:http://www.hankcs.com/nlp/hanlp.html
原理
基本原理请参考《实战HMM-Viterbi角色标注地名识别》,不再赘述。
与人名和地名识别稍有不同的是,在命名实体识别之前,需要先执行人名和地名识别,将粗分结果送入HMM模型求解,得出细分结果后才能进行,这是因为人名和地名也是机构名中的常见成分。这是与《实战HMM-Viterbi角色标注地名识别》《实战HMM-Viterbi角色标注中国人名识别》这两个姊妹篇最显著的不同。
训练
角色标注
参考《基于角色标注的中文机构名识别.doc》,采用如下角色——
角色 |
意义 |
例子 |
A |
上文 |
参与亚太经合组织的活动 |
B |
下文 |
中央电视台报道 |
X |
连接词 |
北京电视台和天津电视台 |
C |
特征词的一般性前缀 |
北京电影学院 |
F |
特征词的译名性前缀 |
美国摩托罗拉公司 |
G |
特征词的地名性前缀 |
交通银行北京分行 |
H |
特征词的机构名前缀 |
中共中央顾问委员会 |
I |
特征词的特殊性前缀 |
中央电视台 |
J |
特征词的简称性前缀 |
巴政府 |
D |
机构名的特征词 |
国务院侨务办公室 |
Z |
非机构名成份 |
表格 1中文机构名称构成角色
这些角色远远不够,在HanLP中,还拓展了数词和方位词等等。
比如下列熟语料:
参与/v [北京/ns 电影/n 学院/nis]/nt 和/cc [美国/nsf 辛普森/nr 公司/nis]/nt 的/ude1 活动/vn ,/w 由/p [交通/n 银行/nis 北京/ns 分行/n]/nt 与/cc 麦当劳/nt 赞助/v ,/w [巴/b 政府/nis]/nt 和/cc [中共中央/nt 顾问/nnt 委员会/nis]/nt 指导/vn ,/w [中央/n 电视台/nis]/nt 报道/v
经过自动角色转换程序转化为:
原始语料 [参与/v, [北京/ns 电影/n 学院/nis]/nt, 和/cc, [美国/nsf 辛普森/nr 公司/nis]/nt, 的/ude1, 活动/vn, ,/w, 由/p, [交通/n 银行/nis 北京/ns 分行/n]/nt, 与/cc, 麦当劳/nt, 赞助/v, ,/w, [巴/b 政府/nis]/nt, 和/cc, [中共中央/nt 顾问/nnt 委员会/nis]/nt, 指导/vn, ,/w, [中央/n 电视台/nis]/nt, 报道/v] 添加首尾 [始##始/S, 参与/v, [北京/ns 电影/n 学院/nis]/nt, 和/cc, [美国/nsf 辛普森/nr 公司/nis]/nt, 的/ude1, 活动/vn, ,/w, 由/p, [交通/n 银行/nis 北京/ns 分行/n]/nt, 与/cc, 麦当劳/nt, 赞助/v, ,/w, [巴/b 政府/nis]/nt, 和/cc, [中共中央/nt 顾问/nnt 委员会/nis]/nt, 指导/vn, ,/w, [中央/n 电视台/nis]/nt, 报道/v, 末##末/Z] 标注上文 [始##始/S, 参与/A, [北京/ns 电影/n 学院/nis]/nt, 和/A, [美国/nsf 辛普森/nr 公司/nis]/nt, 的/ude1, 活动/vn, ,/w, 由/A, [交通/n 银行/nis 北京/ns 分行/n]/nt, 与/A, 麦当劳/nt, 赞助/v, ,/A, [巴/b 政府/nis]/nt, 和/A, [中共中央/nt 顾问/nnt 委员会/nis]/nt, 指导/vn, ,/A, [中央/n 电视台/nis]/nt, 报道/v, 末##末/Z] 标注下文 [始##始/S, 参与/A, [北京/ns 电影/n 学院/nis]/nt, 和/B, [美国/nsf 辛普森/nr 公司/nis]/nt, 的/B, 活动/vn, ,/w, 由/A, [交通/n 银行/nis 北京/ns 分行/n]/nt, 与/B, 麦当劳/nt, 赞助/B, ,/A, [巴/b 政府/nis]/nt, 和/B, [中共中央/nt 顾问/nnt 委员会/nis]/nt, 指导/B, ,/A, [中央/n 电视台/nis]/nt, 报道/B, 末##末/Z] 标注中间 [始##始/S, 参与/A, [北京/ns 电影/n 学院/nis]/nt, 和/X, [美国/nsf 辛普森/nr 公司/nis]/nt, 的/B, 活动/vn, ,/w, 由/A, [交通/n 银行/nis 北京/ns 分行/n]/nt, 与/X, 麦当劳/nt, 赞助/B, ,/A, [巴/b 政府/nis]/nt, 和/X, [中共中央/nt 顾问/nnt 委员会/nis]/nt, 指导/B, ,/A, [中央/n 电视台/nis]/nt, 报道/B, 末##末/Z] 处理整个 [始##始/S, 参与/A, 未##地/G, 电影/C, 学院/D, 和/X, 未##地/G, 未##人/F, 公司/D, 的/B, 活动/Z, ,/Z, 由/A, 交通/C, 银行/D, 未##地/G, 分行/D, 与/X, 麦当劳/K, 赞助/B, ,/A, 巴/J, 政府/D, 和/X, 未##团/K, 顾问/C, 委员会/D, 指导/B, ,/A, 中央/C, 电视台/D, 报道/B, 末##末/Z]
统计词频
在对所有熟语料句子执行自动标注后,即可统计每一个非Z词语的各角色词频,得到一个角色词典:
公司 D 4621 A 24 B 24 公司总部 B 1 公司治理 B 2 公司股票 B 1 公告 B 15 X 1 公告栏 B 2 公园 C 9 公安 C 728 A 19 B 5 公安分局 A 18 公安厅 D 226 A 4 公安处 D 183 公安学 B 4 公安局 D 2251 A 5 公安机关 B 10 ……
统计转移矩阵
转移矩阵指的是从一个角色标签转移到另一个角色的频次,利用它和角色词频可以计算出HMM中的初始概率、转移概率、发射概率,进而完成求解。关于维特比算法和实现请参考《通用维特比算法的Java实现》。
这里对人民日报2014切分语料训练出如下转移矩阵:
识别
例子
以“济南杨铭宇餐饮管理有限公司是由杨先生创办的餐饮企业”为例,不进行机构名识别时,会得出下列输出:
[济南/ns, 杨铭宇/nr, 餐饮/n, 管理/vn, 有限公司/nis, 是/vshi, 由/p, 杨先生/nr, 创办/v, 的/ude1, 餐饮/n, 企业/n]
上例中该公司的各个成分被拆散,无法组成完整的机构名
角色标注
地名角色观察:[ S 1162194 ][济南 G 83472 B 1200 A 470 D 84 X 4 ][杨铭宇 F 4309 B 769 A 266 D 254 X 6 ][餐饮 C 58 B 12 ][管理 C 706 B 70 A 5 ][有限公司 D 2861 A 1 B 1 ][是 A 2340 B 353 X 20 P 2 ][由 A 1579 B 16 X 11 ][杨先生 F 4309 B 769 A 266 D 254 X 6 ][创办 A 20 B 5 ][的 B 7092 A 4185 X 20 ][餐饮 C 58 B 12 ][企业 C 86 A 42 B 11 X 6 ][ B 710 ] 地名角色标注:[ /S ,济南/G ,杨铭宇/F ,餐饮/C ,管理/C ,有限公司/D ,是/B ,由/A ,杨先生/F ,创办/A ,的/B ,餐饮/C ,企业/C , /B]
模式匹配
利用Aho-Corasick算法模式匹配如下模式串:
CCCD PPD PPDCD PPFCCD PPFCD ……
事实上,全部的模式串非常多:nt.pattern.txt
得到如下机构名:
识别出机构名:济南杨铭宇餐饮管理有限公司 GFCCD
第二层隐马模型细分
其实这应该算是第四层隐马模型,粗分用到一次,因为地名识别中也用到了一次HMM,细分又用到一次,细分的输出是这次的输入。这次细分之后得出最终的结果:
[济南杨铭宇餐饮管理有限公司/nt, 是/vshi, 由/p, 杨先生/nr, 创办/v, 的/ude1, 餐饮/n, 企业/n]
总结
多层HMM模型可以在消耗性能的前提下提高精准度,识别命名实体。
目前人民日报语料中有不少错误,并且主要集中在政府机构,为了补充公司等机构,我找到了一个公司名词典,切分后得到一个伪熟语料库:
[北京/ns 华安/ns 通达/v 科技/n 有限公司/nis]/ntc [北京/ns 京文/nz 联发/nz 教育/vn 文化/n 有限公司/nis]/ntc [北京东方/nz 商机/n 喷码/nz 技术/n 有限公司/nis]/ntc [北京/ns 海信/nz 箱包/n 发展/vn 有限公司/nis]/ntc [北京/ns 恒正/nr 金建/ns 仪器/n 有限公司/nis]/ntc [北京/ns 海腾威/nr 商贸/n 中心/nis]/ntc ……
将前100条发布出来作为示例:公司名切分语料.txt
然后执行上述自动标注,补充到此模型词典中,使得HanLP能够同时支持政商二用。
关于上面说到的公司名语料,现在分享出来:http://pan.baidu.com/s/1sjK4EOt
解压密码:www.hankcs.com
请问第一次自动标注的时候如何为命名实体组成词分配C,F,I,G,J,H等角色的?这个也需要一次标注?还是靠词典实现的?
您好博主,最后一层HMM把济南杨铭宇餐饮管理有限公司的词性标记为nt,怎么做到的?HMM训练的时候肯定没有收录这个词啊,这个词不存在发射概率
博主你好,请问你的自动角色转换程序是哪里的?谢谢了
同求
博主您好!
请教您两个问题:
1.”由被告人保武清支公司在交强险限额内赔偿2000元”这句话中识别出机构名”赔偿2000元”,而没有识别出”保武清支公司”。
机构名角色观察为:
[保武清 F 6781 B 769 A 266 X 6 ][支公司 K 1000 D 1000 ][赔偿 B 24 A 1 C 1 ][2000 M 1000 ][元 P 47 D 2 A 1 ]
机构名角色标注为:
[ /S ,由/A ,被告人/Z ,保武清/A ,支公司/K ,在/X ,交强险/F ,限额/Z ,内/A ,赔偿/C ,2000/M ,元/D , /S]
这里观察结果和标注结果有差别是什么原因啊?是不是在标注过程中有其他因素考虑?
2.很多带数字的词被标注为机构名,可能是因为tag中有M这个标签,而且模式匹配的时候匹配到了,这里我想修改一些带M标签的模式串,在哪里修改比较好呢?
感谢反馈,简而言之
1、https://github.com/hankcs/HanLP/commit/98c84094b1cbc9c8f6030e98f875eed926822b65
2、com/hankcs/hanlp/dictionary/nt/OrganizationDictionary.java
https://github.com/hankcs/HanLP/blob/3f32be48c373e2ed27c3e0538a47a66d229feb38/src/main/java/com/hankcs/hanlp/corpus/tag/NT.java
楼主,上文模板中的P是什么意思?
博主你好!
“反对新安保法”这句话切分结果是:反对/v新安/ns/保/法,词典中“反对@未##地”有90频,我在词典中添加“反对@新安保法 100”,然而分词结果仍然出错,debug时发现vterbi选择的是weight最大的结果,0.1*freq{"反对"}+0.9*freq{“反对@新安保法”}<0.1*freq{"反对"}+0.9*freq{“反对@新安”}+0.1*freq{"新安"}+0.9*freq{“新安@保”}+0.1*freq{"法"}+0.9*freq{“保@法”},突然发现对“反对@新安保法”好不公平!最后为了达到我的目的,我在词典中添加“反对@新安保法 1000”,O(∩_∩)O哈哈~
博主你好!
1、“出席纪念大会”这一句话,‘纪念大会’被识别为机构名,机构名角色观察:[ S 1169907 ][出席 A 36 B 14 ][纪念 A 4 C 3 B 2 ][大会 C 149 B 18 D 4 ][ B 8423 ],把‘纪念C3’删除,结果可能会正确!我在想,纪念一词可能作为特征词的一般性前缀吗?
2、在机构词典中,地名的词性有D 46,导致好多地名结尾的句子被识别为机构名,如果把D 46删除,是不是好一点。
1、确实出现了3次,不多,删掉也挺好。
2、可以的。
另外,训练语料是机器整理的,质量不高。我计划重新改进这部分。
博主您好,我想问下,在命名实体识别中都有一个统计词语的角色词频的熟语料,这个熟语料是什么?
处理后的人民日报分词语料
那这个熟语料在data文件夹里面是不是没有?
对
博主您好,如果我想把您用的处理后 的人名日报分词语料换成我自己的熟语料来进行词语的角色词频的统计,要怎么做呢?
博主,咨询下。您这里共享的公司名称词典,按照您的意思是1、首先进行分词切分,并标注词性;2、然后进行自动标注;3、最后补充在模型词典中。请问第2、3步在开源代码的哪个部分实现?谢谢!
我想这些公司名称词典应该不是直接用来当词典用吧?
不是,你需要理解这篇论文才能明白怎么操作。
额请问是哪篇论文T.T