1. 程式人生 > >搜索引擎中查詢糾錯總結

搜索引擎中查詢糾錯總結

清晰 重新 鍵盤 特殊符號 地域 域用戶 需求 檢查 數組

 搜索引擎是目前人們獲取信息最重要的方式之一,其最基本最核心的功能是信息檢索,找到含有關鍵字的網頁或文檔,然後按照一定排序將結果給出,在此基礎之上,能夠提供更多更復雜的功能來提升用戶體驗。對於一個成熟的搜索系統,用戶看似簡單的搜索過程,需要在系統中經過多個環節,多個模塊協同工作,才能提供一個讓人滿意的搜索結果。在搜索引擎輸入的查詢中,有相當一部分是帶輸入錯誤的查詢。而提交有錯誤的查詢給搜索引擎,通常得不到好的搜索結果,返回結果數很少並且和用戶的期待相差很遠,會嚴重影響了用戶的使用體驗。因此查詢糾錯是現代搜索引擎智能化的顯著標誌,在提高用戶搜索體驗方面發揮著重要的作用。

  在搜索引擎中,我們將用戶輸入的關鍵字查詢叫做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所帶來的流量損失。

搜索引擎中查詢糾錯總結