那么百度用的是什么方法?我的判定是用双向最大匹配算法。至于怎么推理得出的,让我们一步步来看。当然,这里首先有个假设,百度不会采取比较复杂的算法,因为考虑到速度问题。
我们提交一个查询毛泽东北京华烟云,又一个不知所云的查询,尽管不知所云但是自有它的道理,我想看看百度的分词是如何消歧以及是否有词典未登录词的识别的功能,假如是正向最大匹配算法的话,那么输出应该是:毛泽东/北京/华/烟云,假如是反向最大匹配算法的话,那么输出应该是:毛/泽/东北/京华烟云,我们看看百度的分词结果:毛泽东/北/京华烟云,一个很希奇的输出,跟我们的期望相差较多,但是从中我们可以获得如下信息:百度分词可以识别人名,也可以识别京华烟云,这说明有词典未登录词的识别的功能,我们可以假设分词过程分为两个阶段:第一阶段,先查找一个非凡词典,这个词典包含一些人名,部分地名以及一些普通词典没有的新词,这样首先将毛泽东解析出来,剩下了字符串北京华烟云,而北/京华烟云,可以看作是反向最大匹配的分词结果。这样基本说得通。为了证实这一点,我们提交查询发毛泽东北,我们期望两种分词结果,一个是正向最大匹配,一个是上述假设的结果,事实上百度输出是第二种情况,这样基本能确定百度分词采取了至少两个词典,一个是普通词典,一个是专用词典(人名等)。而且是专用词典先切分,然后将剩余的片断交由普通词典来切分。
继续测验,提交查询古巴比伦理,假如是正向最大匹配,那么结果应该是,假如是反向最大匹配,那么结果应该是,事实上百度的分词结果是,从这个例子看,似乎用了正向最大匹配算法;此外还有一些例子表明似乎是使用正向最大匹配的;但是且慢,我们看这个查询北京华烟云,正向最大匹配期望的结果是,而反向最大匹配期望的结果是,事实上百度输出的是后者,这说明可能采用的反向最大匹配;从这点我们可以猜测百度采用的是双向最大匹配分词算法,假如正向和反向匹配分词结果一致当然好办,直接输出即可;但是假如两者不一致,正向匹配一种结果,反向匹配一种结果,此时该如何是好呢?
从上面两个例子看,在这种情况下,百度采取最短路径方法,也就是切分的片断越少越好,比如和相比选择后者,和相比选择后者。还有类似的一些例子,这样基本可以解释这些输出结果。
但是仍然遗留的问题是:假如正向反向分词不一致,而且最短路径也相同,那怎么办?输出正向的还是反向的结果?
我们再来看一个例子。提交查询遥远古古巴比伦,这个查询被百度切分为,说明词典里面有巴比伦,但是是否有古巴比伦这个词汇不确定,此时看不出是正向切分还是反向切分得出的结果,换查询为遥远古巴比伦,此时被切分为遥远/古巴比伦,这说明词典里面有古巴比伦这个词汇,这说明了遥远古古巴比伦是正向最大匹配的结果。那为什么遥远古古巴比伦不会被反向切分为遥/远古/古巴比伦呢,百度的可能选择是这种情况下选择单字少的那组切分结果。
当然还可以继续追问:假如切分后单字也一样多,那怎么办?最后看一个例子,查询王强大小:,百度将其切分为王/强大/小,是正向切分的结果,假如是反向的会被切分为王/强/大小,这说明有歧义而且单字也相同则选择正向切分结果。
OK,看到这里可能头已经有些晕了,最后总结一下百度的分词算法,当然里面还是有猜测的成分,算法如下:
首先查询专用词典(人名,部分地名等),将专有名称切出,剩下的部分采取双向分词策略,假如两者切分结果相同,说明没有歧义,直接输出分词结果。假如不一致,则输出最短路径的那个结果,假如长度相同,则选择单字词少的那一组切分结果。假如单字也相同,则选择正向分词结果。
百度一直宣传自己在中文处理方面的优势,从上面看,分词算法并无非凡之处,消歧效果并不理想,即使百度采取比上述分词算法复杂些的算法也难以说成是优势,假如说百度有优势的话,唯一的优势就是那个很大的专用词典,这个专用词典登录了人名(比如大长今),称谓(比如老太太),部分地名(比如阿联酋等),估计百度采用学术界公布的比较新的命名实体识别算法从语料库里面不断识别出词典未登录词,逐渐扩充这个专门词典。假如这就是优势的话,那么这个优势能够保持多久就是个很明显的问题。
Spelling Checker拼写检查错误提示(以及拼音提示功能)
拼写检查错误提示是搜索引擎都具备的一个功能,也就是说用户提交查询 给搜索引擎,搜索引擎检查看是否用户输入的拼写有错误,对于中文用户来说一般造成的错误是输入法造成的错误.那么我们就来分析看看百度是 怎么实现这一功能的.
我们分析拼写检查系统关注以下几个问题:
(1)系统如何判定用户的输入是有可能发生错误的查询呢?
(2)假如判定是可能错误的查询输入,如何提示正确的词汇呢?
那么百度是如何做的呢?百度判定用户输入是否错误的标准,我觉得应该是查字典,假如发现字典里面不包含这个词汇,那么很有可能是个错误的输入,此时启动错误提示功能,这个很好判定,因为假如是一个正常词汇的话,百度一般不会有错误提示,而你故意输入一个词典不可能包含的所谓词汇,此时百度一般会提示你正确的检索词汇.
那么百度是怎么提示正确词汇的呢?很明显是通过拼音的方式,比如我输入查询
" 制才",百度提供的提示词汇为: :制裁质材纸材",都是同 音字.所以百度必然维持着一个同音词词典,里面保留着同音词信息,比如可能包含着下面这条词条: zhi cai %26agrave;制裁,质材,纸材",另外还有一 个标注拼音程序,现在能够看到的基本流程是: 用户输入" 制才",查词典,发现没有这个词汇,OK,启动标注拼音程序,将" 制才"标注为拼音"zhi cai",然后查找同音词词典,发现同音词" 制裁,质材,纸材",那么提示用户可能的正确拼写.
整体流程看起来很简单,但是还有一些遗留的小问题,比如是否将词表里面所有同音词都作为用户的提示信息呢?比如某个拼音有10个同音词,是否都输出呢?百度并没有将所有同音词都输出而是选择一定筛选标准,选择其中几个输出.怎么证实这一点?我们看看拼音"liu li"的同音词,紫光输入法提示同音词汇有" 流丽 流离琉璃流利"4个,我们看看百度返回几个,输入"流厉"作为查询,这里是故意输入一个词典不包含的词汇,这样百度的拼写检查才开始工作,百度提示: " 琉璃刘丽 刘莉 ",这说明什么?说明不是所有同音词都输出,而是选择输出,那么选择的标准是什么?
文章地址: http://www.xinasp.com/html/wangzhanyunying/sousuoyouhua/20080307/31174.shtml
tag:百度 分词 算法 详解


RSS订阅
评论加载中…



