
摘要:本文提出了一种利用双字耦合度和t-测试差解决中文分词中交叉歧义的方法:首先利用词典找出所有的交叉歧义,然后用双字耦合度和t-测试差的线性叠加值来判断各歧义位置是否该切分。实验结果表明,双字耦合度和t-测试差的结合要优于互信息和t-测试差的结合,因此,用双字耦合度和t-测试差的线性叠加值来消除交叉歧义是一种简单有效的方法。
关键词:计算机应用;中文信息处理;中文分词;双字耦合度;t-测试差
中图分类号:TP391 文献标识码立:A
1 引 言
随着中国社会经济的飞速发展以及互联网在中国的普及,互联网上日益增长的中文信息也被越来越多的人所重视。巨大的商业前景和重要的学术价值,吸引了来自于业界和学术界不同领域的研究人员在中文信息处理这一问题上开展研究。作为中文信息处理基础的分词技术,已经被广泛应用于中文领域的信息检索、人机交互、信息提取、文本挖掘等技术中。
歧义消除和未登录词识别是当前的分词技术中存在的两大难点。所谓歧义,是指同一个字符串存在不止一种切分形式。一般来说,歧义按照结构可以分为两种歧义类型:交集型歧义(交叉歧义)和组合型歧义(覆盖歧义)。
有研究者通过统计发现,在这两种歧义结构中,交叉歧义占到了总歧义字段的86%。因此,目前中文分词中歧义消除工作的重点通常集中于如何消除交叉歧义。
孙茂松等人提出了一种利用句内相邻字之间的互信息及t-测试差这两个统计量解决汉语自动分词中交集型歧义切分字段的方法。其初步实验显示,可以正确处理90.3%的歧义字段。在此基础上,孙茂松等人进一步提出将两者线性叠加的新的统计量md,并引入“峰”和“谷”的概念,设计了一种无词表的自动分词算法。
受上述论文的启发,本文引入了另外一种统计量——双字耦合度,并用双字耦合度代替互信息,给出一种利用双字耦合度和t-测试差的线性叠加值来消除交叉歧义的方法,并通过实验对几种不同的统计量进行了比较,发现将双字耦合度和t-测试差进行线性叠加的方法更加简单有效。
本文内容组织如下:第二节介绍本文中用到的双字耦合度、双字互信息及t-测试差等基本统计量的概念;第三节提出将双字耦合度和t-测试差相结合的方法;第四节是实验和结果分析;最后是总结。
2 两个基本统计量:双字耦合度和t-测试差
2.1 双字耦合度(Coupling Degree of Double Character,CDDC)
为了描述一个词中连续两个字的结合紧密程度,有研究者提出了双字耦合度的概念。
定义1:设ci,ci+1是两个连续出现的汉字,统计语料库中ci,ci+1连续出现在一个词中的次数和连续出现的总次数,二者之比就是ci,ci+1的双字耦合度。计算公式如下:
ci,ci+1是一个有序字对,表示两个连续汉字,且ci,ci+1不等于ci+1,ci。N(…cici+1……)表示包含了字符串ci,ci+1的词出现的频率,N(…ci|ci+1)表不ci作为上一个词的词尾且ci+1作为相邻下一个词词头出现的频率。例如:“特技”出现17次,“独特技法”出现1次,所以Couple(特,技)为0.94。
在自然语言处理中,估计两个汉字的结合强度时也常常使用互信息这个概率值。其公式为:
MI越大,表示两个字之间的结合越紧密。反之,断开的可能性越大。当x与y关系强时,MI(x,y)≥0;x与y关系弱时,MI(x,y)≈0;而当MI(x,y)<0时,x与y称为“互补分布”。
我们之所以在这里选择双字耦合度,而不是常用的互信息,是因为我们认为一个汉字对(A,B)的双字耦合度比其互信息更适合用来在交叉歧义中判断连续出现的AB属于同一个词的概率大小。互信息是计算两个汉字连续出现在一个词中的概率,而两个汉字在语料库中出现的概率情况共有三种,一是两个汉字连续出现,并且在一个词中;二是两个汉字连续出现,但分别属于两个不同的词;三是非连续出现。互信息计算的是两个汉字连续出现的可能性,然而有这样一种情况:有些汉字在语料库中出现虽然比较频繁,但是连续在一起出现比较少,然而只要是连在一起出现的,就很可能是一个词。这种情况下的互信息计算出来会比较小。但实际上二者的结合度应该是比较高的。而双字耦合度是计算两个连续汉字出现在一个词中的概率,并不考虑汉字非连续出现的情况。
例如:“教务”这个连续字符串在语料库中一共出现了16次,“教”字出现了14 945次,“务”字出现了6 015次。(教,务)的互信息只有-0.5119。如果用互信息来判断该字对之间位置的切分,是要断开的。但是实际上,字对(教,务)在语料库中出现的16次全部都是“教务”“教务长”“教务处”这几个词。连续字对(教,务)的双字耦合度是1。因此我们认为,在判断两个连续汉字之间的结合强度方面,双字耦合度要比互信息更合适一些。
当然,双字耦合度只是的计算两个连续汉字的结合强度,并没有考虑到上下文的信息。而交叉歧义的形成都是跟上下文有关的,如果仅用双字耦合度来判断,显然还是会产生不少错误。比如字符串“对比方法”,其歧义路径如下图。
图中的墨点位置为歧义位置,是需要进行判断的。正确的切分应该是“对比\方法”。但是根据双字耦合度,Couple(对,比)为0.75,Couple(比,方)为1.0,Couple(方,法)为0.97,会错误切分成“对\比方\法”。
为了减少这样的错误,所以我们引入了下面的t-测试差这个统计量。
2.2 t-测试差(Difference of T-test)
Church借鉴统计学中t检验的思想,提出了用于计算词之间结合紧密度的t公式,用于在英文中计算一个单词与另外两个单词相结合时,与其中的哪一个结合的更紧密一些。孙茂松对t公式进行了改进,使得其适用于中文分词研究。修改后的t公式为:
tx,y(y)表示汉字字符串xyz的t-测试值,其中p(z|y)和p(y|x)分别是字符串yz和xy的Bigram概率,σ2。(p(z|y)和σ2。(p(y|x)分别是二者的方差。由公式可以看出,tx,y(y)求的是y与z结合的强度和y与x结合的强度相比谁更大。若tx,y(y)大于0,则y与x结合的可能性更大一些;若tx,y(y)小于0,则y倾向于与x结合;若tx,y(y)等于0,则与前结合和与后结合的可能性差不多。
经过推导,可得:
其中,r(x,y)和r(y,z)分别表示语料库中xy和yz连续出现的次数,r(x)、r(t)分别表示x、y在语料库中出现的次数。
因为t公式求的是汉字结合强度的比较值,涉及到两个字间位置,这个值是基于字的,并非基于字间位置,因此不便于直接用来计算某个字间位置连与断的概率。因此提出了t-测试差的概念。
定义字符串xyzw中yz之间的t-测试差为:
△t=tx,z,(y)-ty,w (5)
当△t>0时,yz的字间位置倾向于判断为连接;反之判断为断开。
△t和双字耦合度都是求的字间位置连断的概率值,不过双字耦合度与上下文无关,只是的求两个字的耦合度,而△t则还要考虑所求字对的前后各一个字。这样可以弥补双字耦合度的不足之处。比如图1中的例子,用t-测试差来计算的话,△t(对,比)为13.51,△t(比,方)为-27.41,△t(方,法)为69.82,这样切分的结果是“对比\方法”。
但是单独使用t-测试差来计算也会有判断错误的时候,如图2所示,用t-测试差计算,△t(案,发)=-35.41,△t(发,现)=55.07,△t(现,场)=54。所以最后切分结果为“案/发现/场”。相反,Couple(案,发)=0.21,Couple(发,现)=0.99,Couple(现场)=1.0,“现场”的双字耦合度最高,最后切分结果为“案发/现场”。
所以,我们尝试将这两个统计量结合起来,希望能够弥补各自的不足之处。
3 基于双字耦合度和t-测试差的消歧算法
文献中提出了一种将互信息和t-测试差结合的方法。我们这里也采用同样的线性叠加法。只是我们用双字耦合度来代替互信息。因为二者的取值范围相差较大,双字耦合度范围在0~1之间,t-测试差在-834.5~753.4之间。所以线性迭加之前要进行归一化处理。
其中,μCoup和σCoup是双字耦合度的均值和均方差。μ△t和σ△t是t-测试差的均值和均方差。这四个值均由语料库统计得到。二者的叠加值为:
CDT(x,y)=Couple*(x,y)+λ×△t*(x,y) (8)
其中λ的值经过实验比较,发现取0.07时我们测试得到的切分准确率最高。
确定相关统计量的计算方法后,交叉歧义的消除算法如下:
1)利用词典扫描,找出句子中所有的交叉歧义,标记相关的歧义位置。
2)计算各歧义位置的CDT值。
3)按值的大小顺序依次判断歧义位置的切分与否。其中并不需要每个位置都进行判断,因为有一个歧义位置确定之后,和该歧义位置相关的其他歧义位置就不需要再判断,可以直接选择是切分还是连接。
4 实验结果和分析
为了证明本文方法的有效性,我们进行了一系列的实验。所有实验中,我们的训练语料库均采用北大计算语言所提供的已切分的《人民日报》(1998年1~6月)语料。通过训练,我们获得实验中的统计参数。实验包括以下两部分:第一部分主要考察双字耦合度和互信息分别对单字之间的连通度的影响;第二部分主要考察双字耦合度、互信息、t测试差组合前及组合后交叉歧义的识别情况。
4.1 双字耦合度和互信息的实验比较
首先,我们将文本拆分为单字,然后分别利用双字耦合度和互信息计算两两连续单字之间位置的连通性(大于某个阈值则判定连通,否则判定为切开)。显然,本实验可以看成是一种无词典的切分方法。我们定义字间位置切分正确率PSeg如下:
我们用SIGHAN03年的城市大学测试语料(我们通过Word将原来的繁体文本转成了简体文本)作为测试集,进行字间位置切分标记。实验结果如下:
从图中可以看出,基于双字耦合度进行单字之间连通度判定的正确率要高于基于互信息的方法。由于实验过程中没有采用任何词典,我们也可以从上图看到,采用双字耦合度进行无词典的切分,正确切分的位置也能达到90%左右。
4.2 利用几种统计量消除交叉歧义的实验比较
这部分实验步骤如第3节所述。我们采用SIGHAN05年的北京大学和微软研究院的测试语料库做开放测试。测试实验分为以下四组:
1)单独用双字耦合度判断歧义位置;
2)用t-测试差判断歧义位置;
3)用互信息和t-测试差的线性叠加值判断歧义位置;
4)用双字耦合度和t-测试差的线性叠加值判断歧义位置。
对于消歧,我们计算出正确率,即在所有交叉歧义中正确消除歧义的比率。同时我们还采用正确率和召回率计算出经过交叉歧义消除以后切分的正确率和召回率,它们的定义如下:
整个实验过程中,我们没有进行未登录词识别。消歧和切分的结果分别如表1和表2所示:
从表中可以看出,在三个语料库的测试中,基于双字耦合度和t-测试差的方法比其他三种方法的准确率和召回率都要高。虽然开放测试中北大语料库的几种结果差别不是很明显,但是在微软语料库的测试中,双字耦合度和t-测试差结合的方法分词准确率和召回率要明显高出其他三种方法。可见用双字耦合度和t-测试差的线性叠加值来消除歧义,是一种行之有效的方法。
5 总 结
本文主要介绍了一种消除中文分词中交叉歧义的方法。我们首先依靠词典匹配检测出句子中所有的交叉歧义,标记相应的歧义位置。然后计算各歧义位置的双字耦合度和t-测试差的线性叠加值CDT,根据CDT的大小判断是否切分。我们的实验结果表明,双字耦合度和t-测试差的结合要优于互信息和t-测试差的结合,用双字耦合度和t-测试差的线性叠加值来消除交叉歧义是一种简单有效的方法。
