Spelling Checker拼写检查错误提示(以及拼音提示功能)

[color=olive] 拼写检查错误提示是搜索引擎都具备的一个功能,也就是说用户提交查询 给搜索引擎,搜索引擎检查看是否用户输入的拼写有错误,对于中文用户来说一般造成的错误是输入法造成的错误.那么我们就来分析看看百度是 怎么实现这一功能的.
  我们分析拼写检查系统关注以下几个问题:
  (1)系统如何判断用户的输入是有可能发生错误的查询呢?
  (2)如果判断是可能错误的查询输入,如何提示正确的词汇呢?
  
  那么百度是如何做的呢?百度判断用户输入是否错误的标准,我觉得应该是查字典,如果发现字典里面不包含这个词汇,那么很有可能是个错误的输入,此时启动错误提示功能,这个很好判断,因为如果是一个正常词汇的话,百度一般不会有错误提示,而你故意输入一个词典不可能包含的所谓词汇,此时百度一般会提示你正确的检索词汇.
   那么百度是怎么提示正确词汇的呢?很明显是通过拼音的方式,比如我输入查询" [color=red]制才[/color]",百度提供的提示词汇为: “:[color=red]制裁 质材纸材[/color]",都是同 音字.所以百度必然维持着一个同音词词典,里面保留着同音词信息,比如可能包含着下面这条词条: “ [color=red]zhi cai à制裁,质材,纸材[/color]",另外还有一 个标注拼音程序,现在能够看到的基本流程是: 用户输入" 制才",查词典,发现没有这个词汇,OK,启动标注拼音程序,将" [color=red]制才[/color]"标注为拼音"[color=red]zhi cai[/color]",然后查找同音词词典,发现同音词" [color=red]制裁,质材,纸材[/color]",那么提示用户可能的正确拼写.
  整体流程看起来很简单,但是还有一些遗留的小问题,比如是否将词表里面所有同音词都作为用户的提示信息呢?比如某个拼音有10个同音词,是否都输出呢?百度并没有将所有同音词都输出而是选择一定筛选标准,
选择其中几个输出.怎么证明这一点?我们看看拼音"[color=red]liu li[/color]"的同音词,紫光输入法提示同音词汇有" [color=red]流丽 流离 琉璃流利[/color]"4个,我们看看百度返回几个,输入"[color=red]流厉[/color]"作为查询,这里是故意输入一个词典不包含的词汇,这样百度的拼写检查才开始工作,
百度提示: " [color=red]琉璃刘丽 刘莉[/color] ",这说明什么?说明不是所有同音词都输出,而是选择输出,那么选择的标准是什么?
我能够猜测到的方法是对于用户查询LOG进行统计,提取用户查询次数多的那些同音词输出,如果是这样的话,上面的例子说明用户搜索"[color=red]琉璃[/color]"次数比其它的都要高些,次之是" [color=red]刘丽[/color]",再次是" [color=red]刘莉[/color]",看来大家都喜欢查询自己或者认识的人的名字.
  另外一个小问题:同音词词典包含2字词,3字词,那么是否包含4字词以及更长的词条?是否包含一字词? 这里一字词好回答,不用测试也能知道肯定不包含,因为你输入一个字,谁知道是否是错误的呢?
反正只要是汉字就能在词表里面找到,所以没有判断依据.二字词是包含的,上面有例子,三字词也包含,比如查询 "[color=red]中城药[/color]"百度错误提示:"[color=red]中成药[/color]",修改查询为"[color=red]重城药[/color]",还是提示"[color=red]中成药[/color]" ,再次修改查询 "重城要",百度依然提示"中成药". 那么4字词汇呢?
  百度还是会给你提示的,下面是个例子:
  输入:[color=blue]静华烟云[/color] 提示 [color=blue]京华烟云[/color]
  输入:[color=blue]静话烟云[/color] 提示 [color=blue]京华烟云[/color]
  输入:[color=blue]静话阎晕[/color] 提示 [color=blue]京华烟云[/color]
  那么更长的词汇是否提 示呢?也提示,比如我输入: "落花世界有风军",这个查询是什么意思,估计读过古诗的都知道,看看百度的提示"落花时节又逢君",这说明什么?说明同音词词典包含不同长度的同音词信息,另外也说明了百度的核心中文处理技术,也就是那个词典,还真挺大的.
  但是,如果用户输入的 查询由两个或者两个以上子字符串构成,那么百度的错误提示功能就停止了,比如输入查询"[color=red]哀体[/color]",百度提示"[color=red]艾提 挨踢[/color]",但是.输入为 "[color=red]我 哀体[/color] ",则没有任何错误提示.
  还有一个比较重要的问题:如果汉字是多音字那么怎么处理?百度呢比较偷懒,它根本就没有对多音字做处理.我们来看看百度的一个标注拼音的错误,在看这个错误前先看看对于多音字百度是怎么提示错误的,我们输入查询"[color=red]俱长[/color]",百度提示"[color=red]剧场 局长[/color]", “[color=red]俱长[/color]"的拼音有两个:"[color=red]ju zhang /ju chang[/color]" ,可见如果是多音字则几种情况都提示..现在我们来看看错误的情况, 我们输入查询"[color=red]剧常[/color]",百度 提示"[color=red]:剧场局长[/color]",提示为"[color=red]剧场[/color]"当然好解释,因为是同音字,但是为什么 "[color=red]局长[/color]"也会被提示呢?这说明百度的同音字词典有错误,说明在"[color=red]ju chang[/color]"这个词条里面包含"局长"这个错误的同音词.让我们顺藤摸瓜,这个错误又说明什么问题呢?
说明百度的同音词典是自动生成的,而且没有人工校对.还说明在自动生成同音词典的过程中,百度不是根据对一篇文章标注拼音然后在抽取词汇和对应的拼音信息获得的,而是完全按照某个词典的词条来标注音节的,
所以对于多音字造成的错误无法识别出来,如果是对篇章进行拼音标注,可能就不会出现这种很容易发现的错误标注. 当然还有另外一种解释,就是"[color=red]局长[/color]"是故意被百度提示出来可能的正确提示词汇,因为考虑到南方人[color=red]"zh"和 "ch"[/color]等前后鼻音分不清么,那么是这样的么?我们继续测试到底是何种情况.是百度有错误还是这是百度的先进的算法?
  我们考虑词汇"[color=red]长大[/color] ",故意错误输入为"[color=red]赃大[/color]",如果百度考虑到了前后鼻音的问题,那么应该会提示"[color=darkred]长大[/color][color=red][/color]",但是百度提示是"[color=red]藏大[/color]".这说明什么?说明百度并没有考虑前后鼻音问题,根本就是系统错 误. 我们输入查询"[color=red]悬赏[/color]",故意将之错误输入为"[color=red]悬桑[/color]",没有错误提示,说明确实没有考虑这种情况.前鼻音没有考虑,那么后鼻音考虑了么,我们输入"[color=red]:经常[/color]",故意改为后鼻音 "[color=red]经缠[/color]",百度提示为"[color=red]经产 经忏[/color]",还是没有考虑后鼻音.这基本可以确定是百度系统的错误导致.
  根据以 上推导, 我们可以得出如下结论:百度是将分词词典里面每个词条利用拼音标注程序标注成拼音,然后形成同音词词典,所以两个词典是同样大的 ,而且这个词典也随着分词词典的增长而在不断增长. 至于标注过程中多音字百度没有考虑,如果是多音字就标注成多个发音组合,通过这种方式形成同音词词典.这样的同音词词典显然包含着很多错误.
 最后一个问题:百度对于英文进行拼写检查么?让我们试试看,输入查询[color=red]"china"[/color],不错,搜到不少结果,专注中文搜索的百度还能搜索到英文,真是意外的惊喜.变换一下查询"chine",会更加意外惊喜的给我们提示"china"吗?
百度提示的是: 吃呢持呢,原来是不小心触发了百度的拼音搜索功能了.那么拼音搜索和中文检查错误是否采用同一套同音词词典呢,让我们来实验一下,搜索[color=red]"rongji[/color]",
百度提示" [color=red]榕基 溶剂 容积[/color]",OK,换个中文查询"[color=red]容机[/color]",
百度提示" [color=red]榕基溶剂容积[/color]",看来使用的是同一套同音词词典.也就是说百度的中文纠错和拼音检索使用的机制相同,中文纠错多了一道拼音注音的过程而已.难道这就是传说中那个百度的"[color=red]事实上是一个无比强大的拼音输入法[/color]"的拼音提示功能么?
  最后让我们总结归纳一下百度的拼写检查系统:
  后台作业: (1)前面的文章我们说过,百度分词使用的词典至少包含两个词典一个是[color=red]普通词典[/color],另外一个是[color=blue]专用词典(专名等)[/color],百度利用拼音标注程序依次扫描所有词典中的每个词条,然后标注拼音,如果是多音字则把多个音都标上,比如"[color=red]长大[/color]",会被标注为"[color=red]zhang da/chang da[/color]"两个词条.
  (2)通过标注完的 词条,建立同音词词典,比如上面的"[color=red]长大[/color]",会有两个词条: [color=red]zhang daà长大" , chang daà长大[/color].
  (3)利用用户查询LOG频率信息给予每个中文词条一个权重;
  (4)OK,同音词词典建立完成了,当然随着分词词典的逐步扩大,同音词词典也跟着同步扩大;
  
  拼写检查:
  (1)用户输入查询,如果是[color=blue]多个子字符串[/color],不作拼写检查;
  (2)对于用户查询,先查分词词典,如果发现有这个单词词条,OK, 不作拼写检查;
  (3)如果发现词典里面不包含用户查询,启动拼写检查系统;首先利用拼音标注程序对用户输入进行拼音标注;
   (4)对于标注好的拼音在同音词词典里面扫描,如果没有发现则不作任何提示;
  (5)如果发现有词条,则按照顺序输出权重比较大的几个提 示结果;
  
  拼音提示:
  (1)对于用户输入的拼音在同音词词典里面扫描,如果没有发现则不作任何提示;
  (2)如果发现有词条,则按照顺序输出权重比较大的几个提示结果;
上面说过,经过分析得出百度的分词系统采用[color=red]双向最大匹配分词[/color],但是后来发现推理过程中存在一个漏洞,而且推导出来的百度分词算法步骤还是过于繁琐,所以进一步进行分析,看看是否前面的推导有错误.
那么以前的分析有什么漏洞呢?
我们推导百度分词有反向最大匹配的依据是百度将"[color=red]北京华烟云[/color]"分词为[color=red]<北,京华烟云>[/color],从这里看好像采用了反向最大匹配,因为正向最大匹配的结果应该是<北京,华,烟云>,但是由此就推论说百度采用了双向最大匹配还是太仓促了,前面文章我们也讲过,百度有两个词典,一个普通词典,一个专有词典,而且是专有词典的词汇先切分,然后将剩余片断交给普通词典去切分.所以上面的"[color=red]北京华烟云[/color]"之所以被切分成[color=red]<北,京华烟云>[/color],另外一个可能是:京华烟云这个词汇是在专有词典里面存储的,所以先分析,这样得出"[color=red]京华烟云[/color]",剩下"[color=red]北[/color]",没什么好切分的,所以输出[color=red]<北,京华烟云>[/color].
这里只是假设,那么是否确实"[color=red]京华烟云[/color]"在专有词典呢?我们再看一个例子"[color=red]山东北京华烟云[/color]",百度切分的结果是[color=red]<山东,北,京华烟云 >[/color],如果"[color=red]京华烟云[/color]"在普通词典,如果是反向切分,那么结果应该是[color=red]<山,东北,京华烟云>[/color],如果是正向切分应该是[color=red]<山东,北京, 华,烟云>[/color],无论如何都分不出[color=red]<山东,北,京华烟云>[/color].这说明什么?
说明[color=red]"京华烟云"[/color]是在那个专有词典,所以先切分出"[color=red]京华烟云[/color]",然后剩下的"[color=red]山东北[/color]"交由普通词典切分,明显是正向最大匹配的结果输出[color=red]<山东,北>[/color].当然按照我们在第一篇文章的算法推导"[color=red]山东北[/color]"的切分也会得出[color=red]<山东,北>[/color]的结论,但是明显比正向最大匹配多几个判断步骤,既然效果一样,另外一个更加简洁的方法也能说得通,那当然选择简便的方法了.所以初步判断百度采取的是正向最大匹配.
我们继续测试采用何种分词算法,为了减少专有词典首先分词造成的影响,那么查询里面不能出现相对特殊的词汇,构筑查询"[color=red]天才能量级[/color]",这里应该没有专有词典出现过的词汇,百度切分为[color=red]<天才,能量,级>[/color],看来是正向最大匹配的结果.另外,如果所有查询词汇都出现在专有词典,那么采取的是何种方法?这样首先就得保证词汇都出现在专有词典,这么保证这一点呢?
我们构造查询"[color=red]铺陈晓东方[/color]",百度切分为[color=red]<铺,陈晓东,方>[/color],可以看出 "[color=red]陈晓东[/color]"是在专有词典的所以先切分出来.另外一个例子 "[color=red]山东京城[/color]",百度切分为<山东,京城>,说明[color=red]"东京"[/color]是在普通词典的.OK,构造查询"[color=red]陈晓东京华烟云[/color]",通过前面分析可以看出两个词汇都在专有词典里面,百度切分为[color=red]<陈晓东,京华烟云>[/color],说明对于专有词典词汇也是采取正向最大匹配或者双向最大匹配.那么使用反向最大匹配了吗? 构造查询例子"[color=red]陈晓东方不败[/color]",首先我们肯定[color=red]"陈晓东"和"东方不败"[/color]都是在专有词典出现的,如果是正向切分,那么应该是[color=red]<陈晓东,方,不败 >或者<陈晓东,方,不,败>[/color]如果是反向切分则是[color=red]<陈,晓,东方不败>[/color],可以看出百度的切分是[color=red]<陈晓东,方,不败 >或者<陈晓东,方,不,败>[/color],说明采用的是正向最大匹配.通过分析,百度的词典不包含"[color=red]不败[/color]"这个单词,所以实际上百度的切分结果是 [color=red]<陈晓东,方,不,败>[/color],很明显这和我们以前推导的算法是有矛盾的,所以以前的分析算法确实有问题,所以结论是百度采取的是正向最大匹配算法.
重新归纳一下百度的分词算法系统:首先用专有词典采用最大正向匹配分词,切分出部分结果,剩余没有切分交给普通词典,同样采取正向最大匹配分词,最后输出结果.
另外,GOOGLE也是采用正向最大匹配分词算法,不过好像没有那个专用词典,所以很多专名都被切碎了.
从这点讲,GOOGLE在中文词典构建上比百度差些,还需要加把子力气才行,不过这也不是什么多难的事.
[/color]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值