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中实现了多种命名实体的识别:

实战HMM-Viterbi角色标注中国人名识别

层叠隐马模型下的音译人名和日本人名识别

实战HMM-Viterbi角色标注地名识别

层叠HMM-Viterbi角色标注模型下的机构名识别

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人名识别的更多相关文章

  1. 基于分布式的短文本命题实体识别之----人名识别(python实现)

    目前对中文分词精度影响最大的主要是两方面:未登录词的识别和歧义切分. 据统计:未登录词中中文姓人名在文本中一般只占2%左右,但这其中高达50%以上的人名会产生切分错误.在所有的分词错误中,与人名有关的 ...

  2. HanLP中人名识别分析

    HanLP中人名识别分析 在看源码之前,先看几遍论文<基于角色标注的中国人名自动识别研究> 关于命名识别的一些问题,可参考下列一些issue: 名字识别的问题 #387 机构名识别错误 关 ...

  3. HanLP中人名识别分析详解

    HanLP中人名识别分析详解 在看源码之前,先看几遍论文<基于角色标注的中国人名自动识别研究> 关于命名识别的一些问题,可参考下列一些issue: l ·名字识别的问题 #387 l ·机 ...

  4. HanLP中的人名识别分析详解

    在看源码之前,先看几遍论文<基于角色标注的中国人名自动识别研究> 关于命名识别的一些问题,可参考下列一些issue: u u名字识别的问题 #387 u u机构名识别错误 u u关于层叠H ...

  5. 【文智背后的奥秘】系列篇——基于CRF的人名识别

    版权声明:本文由文智原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/133 来源:腾云阁 https://www.qclou ...

  6. HanLP-基于HMM-Viterbi的人名识别原理介绍

    Hanlp自然语言处理包中的基于HMM-Viterbi处理人名识别的内容大概在年初的有分享过这类的文章,时间稍微久了一点,有点忘记了.看了 baiziyu 分享的这篇比我之前分享的要简单明了的多.下面 ...

  7. ansj人名识别

    1.前言 ansj人名识别会用到两个字典,分别是:person/asian_name_freq.data.person/person.dic. 1.1.asian_name_freq.data 这是一 ...

  8. Hanlp实战HMM-Viterbi角色标注中国人名识别

    这几天写完了人名识别模块,与分词放到一起形成了两层隐马模型.虽然在算法或模型上没有什么新意,但是胜在训练语料比较新,对质量把关比较严,实测效果很满意.比如这句真实的新闻“签约仪式前,秦光荣.李纪恒.仇 ...

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

    HanLP发射矩阵词典nr.txt中收录单字姓氏393个.袁义达在<中国的三大姓氏是如何统计出来的>文献中指出:当代中国100个常见姓氏中,集中了全国人口的87%,根据这一数据我们只保留n ...

随机推荐

  1. 基于ngx_lua的动态服务路由方案

    基于ngx_lua的动态服务路由方案 http://geek.csdn.net/news/detail/131497

  2. 分享下使用 svn,测试服务器代码自动更新、线上服务器代码手动更新的配置经验

    分享下使用 svn,测试服务器代码自动更新.线上服务器代码手动更新的配置经验 利用SVN的POST-COMMIT钩子自动部署代码 Linux SVN 命令详解 Linux SVN 命令详解2 使用sv ...

  3. 高速排序C++实现

    //高速排序 #include<iostream> #include<functional> #include<Windows.h> using namespace ...

  4. ios之快速枚举

    for(UIView * subView in self.view.subviews) { if([subView isKindOfClass:[XYZSeniorQueryView class]]) ...

  5. clientX, clientY,offsetX, offsetY,screenX, screenY, x, y

    clientX, clientY是鼠标当前相对于网页的位置,当鼠标位于页面左上角时clientX=0, clientY=0: offsetX, offsetY是鼠标当前相对于网页中的某一区域的位置,当 ...

  6. Android 性能优化的一些方法

    1.采用硬件加速,在androidmanifest.xml中application添加  android:hardwareAccelerated="true".不过这个需要在and ...

  7. 异步图片下载引擎(升级版——ExecutorService+handler)

    [Android分享] 异步图片下载引擎(升级版——ExecutorService+handler)  [复制链接]     皮诺 13 主题 5 好友 844 积分 No.4 中级开发者 升级  2 ...

  8. 关于面试总结8-http协议相关面试题

    前言 在PC浏览器的地址栏输入一串URL,然后按Enter键这个页面渲染出来,这个过程中都发生了什么事?这个是很多面试官喜欢问的一个问题 如果测试只是停留在表面上点点点,不知道背后的逻辑,是无法发现隐 ...

  9. linux内核netfilter模块分析之:HOOKs点的注册及调用

    转自;http://blog.csdn.net/suiyuan19840208/article/details/19684883 -1: 为什么要写这个东西?最近在找工作,之前netfilter 这一 ...

  10. Java判断多个时间段是否重叠(重叠区间个数)

    import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * 判断多个时间段是否出现重叠 ...