中文分词

在《“全文检索(full-text search)”和“搜索引擎(search engine)”的区别和联系》中我们提及到了中文分词,以及《双数组Trie(Double Array Trie)实现原理的一点剖析》中阐述了高效率中文分词的实现。接下来让我们抛开双数组Trie的那些公式,从概念上来了解一下分词技术,因为英文分词相对比较简单,这里主要来了解的是中文分词。

英文是以词为单位的,词与词之间上靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思。例如,英文句子I am a student,翻译成“我是一个学生”。计算机可以很简单的通过空格知道student是一个单词,但是“学”,“生”假如分开来,计算机是无法理解的。必须把他们合在一起才变得有意义。把中文的汉字序列切分成有意义的词,就是中文分词。再比如“研究生命”,可以划分为“研究生/命”,也可以是“研究/生命”,假如是人脑可以很明显的判断出这里后者的划分更加的确切,但是计算机要做到这一点却是相当的困难。

现有的分词算法有3种:基于字符串匹配的分词算法、基于理解的分词算法和基于统计的分词算法。

 

什么是中文分词
何为分词?中文分词与其他的分词又有什么不同呢?分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。在上面的例子中我们就可以看出,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段可以通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,虽然英文也同样存在短语的划分问题,但是在词这一层上,上面的例子中我们也可以看出,中文比之英文要复杂的多、困难的多。

中文分词的意义和作用 
要想说清楚中文分词的意义和作用,就要提到智能计算技术。智能计算技术涉及的学科包括物理学、数学、计算机科学、电子机械、通讯、生理学、进化理论和心理学等等。简单的说,智能计算就是让机器“能看会想,能听会讲”,让计算机像人类一样可以快速判断出“研究生命”这样短语的切分。要想实现这样的一个目标,首先就要让机器理解人类的语言,只有机器理解了人类的语言文字,才使得人与机器的交流成为可能。再反观我们人类的语言中,“词是最小的能够独立活动的有意义的语言成分”,所以对于中文来讲,将词确定下来是理解自然语言的第一步,只有跨越了这一步,中文才能象英文那样过渡到短语划分、概念抽取以及主题分析,以至于自然语言理解,最终达到智能计算的最高境界,实现人类的梦想。目前我们常用的Google,Baidu,Yahoo这些主流的搜索引擎,还都是基于关键字(Keyword)来匹配结果的,不过可喜的是,已经有很多公司投入了大量的资金进行着自然语言检索的方式来进行查询,随着研究的进行,计算机可以理解人类的语言从而实现真正意义上的人机对话,那也将不再是遥不可及的而变得指日可待了。从现阶段的实际情况来看,英文已经跨越了分词这一步,也就是说在词的利用上已经先我们一步,并且已经展现了良好的应用前景,无论是信息检索还是主题分析的研究都要强于中文,究其根本原因就是中文要通过分词这道难关,只有攻破了这道难关,我们才有希望赶上并超过英文在信息领域的发展,所以中文分词对我们来说意义重大,可以说直接影响到使用中文的每一个人的方方面面。

中文分词的应用 
中文分词主要应用于信息检索、人机交互、信息提取、文本挖掘、中外文对译、中文校对、自动摘要、自动分类等很多方面。下面就以信息检索为例来说明中文分词的应用。 
通过近几年的发展,互联网已经离我们不再遥远。互联网上的信息也在急剧膨胀,在这海量的信息中,各类信息混杂在一起,要想充分利用这些信息资源就要对它们进行整理,如果由人来做这项工作,已经是不可能的,而如果面对中文信息不采用分词技术,那么整理的结果就过于粗糙,而导致资源的不可用,例如一个我们常见的比较经典的例子:“制造业和服务业是两个不同的行业”和“我们出口日本的和服比去年有所增长”中都有“和服”,而被当作同一类来处理,结果是检索“和服”的相关信息,会将他们都检索到,在信息量少的情况下,似乎还能够忍受,如果是海量信息,这样的结果就会令人讨厌了。通过引入分词技术,就可以使机器对海量信息的整理更准确更合理,在 “制造业和服务业是两个不同的行业”中“和服”不会被当做一个词来处理,那么检索“和服”当然不会将它检索到,使得检索结果更准确,效率也会大幅度的提高。 
所以中文分词的应用会改善我们的生活,使人们真正体会到科技为我所用。目前对分词的研究,大都集中于通用的分词算法,以提高分词准确率为目的。

目前的分词算法中,一些切分精度比较高的算法,切分的速度都比较慢;而一些切分速度快的算法,因为抛弃了一些繁琐的语言处理,所以切分精度都不高。

速度:每秒几十k~几M

切分正确率:80%~98%   

中文分词简介和困难  

中文分词(Chinese Word Segmentation):将一个汉字序列切分成一个一个单独的词。比如将“一次性交足100元”切分成“一次/性交/足/100/元”的话,那这样比较“色”的分词并不是我们所希望的。另外还有就是未登录词识别,比如“施瓦辛格”这个词字典中并没有,如何才能让计算机正确的识别出这是一个词,当然这并不是中文分词所独有的难点,英文等其他语言也都有这样的问题。

分词规范:词的概念和不同应用的切分要求

分词算法:歧义消除和未登录词识别  

分词规范方面的困难  

汉语中词的界定,也就是消除歧义

“长春市长”:“长春/市长”?“长春市/长”?“长春/市/长” ?

核心词表如何收词?

词的变形结构问题:“看/没/看见” ,“相不相信”  

分词算法上的困难  

●切分歧义的消除

交集型歧义(交叉歧义):“组合成”

我们/小组/合成/氢气了;组合/成/分子;

–组合型歧义(覆盖歧义):“马上”

他/从/马/上/下/来;我/马上/就/来/了 ;

–“学生会组织义演活动” : “学生/会/组织/义演/活动” or “学生会/组织/义演/活动”?

●未登录词识别

–命名实体:数词、人名、地名、机构名、译名、时间、货币

–缩略语和术语:“超女”、“非典”

–新词:“酱紫”、“星盘”

●先识别已知词还是先识别未登录词

–先识别已知词:“内塔尼亚/胡说”

–先识别未登录词:“胜利取决/于勇/气”  

常用评测指标  

召回率(Recall) image 准确率(Precision) image

基于词典和规则的方法  

●最大匹配

–正向最大匹配、反向最大匹配和双向最大匹配

–实现简单,而且切分速度快。但无法发现覆盖歧义,对于某些复杂的交叉歧义也会遗漏。

实际试验的结果表明,反向最大匹配的准确率要高于正向最大匹配。

●全切分

–利用词典匹配,获得一个句子所有可能的切分结果。

–时空开销非常大。

●基于理解的分词算法

–模拟人的理解过程,在分词过程中加入句法和语义分析来处理歧义问题。

–难以将各种语言信息组织成机器可直接读取的形式,还处在试验阶段   

基于规则的消歧和未登录词识别

这一步其实在语根处理 (stemming)中也可以处理,比如Snowball就是一个不错的过滤器,但是可惜的是目前的版本出错率比较高。

–规则消歧

CONDITION FIND(R,NEXT,X){%X.ccat=~w}SELECT 1

CONDITION FIND(L,NEAR,X){%X.yx=听|相信|同意}SELECT 1

CONDITION FIND(L,NEAR,X){%X.yx=假如|如果|假设|要是|若}SELECT 2

OTHERWISE SELECT 1

–用规则识别未登录词

LocationName à Person Name LocationNameKeyWord

LocationName à Location Name LocationNameKeyWord

OrganizationName à Organization Name OrganizationNameKeyWord

OrganizationName à Country Name {D|DD} OrganizationNameKeyWord  

●N元语法(N-gram)模型

image

 

隐马尔可夫模型(HMM)

对于一个随机事件,有一个状态序列{X1X2,…,Xn},还有一个观察值序列{Y1Y2,…,Yn}。隐马模型可以形式化为一个五元组(S,O,A,B),其中:

S ={q1,q2,…,qn}:状态值的有限集合

O={v1,v2,…vm}:观察值的有限集合

A={aij},aij =p(Xt+1=qj|Xt=qi):转移概率

B={bik},bik =p(Ot=vk| Xt=qi):输出概率

={ }, =p(X1=qi):初始状态分布  

N元切分法(N-gram) :对一个字符串序列以N为一个切分单位进行切分。

–如二元切分法: “ABCDEFG” →“AB\CD\EF\G”

–交叉二元切分法(Overlapping Bigram):“ABCDEFG” →“AB\BC\CD\DE\EF\FG”

–简单快速,但会产生大量无意义的标引词,导致标引产生的索引文件的空间,以及检索和进行标引的时间都大大增加。同时,因为它的切分单位并非语言学意义上的词语,所以也会导致检索的查准率下降

1.查询切分和文档切分采用相同的分词算法,有一些文件切分错误的词,在查询时也遇到相同的切分错误,所以即使切分阶段错误,但最后相同错误匹配,使得仍然可以正确检索到;

2.有些词被错误的切分成几个部分,尽管这样会导致分词正确率下降,但对于检索来说,最后可以通过结果合并得到正确的结果,分词的错误并不影响检索的性能;

3.分词测得的准确率高低并不是绝对的,有时跟用标准答案有关。这涉及到对词的定义问题,有些标准答案认为是该切分的词,实际上不切分用于检索更加准确一些。如:“国\内”vs”国内“ 、“民进党团”vs”民进\党团“vs”民进党\团“  

1.分词算法的时间性能要比较高。尤其是现在的web搜索,实时性要求很高。所以作为中文信息处理基础的分词首先必须占用尽可能少的时间。

2.分词正确率的提高并不一定带来检索性能的提高。分词到达一定精度之后,对中文信息检索的影响不再会很明显,虽然仍然还是有一些影响,但是这已经不是CIR的性能瓶颈。所以片面的一味追求高准确率的分词算法并不是很适合大规模中文信息检索。在时间和精度之间存在矛盾无法兼顾的情况下,我们需要在二者之间找到一个合适的平衡点。

3.切分的颗粒度仍然可以依照长词优先准则,但是需要在查询扩展层面进行相关后续处理。在信息检索中,分词算法只需要集中精力考虑如何消除交叉歧义。对于覆盖歧义,我们可以利用词典的二次索引和查询扩展来解决。

4.未登录词识别的准确率要比召回率更加重要。要尽量保证未登录词识别时不进行错误结合,避免因此切分出错误的未登录词。如果将单字错误的结合成未登录词了,则有可能导致无法正确检索到相应的文档。