搜索引擎是目前人们获取信息最重要的方式之一,其最基本最核心的功能是信息检索,找到含有关键字的网页或文档,然后按照一定排序将结果给出,在此基础之上,能够提供更多更复杂的功能来提升用户体验。对于一个成熟的搜索系统,用户看似简单的搜索过程,需要在系统中经过多个环节,多个模块协同工作,才能提供一个让人满意的搜索结果。在搜索引擎输入的查询中,有相当一部分是带输入错误的查询。而提交有错误的查询给搜索引擎,通常得不到好的搜索结果,返回结果数很少并且和用户的期待相差很远,会严重影响了用户的使用体验。因此查询纠错是现代搜索引擎智能化的显著标志,在提高用户搜索体验方面发挥着重要的作用。

  在搜索引擎中,我们将用户输入的关键字查询叫做query,用户希望得到和输入query相关的质量较好的网页或文档,这个“好”字定义有多种衡量方式,最简单的标准就是那些对用户帮助最大最具吸引力的结果能够排到前列,但是往往出于各种原因,用户输入的query本身质量不高或是错误的,如果搜索引擎不对这种错误进行修正弥补,会导致召回错误的结果,或者结果数少甚至没有结果。当用户看到搜索结果较差较少时,如果能意识到自己的query错误,对query进行修正再次检索,也许能找到想要的结果。但有时用户也不知道自己的query错在哪里,这个时候就需要系统尽量能提供正确的候选结果给用户。 用户输入的关键字多种多样,因此纠错需要针对不同的输入制定不同的策略,总体来说分为以下几类:英文纠错、URL纠错、中文纠错以及拆分纠错,下面分别详细介绍这些纠错的方法。

一、英文纠错

   英文最基本的语义元素是单词,因此拼写错误主要分为两种,一种是拼写错误,指单词本身就是拼错的,比如将“iphone”拼成“ihpone”,“ihpone”本身不是一个词。另外一种是真实词错误,指单词虽拼写正确但是结合上下文语境却是错误的,比如“two eyes”写成了“too eyes”,“too”在这里是明显错误的拼写。在搜索引擎中,尤其是中文搜索引擎中,用户英文输入的比例是要远远低于中文的,对英文的纠错也基本上停留在拼写错误检查及其自动纠正上,对于提到的词根变化以及短语实体的发现上,则一般涉及的很少。英文纠错的算法核心,是如何快速寻找并确定与原查询相似的结果,利用基于位图变换的索引搜寻算法,可以巧妙地解决英文候选搜寻的问题。

  所谓位图,是指对查询词中包含字母情况的统计,包括是否包含某个字母以及该字母在当前查询中出现的总次数两方面信息;简单地说,我们可以认为位图就是一种类似数组的结构,其大小固定为26(对应英文字母的个数,a-z,下标依次递增),数组中每个元素的值对应于查询中该字母出现的次数;这里,原查询中除了英文之外的数字、符号以及空格,并不对位图构成产生影响;例如: “iphone4 16g”,其中只有i,p,h,o,n,e,g七个字母参与位图计算,而数字4,1,6以及空格并不参与位图的计算。在位图中由一个转换成另外一个所需要的最少操作次数,允许的操作包括字符替换,增加字符,删除字符,交换字符。有了位图的概念之后,常见的英文错误变换就可以和位图变换操作做一个一一对应了,具体如表1所示。

位图操作 对应英文操作 例子
不变 交换操作 ihpone -> iphone 
某字母对应数组+1 添加操作 cray brid -> crazy brid 
某字母对应数组-1 删除操作 acctess -> access

某字母对应数组+1,

另外某字母对应数组-1

替换字符 applg -> apply

表一、位图变换和英文纠错对应关系    

  有了位图变换的概念,英文纠错的流程就比较清晰了;首先通过计算获取原查询的位图信息,然后在此基础上依次进行各种位图变换,得到一个候选集;再通过计算各个候选与原查询之间的相似度关系,同时结合候选词本身的查询热度,进行适度调权;最后,选出最优的纠错候选,并与原查询自身的热度进行对比,确定是否进行纠错;

二、URL纠错

   URL纠错模块主要针对url类型的错误进行检测和纠正,包括url检测和url纠错这两部分逻辑。其中,url检测逻辑是通过对原查询文本特征的(如是否包含www,以及包含.的个数等条件)判断,来确定是否属于url类型;而url纠错逻辑部分,其算法核心思想是首先把用户输入的url拆分成站点和子目录,分别对其拆分的各个部分进行纠错,通过从用户日志中常见错误url的形式的分析,从中挖掘整理出常见的用户输入错误形式,并用正确的形式将其替换,并重新进行拼接,得到正确的url形式,并与原查询进行热度比较,确定最终是否需要纠错。该算法是基于历史数据整理出来规则为主,基本覆盖了所有常见的url后缀形式(包括.com、.cn、.net、.org、.gov、.biz等),具有较高的准确度和召回率。此外,我们还尝试对一些特殊的url形式(如:非www开头的)进行探索性纠错尝试,通过比较去除www前缀前后查询的热度情况,来判断是否该对其纠错,很好的解决了这类错误。

三、中文纠错

  中文与英文的构成有很大的差别,通常需要纠错的中文查询与正确的查询词数上相同,另外中文词语往往会比较短,通常一个词的编辑距离也会产生大量的候选集,好在中文是以拼音作为中文的发音,每个字都有固定的发音(除多音字外,多音词可以利用上下文确定正确读音)。在中文的查询中,由于当前拼音输入法的普及,大部分的查询输入错误都属于同音的情况;同时,由于不同地域用户自身发音的差异,汉语中多音字以及一些易混淆汉字的存在,以及部分用户对汉语拼音构成的误用,键盘输入时的误操作等,实际搜索过程中往往会出现用户输入的查询词和对应的正确查询读音并不完全一致的现象。因此中文纠错主要是基于拼音的纠错。基于拼音的纠错算法基本原理是首先通过对原查询进行注音并做相应的拼音扩展变换,进而在索引数据中进行检索,搜寻与之拼音相同的查询集合,并从中挑选出最优的候选查询;最后通过对纠错前后的频率判断以及一系列规则的限制,确定是否纠错并给出最终的纠错结果。该算法的核心是对拼音变换扩展过程以及最优结果的选取策略。

  拼音变换扩展,通过大量的用户历史session日志统计常见的用户拼音输入错误,整理出三大类问题,能覆盖绝大多数的错误输入形式:第一类拼音扩展主要针对拼音构成错误,主要用来处理用户输入的不存在的拼音形式,并将其转换为正确形式,例如:“iou->iu,  yie->ye, uei->ui, uen->un”, 变换之前的读音都是用户误以为存在,但实际上在汉语拼音构成中并不存在的形式,而变换后的为其正确的形式;第二类拼音变换扩展主要针对模糊音类错误,即对不同地域用户自身发音的地域性特征进行调整;主要包括:1. 前鼻音和后鼻音韵母的变换, 例如:an->ang, en->eng, in->ing等;2. 平舌音和卷舌音的变换,例如:z->zh, c->ch, s->sh等;3. 一些特殊拼音的变化,例如:nu->nv等;第三类拼音变换扩展主要是针对一些用户常见的拼音错误输入形式进行扩展,其可以覆盖前面所述的各种拼音错误形式,尤其是对同音词错误以及键盘输入误操作形式。通过上面几种拼音扩展方法,相当于对原查询进行了一系列拼音重写,最终获取了用户所需的正确查询所对应的所有潜在的拼音形式,为后面依据注音结果的检索做好了准备。

  在通过对原查询注音以及拼音扩展后,我们得到了一系列正确查询可能对应的拼音形式;再以这批拼音为key,在索引数据中进行检索,便可得到与原查询读音相同(或者相近)的一系列候选;此时,下一步需要做的就是从候选集中挑选最优的纠错结果,并与原查询做对比,判断是否需要进行纠错。最优纠错结果的选取策略主要参考以下方面:首先,是当前候选与原查询的拼音相似度,与原查询拼音越接近的纠错候选,其得分也相应越高,目前这种相似度主要依据纠错前后的拼音串的编辑距离来衡量;在编辑距离相同的情况下,则还需考虑对应拼音变换的概率,不同的拼音变换扩展也会对应不同的权值;例如,原查询为“jiyingongcheng”,则由于与原查询拼音编辑距离不同,候选“基因工程”的优先级要高于“基因功臣”;其次,如果原查询是中文,还要考虑当前候选与原查询本身字面的距离,这里以原查询被替换掉的汉字数来作衡量;一般来说,在一定的范围内,用户真正需要的查询和原查询差异不会太大;因此当原查询中被替换掉的字越多时,对应的候选的可信度也就相应地越低;例如:原查询为“亿骑当千”,则考虑替换字的个数,候选“一骑当千”的优先级要高于“一姬当千”;最后,还要考虑原查询自身的信息。比如原查询的长度信息,一般来说,越短的查询,其出错的几率相对就越低,反之则越高;例如,原查询为“黄缙”会有一个候选是“黄金”,考虑到原查询长度较短,则候选“黄金”的可信度应有所降低;再如原查询中如果只包含一个汉字,其余部分皆为拼音,则正确纠错候选中最好也保留该汉字;例如,原查询为“嘻youji”,则候选“嘻游记”由于包含了原查询中仅有的汉字,其优先级应高于候选“西游记”。通过综合考虑上述特征,从所有候选中选出最优的候选,再通过与原查询本身的热度作对比,就可以最终确定原查询是否需要做纠错并给出最终的纠错结果;

四、拆分纠错

  对于搜索引擎中,用户的输入为长尾查询来说,由于其对应的正确查询形式往往也并未被人完整的查询过,很难在索引库中找到并匹配,因此也就很难被前面提及的各种纠错算法所覆盖。此时,为了达到纠错的目的,就需要引入拆分纠错的概念。拆分纠错的核心思想,就是把原查询按照一定的规则进行拆分,进而对其中的每一段使用各种基础的纠错算法进行查询纠错,获得正确候选,最后将各段可能的候选进行拼接,并按照一定的评价标准与原查询进行比较,确定是否进行纠错并选取最优的纠错结果。拆分纠错算法的关键是需要解决两个问题:一是如何对原查询做划分,二是如何比较判断分段拼接后得到的新查询和原查询之间的关系。对于第一个问题,选择利用分词信息以及查询中特殊符号(如空格、分隔符等)对原查询进行切分。这样做的好处是不会破坏原查询中一些有意义的实体部分(例如:地名、人名等),从而避免在后续分段获取候选词时产生一些明显无用的候选结果,同时可以有效提高算法的效率。对于第二个问题,为了衡量原查询和纠错后各个候选结果之间的优劣关系,进而选取最优候选结果并判断是否需要进行纠错,利用统计语言模型中N-gram模型。 N-gram的思想源于香农实验,即人们根据词的历史来对当前词进行预测。在这个思想下,N-gram又引入马尔科夫性以简化建模难度。如果进一步限定词历史长度为2或者3,即可得到二元、三元语言模型的形式如下: 

  由于二元语法模型只对两个词之间的关系进行建模,所以不能充分挖掘训练语料中丰富的语言现象。作为对二元模型的直接扩展,三元模型能够捕获更多的句子信息。在语音识别、机器翻译等领域,三元模型都有很成功的应用。如前所述,在拆分纠错算法中,对于拆分后得到的原查询的每个片段,我们都会尝试寻找其可能的纠错候选;拆分纠错正是巧妙利用了这些基础算法的结果,并将各个子段的纠错候选进行拼接,得到最终整体的纠错结果,并通过N-gram语言模型进行判断,决定是否纠错以及最优的纠错结果。拆分纠错算法的这种化整为零、分而治之的纠错思想,是对传统纠错模型的一种很好的补充,有效的解决长尾查询的纠错问题。

五、总结

   一个完善的搜索引擎系统会针对不同纠错需求设计不同的纠错子模块,如本文所描述包括英文纠错、URL纠错、中文整体纠错、拆分纠错等,用户提交的查询,通过各个纠错子模块,分别得到若干候选集,最终进入纠错检验终判模型,确定是否出纠错查询,并确定出哪个纠错结果。纠错检验终判模块主要根据三个方面的特征来对纠错行为进行终判:首先是纠错前后查询词的热度信息,一般来说正确的查询其热度要远远高于错误查询,如果发现纠错后的结果热度更低,则往往属于误纠;其次是纠错前后查询词的语言模型得分信息,正确的查询其模型得分会相对较高;最后是搜索结果信息,如果原查询的搜索结果已经很好,则此时往往是不需要进行纠错的;反之,如果纠错前结果很差而纠错后变得很好,则此时的纠错通常是合理的。通过以上特征,可以很好地将误纠的查询予以屏蔽,提高查询纠错算法整体的效果。纠错功能是搜索系统的重要组成部分,对提升用户体验及用户满意度有很大的帮助,亦能补救大量错误query所带来的流量损失。

posted on 2018-11-10 21:37  sxron  阅读(2702)  评论(0编辑  收藏  举报