ICTCLAS中的HMM人名识别
http://www.hankcs.com/nlp/segment/ictclas-the-hmm-name-recognition.html
本文主要从代码的角度分析标注过程中的细节,理论谁都能说,但没几人能做出一个实用高效的系统。在得出粗分结果之后,需要对其进行人名、翻译人名、地名识别,然后重新KSP得出最终结果,在ICTCLAS中,这些标注都是通过HMM模型实现的。

人名识别例子
以“王菲”为例,粗分结果是“始##始, 王, 菲, 末##末,”,很明显,粗分过程并不能识别正确的人名,因为“王菲”这个词并不存在于一元语言模型词典中。
HMM模型
因为人名识别是一个HMM的求解问题,所以需要建立HMM模型。接下来详细说明HMM的五个要素:
观测序列
观测序列是我们能看到的显状态序列,这个例子里是“始##始, 王, 菲, 末##末,”。
隐状态
隐状态是下面的标注集(红色部分):
编码
代码
意义
例子
B
Pf
姓氏
张华平先生
C
Pm
双名的首字
张华平先生
D
Pt
双名的末字
张华平先生
E
Ps
单名
张浩说:“我是一个好人”
F
Ppf
前缀
老刘、小李
G
Plf
后缀
王总、刘老、肖氏、吴妈、叶帅
K
Pp
人名的上文
又来到于洪洋的家。
L
Pn
人名的下文
新华社记者黄文摄
M
Ppn
两个中国人名之间的成分
编剧邵钧林和稽道青说
U
Ppf
人名的上文和姓成词
这里有关天培的壮烈
V
Pnw
人名的末字和下文成词
龚学平等领导, 邓颖超生前
X
Pfm
姓与双名的首字成词
王国维、
Y
Pfs
姓与单名成词
高峰、汪洋
Z
Pmt
双名本身成词
张朝阳
A
Po
以上之外其他的角色
表1 中国人名的构成角色表
红色部分是标签,在本文中,我会混用“标签”“隐状态”“tag”这三个词,不再赘述。
这十五种标签储存在nr.ctx中,分别对应于15个不重复的整型数字:
0 1 2 3 4 5 6 11 12 13 23 24 25 100 101
但是究竟哪个数字对应哪个标签呢?代码中是按照result += (char) (tag + 'A');来映射的,不过100和101会被映射到字母表之外,
0-a 1-b 2-c 3-d 4-e 5-f 6-g 11-l 12-m 13-n 23-x 24-y 25-z 100-Å 101-Æ
看来free版的ictclas并没有按照这篇论文走,或者说论文和代码的发布时间不同,论文做了改进。
这样好了,反正人名识别的最终一步模式匹配只用到了下列标签,这要下列标签能够正常映射,就没有影响。下文中,对于字母表之外的标签,统统用*表示。
B 姓 C 名1 D 名2 E 单名 G 人名后缀 X 姓双名首字成词 Z 双名成词 F 前缀 Y 姓单名成词
打开词典仔细观察了一下,发现
100-对应(始)##始
101-对应(末)##末
此外其他的数字对应的词语也与论文中的标注不同,看来我有必要重新训练一个HMM了,等有空了再说吧。
2014-11-03更新:我做了个新项目HanLP,可以实现了分词与人名识别,请参考《实战HMM-Viterbi角色标注中国人名识别》。
初始概率
初始概率指的是一个隐状态随机出现的概率,可以用某个隐状态的频度除以所有隐状态的频度来计算。每个标签的频度可以从词典中查到:
6937450 92626 69241 70479 14295 870 869 65949 78874 14025 1238 3351 5397 329805 0
转移概率
转移概率是指前面的隐状态固定,后面的隐状态是X时候的概率。这个转移概率表可以通过一个15 * 15的表格来体现:
No. 0= 0: 6561586 0 0 0 0 0 0 56875 0 0 0 0 0 0 318989 total=6937450:
No. 1= 1: 0 1104 63434 0 14078 1 869 0 7367 290 4 6 5393 0 80 total=92626:
No. 2= 2: 0 0 0 69241 0 0 0 0 0 0 0 0 0 0 0 total=69241:
No. 3= 3: 0 2968 39 0 10 0 0 0 53252 10487 36 29 0 0 3658 total=70479:
No. 4= 4: 0 183 95 0 26 0 0 0 10684 2036 4 1 4 0 1262 total=14295:
No. 5= 5: 0 870 0 0 0 0 0 0 0 0 0 0 0 0 0 total=870:
No. 6= 6: 0 0 0 0 0 0 0 0 835 32 0 0 0 0 2 total=869:
No. 7= 11: 0 58200 4226 0 125 668 0 0 0 0 790 1940 0 0 0 total=65949:
No. 8= 12: 71721 0 0 0 0 0 0 1786 0 0 0 0 0 0 5367 total=78874:
No. 9= 13: 0 13167 247 0 22 28 0 0 0 0 221 340 0 0 0 total=14025:
No.10= 23: 0 0 0 1238 0 0 0 0 0 0 0 0 0 0 0 total=1238:
No.11= 24: 0 65 2 0 2 0 0 0 2865 359 0 10 0 0 48 total=3351:
No.12= 25: 0 296 1 0 1 1 0 0 3871 821 6 1 0 0 399 total=5397:
No.13=100: 304143 15773 1197 0 31 172 0 7288 0 0 177 1024 0 0 0 total=329805:
No.14=101: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 total=0:
发射概率
发射概率可以通过nr.dic查询,给定一个词“菲”,通过查字典我们可以找到
wordLen:0 frequency:2 tag:3 word:(菲)
wordLen:0 frequency:4 tag:4 word:(菲)
分别对应双名的第二个字或单名,也就是刘亦菲和王菲的两个“菲”。那么从tag:4发射到“菲”的概率就等于(frequency:4 tag:4 word:(菲)) / (frequency:tag-4) = 4 / 70479
求解HMM
接下来就可以通过维特比算法找出最可能的标注序列了,这个算法的详解和代码在《HMM与分词、词性标注、命名实体识别》。ICTCLAS的代码感觉太繁杂了,要旨不突出,有空我要重写一下。
最终标注结果:
始##始, 王, 菲, 末##末,
100-* 1-B 4-E 101-*
模式匹配
对于*BE*这个标注序列,如何知道里面是否含有人名,含有的是哪种人名呢?这需要通过模式匹配来发现,ICTCLAS中用到的模式串有:
BBCD:姓+姓+名1+名2;
BBE: 姓+姓+单名;
BBZ: 姓+姓+双名成词;
BCD: 姓+名1+名2;
BE: 姓+单名;
BEE: 姓+单名+单名;韩磊磊
BG: 姓+后缀
BXD: 姓+姓双名首字成词+双名末字
BZ: 姓+双名成词;
B: 姓
CD: 名1+名2;
EE: 单名+单名;
FB: 前缀+姓
XD: 姓双名首字成词+双名末字
Y: 姓单名成词
一般人的想法是机械的匹配,匹配到什么就是什么。但是这里面其实是有复杂的规则的,而且都是一些经验规则。比如:
Rule 1 for exclusion:前缀+姓+名1(名2): 规则(前缀+姓)失效;
Rule 2 for exclusion:姓+单名+单名:单名+单名 若EE对应的字不同,规则失效.如:韩磊磊
Rule 3 for exclusion: 若姓后不是后缀,规则失效.如:江主席、刘大娘
……
我们的*BE*匹配到了BE: 姓+单名这条规则,所以是一个单名人名,最终识别出结果:
王菲
在ICTCLAS中,会将单名人名(BE)的出现概率乘以“王菲是单名人名”的概率,作为二次发射的概率,送入到细分词图中,等待第二次KSP,这些都是后话了。
不足
这种标注+模式匹配的识别方法非常依赖上下文,比如:
在有上下文的时候能够正常识别:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
张婧同学张婧 /nr 同学 /n 张婧说张婧 /nr 说 /v 才女张婧才 /c 女 /b 张婧 /nr 送给张婧送给 /v 张婧 /nr |
但是在缺少上下文的时候识别失败:
|
1
2
|
张婧张 /nr 婧 /g |
最令人无法容忍的就是在有上下文的时候也会识别失败:
|
1
2
3
4
5
|
陈膺奥部长陈 /nr 膺 /vg 奥 /j 部长 /n 陈膺奥陈 /nr 膺 /vg 奥 /j |
我认为这是字典中根本没有“婧”“奥”的原因造成的,如果能够扩充词典,应该可以解决这个问题。
改进
我已在HanLP中实现了多种命名实体的识别:
Reference
http://www.cnblogs.com/zhenyulu/articles/675217.html
http://www.blogjava.net/jiangyz/archive/2007/12/28/171335.html
《基于角色标注的中国人名自动识别研究》张华平zhanghp@software.ict.ac.cn 刘群 (Liu Qun)Liuqun@ ict.ac.cn
转载请注明:码农场 » ICTCLAS中的HMM人名识别
ICTCLAS中的HMM人名识别的更多相关文章
- 基于分布式的短文本命题实体识别之----人名识别(python实现)
目前对中文分词精度影响最大的主要是两方面:未登录词的识别和歧义切分. 据统计:未登录词中中文姓人名在文本中一般只占2%左右,但这其中高达50%以上的人名会产生切分错误.在所有的分词错误中,与人名有关的 ...
- HanLP中人名识别分析
HanLP中人名识别分析 在看源码之前,先看几遍论文<基于角色标注的中国人名自动识别研究> 关于命名识别的一些问题,可参考下列一些issue: 名字识别的问题 #387 机构名识别错误 关 ...
- HanLP中人名识别分析详解
HanLP中人名识别分析详解 在看源码之前,先看几遍论文<基于角色标注的中国人名自动识别研究> 关于命名识别的一些问题,可参考下列一些issue: l ·名字识别的问题 #387 l ·机 ...
- HanLP中的人名识别分析详解
在看源码之前,先看几遍论文<基于角色标注的中国人名自动识别研究> 关于命名识别的一些问题,可参考下列一些issue: u u名字识别的问题 #387 u u机构名识别错误 u u关于层叠H ...
- 【文智背后的奥秘】系列篇——基于CRF的人名识别
版权声明:本文由文智原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/133 来源:腾云阁 https://www.qclou ...
- HanLP-基于HMM-Viterbi的人名识别原理介绍
Hanlp自然语言处理包中的基于HMM-Viterbi处理人名识别的内容大概在年初的有分享过这类的文章,时间稍微久了一点,有点忘记了.看了 baiziyu 分享的这篇比我之前分享的要简单明了的多.下面 ...
- ansj人名识别
1.前言 ansj人名识别会用到两个字典,分别是:person/asian_name_freq.data.person/person.dic. 1.1.asian_name_freq.data 这是一 ...
- Hanlp实战HMM-Viterbi角色标注中国人名识别
这几天写完了人名识别模块,与分词放到一起形成了两层隐马模型.虽然在算法或模型上没有什么新意,但是胜在训练语料比较新,对质量把关比较严,实测效果很满意.比如这句真实的新闻“签约仪式前,秦光荣.李纪恒.仇 ...
- hanlp自然语言处理包的人名识别代码解析
HanLP发射矩阵词典nr.txt中收录单字姓氏393个.袁义达在<中国的三大姓氏是如何统计出来的>文献中指出:当代中国100个常见姓氏中,集中了全国人口的87%,根据这一数据我们只保留n ...
随机推荐
- ROS知识(23)——行为树Behavio Tree原理
机器人的复杂行为的控制结构CA(Contrl Architecture)通常使用有限状态机来实现,例如ROS提供的smach.行为树是另外一种实现机器人控制的方法,ROS下代表的开源库有pi_tree ...
- 使用 IntraWeb (18) - 基本控件之 TIWImage、TIWImageFile、TIWImageList
TIWImage //用于显示资源中的图片, 设计时通过 Picture 载入图片到资源 TIWImageFile //用于显示给定路径或地址的图片 TIWImageList //它继承于 TImag ...
- dubbox REST服务使用fastjson替换jackson
上一节讲解了resteasy如何使用fastjson来替换默认的jackson,虽然dubbox内部采用的就是resteasy,但是大多数情况下,dubbox服务是一个独立的app,并不需要以war包 ...
- android 的几个黄色警告解决办法(转)
转自:http://my.eoe.cn/864234/archive/5162.html 1:Handler 1 2 3 4 5 6 7 8 // This Handler class should ...
- 【来龙去脉系列】深入理解DIP、IoC、DI以及IoC容器
摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...
- android依据区域高度切割文本问题
android字体显示涉及例如以下參数:1. 基准点是baseline:2. Ascent是baseline之上至字符最高处的距离:3. Descent是baseline之下至字符最低处的距离.4. ...
- 使用Java进行串口SerialPort通讯
1.准备工作 在进行串口连接通讯前,必须保证你当前操作电脑上有可用且闲置的串口.因为一般的电脑上只有一个或者两个串口,如COM1或COM2,但大多数情况下,这些串口可能会被其他的程序或者 ...
- android音乐播放器开发 SweetMusicPlayer 摇一摇换歌
上一篇写了怎样在线匹配歌词,http://blog.csdn.net/huweigoodboy/article/details/39878063,如今来讲讲摇一摇功能开发. 相同用了一个Service ...
- 解决winform中mdi子窗体加载时显示最大化最小化按钮的方法
场景:在mid加载子窗体的时候如果指定WindowState为Maximized,加载完成后主窗体会显示最大化.最小化.关闭的按钮图标. 解决方法: 1.更改主窗体FormMain的属性.制定Main ...
- Snmp学习总结系列——开篇
进入公司以来,一直参与到公司的产品研发工作当中去,在产品研发中有一个监控远程服务器CPU使用率,内存使用情况,硬盘的需求,技术总监提出了使用Snmp协议作为远程监控的技术解决方案,头一次听说Snmp这 ...