全文检索词语索引化

词语索引化包含了2 层意思,一个是如何把文本变成词语序列,一个是选择什么样的短语作为索引短语。第一部分按照大家熟悉的说法,就是分词。

第二部分就是索引短语选择。

下面分开描述。

分词

分词的目的是把文本切分成一个一个的词语。

注意,这里的词语可以被认为是短语,因为词语的概念很不明确(多年来,学术界并没有在这个问题上面达成一致,虽然有一些规范,如92 年的《信息处理用现在汉语分词规范》,但被认为是自相矛盾。

这种观点主要来自于北大中文论坛(http://www.pkucn.com/)和HNC 层次模型)。一般我们以北大计算语言研究所的语料标注规范作为分词标准,参考《北京大学现代汉语语料库基本加工规范》。

分词包含了如下几个步骤:

分词技术
西方文字一般不需要分词,因为它们都有明确的词语标记(空格或者标点)。

亚洲国家的很多语言并没有明确的词语标记,比如,中日韩三国语言。没有明确词语标记的语言文本,就需要分词。我们常说的分词一般直接指中文分词。

中文分词技术分为2 类:基于规则和基于统计。基于规则的中文分词技术是通过某种特定的规则来切分文本,也就是机械分词;基于统计的中文分词技术是根据已有的切分样本,来预测未知文本的切分。

基于规则的分词技术,常见的有如下几种:

连续多字成词

把连续的几个汉字当作词语,这是最简单的分词技术。比如,对于文本“中国人”来说,在2 字成词的规则下,切分出来的词语为:“中国”和“国人”。这种分词方法的最大缺点就是没有考虑中文语言的特点。

早期,google 中国使用的就是这种分词方法,结果,搜索“和服”的时候,出现的大量为“…和服装”这样的页面。有人认为google 中国当年就是失败在这里。

本分词方法并不是一无是处,它至少有2 个优点。一个是通用。中日韩这3 种语言据说都可以这样处理。还有一个是词语预测。当系统不知道某个词语是词语的时候,这个词语就是新词,新词肯定是由几个连续汉字组成。

最大匹配(Maximum Matching Method)

给定一个词典D,D 是一个已知词语集合,最大匹配分词算法利用词典的帮助,每次选择一个最大长度的可能词语,把文本切分为词语序列。据说最大匹配思想是苏联人提出的。和最大匹配对应的是最小匹配,但其效果不如最大匹配,这里不再赘述。

最大匹配的2 个经典模型是:正向最大匹配( FMM)和反向最大匹配(BMM)。顾名思义,前者从前往后切分文本;后者从后往前切分文本。

正向最大匹配算法可以描述如下:

○1 假设已有一个词典D,已知词典中词语的最大长度为n,待切分文本为T;

○2int wordLen = n; for(;word Len > 1;wordLen --) { if(T.substring(0, wordLen) 属于D) break; }这样, 我们就获得了一个词语: T.substring(0, wordLen),长度为wordLen。

○3 T = T.substring(wordLen),继续循环○2 ,○3 直到T 的长度为0 为止。

后向最大匹配算法和前向最大匹配算是完全一样的,除了它是从后往前匹配外。有资料表明,前向最大匹配算法的错误率为1/169,而后向最大匹配算法的错误率为1/245。

也就是说,后向最大匹配算法更加适合中文的特点。

最短路径最短路径算法首先把文本按照各种可能进行切分,选择里面词语数目最小的为最后的结果。比如,“研究生活动”,可能有如下几种切分:

○1 研究、生活、动
○2 研究生、活动

根据词语的个数,选择第二个为最后的结果。

基于统计的分词技术,常见的有2 大类,基于自然语言理解( NLP,nature la nguage proceeding)和基于机器学习(ML,machine learning)。

英文自然语言理解有一套比较成熟的系统,但中文自然语言理解还处在很初级的地步。对中文NLP 的简单介绍:“国内分为3 大流派:西方传统自然语言理解派、HNC 层次
模型派、内涵模型论派。

NLP 目前处在字和语句理解之间。笔者比较看好HNC 模型。

”机器学习指根据现有知识不断完善系统模型的过程。它的发展十分迅速,我们常见的机器学习算法包括:决策树、线形回归、KNN、支持向量机、遗传算法、隐马尔可夫模型、最大熵学习、神经网络、人工免疫、蚂群算法、群决策等等。

因为机器学习算法几乎可以用来做任何事情,所以,笔者在中文分词论文里面,几乎见过每一种机器学习算法的应用。

这里仅仅介绍几个商业上常用的基于统计的分词技术:

多元分词(n-gram)

多元分词模型首先把文本所有的可能分词结果找出来,然后计算每种结果的分值,选择最大分值的结果为最后结果。具体的说:

○1 设输入文本为T;

○2 设其可能的切分方式集合为: G,对于每一种切分方法g={W0W1…Wr} ( 这里, Wi 表示词语), 计算: score =logP(W0W1…Wr|S) 。

根据贝叶斯公式,可以把score 的计算简化为:

score= log(P(S| W0W1…Wr)*P(W0W1…Wr)/P(S)) =logP(W0W1…Wr) 。

注意到: P(W0W1…Wr) = P(Wr| W0…Wr-1) *P(Wr-1| W0W1…Wr-2) * … P(W1|W0)*P(W0)。

假设我们只考虑几个连续词语之间的关系的话( 即任何词语的出现概率仅仅和它之前的几个词语有关),那么:P(W0W1…Wr) =ΠP(Wi|Hi),这里Hi 表示Wi 的前面m 个词语。

当m 为1 时,就是所谓的两元法;如果为2 就是所谓的三元法。

○3 取score 最大的那种切分结果为最后的结果。

需要注意的是,考虑到中文词语众多(公认的词语大于10 万个),仅仅在三元法时,词语之间的关系有最多就有100000^3 种,故一般很少使用四元及以上的分词方式。
另外,考虑到样本的有限性,大量的三元词语组合都没有在样本里面出现,这个时候,需要对N-gram 进行平滑处理,即给这些没有出现过的组合一个非0 概率。

对n-gram 的平滑处理有很多方法(参考《计算机自然语言处理》、宗成庆《自然语言理解》讲义),比如Turing-Good、折扣模型等等。

常见的有如下几种:
○1 加法:给每种可能的情况的出现次数都加1,这样就不会有出现次数为0 的情况了。

○2 减法:减少出现次数不为0 的情况的出现次数,使得样本中不同事件的概率之和小于1,

把余下的概率量均匀分配给那些没有出现的事件。