关键字 中文分词,未登录词识别,中文姓名识别
中文姓名识别作为未登录词识别的一部分是中文信息处理中一个很复杂的问题。第一,姓名随着时间的改变而不断增加。第二,中文文本中的中文姓名没有像西方语言中的形态特征作为识别的标记。第三,有些人为避免重名而独辟蹊径,待之而来的是大量的异体字,生僻字、自造字[1]。同时中文姓名占未登录词的15%左右[1],故中文姓名识别对未登录词识别及中文分词有着重要意义。
目前中文姓名识别的方法有很多种,大致可以分为确定候选姓名和确定姓名两个阶段。在文献[2]中通过建立姓名资料库的方法进行中文姓名识别[2],在文献[1]中利用类向量模型进行中文姓名的识别[3]。本文提出了一种基于规则和语料库并利用2-gram进行中文姓名识别的方法,利用在语料库中进行互信息的学习,并结合识别规则在已经进行切分后的文本中对切分碎片作中文姓名的识别,经开放测试,召回率为85.1%,准确率为89.2%。
2 基于规则和语料库的中文姓名识别
2.1 假设与定义
考虑到中文姓名的构词特点[5],做以下假设:①中文姓名长度最长为四字(即复姓加双名);②中文姓名长度最短为二字(即单姓加单名);③双名成词视为单名处理。
设:中文姓名字符串可以表示为WhXiMjEkWt。
其中:Wh表示姓名前置词;Xi表示姓氏集,可以是单姓,也可以是复姓;Mj为名字首字的集合,Ek为名字尾字的集合,在Mj为空时姓名为单名(sn),不为空时姓名为复名(pn);Wt表示姓名后置词。
相应的针对上面的姓名字符串有如下的定义[1]:
1)姓名前置词使用度

2)姓氏使用度

3)名字首字使用度

4)名字尾字使用度

5)姓名后置词使用度

6)姓名概率估计值[1]
针对单名(sn)和复名(pn)的不同情况并考虑到姓名与上下文汉字之间的关系,本文提出了一种利用2-gram来估计姓名概率值的方法来计算姓名的2-gram概率估计值:
①单名情况:P(sn)=H(W|name)×P(X)×S(E)×R(W|name);
②复名情况:P(pn)= H(W|name)×P(X)×F(M)×S(E)×R(W|name)。
其中H(W|name)是该词作为姓名的前置词出现的条件概率,R(W|name)为该词作为后置词出现的条件概率,这样计算出概率的估计值,并与相应的阈值进行比较以确定是否为姓名。
2.2 构建知识库
根据2.1的定义,需要构建相应的知识库以记录在语料库中学习到的信息,相应的需要统计前置词、姓氏、名首字、名尾字、姓名后置词相应出现的次数和他们在语料库中出现的总次数,计算出相应的概率,并记录到知识库中,供进行姓名识别时使用。
知识库在结构上用hash结构,分别针对前置词、后置词、姓氏、名首字和名尾字建立相应的五个不同的hash表记录下在语料库中学习到的相应的概率信息。其中每个表采用的hash结构为单字hash结构,即以每个词或字的第一个字为hash表的key,剩余的字符串及其概率为value,如果为单字则为空。具体的结构如下图1所示。

图 1
在语料库的学习中生成五个不同的hash表,并计算相应的概率。这种结构下在进行姓名识别的时候可以根据相应字符串的第一个字找到相应字符,在匹配的过程中根据相应剩余字符串的长度进行匹配。
2.2 阈值确定
系统中还有一张记录不同姓氏阈值的表,因为中文中各姓氏的使用频率并不一样,对所有的姓名采用同一个阈值是不合适的,所以针对每个不同的姓氏采用不同的阈值,使文本中姓氏使用度较大的汉字召回率较高,姓氏使用度较小的汉字准确率较高。在识别中兼顾召回率和准确率,以减少识别错误,提高姓名识别正确率[1]。
根据2.1的姓名概率估计值的定义,可以确定姓氏x的最小阈值:
Tmin(x)pn= H(W|name)×P(X)×MiN(F(M)×S(E)) ×R(W|name) 复名情况
Tmin(x)sn= H(W|name)× P(X)×MiN(S(E)) ×R(W|name) 单名情况
相应的姓名评价函数[4]:lnP(x)>βx
其中:P(x)为姓名的概率估计值,βx为姓氏x的姓名阈值:βx=αx×ln(Tmin(x))
αx为阈值调整因子: 

此评价函数的含义是:
对于文本中任意一个满足中文姓名的字符串XiMjEk,
(1) 如果P(x)=100%,且lnp(x)>lnTmin(x),则该字串是姓名。
(2) 如果P(x)!=100%,且lnp(x)> αx lnTmin(x),则该字串是姓名。
其中的最小阈值及调整因子都是通过大规模语料库进行学习得到。