搜索拼寫檢查

1、拼寫檢查的目的

拼寫檢查功能,能在搜索時,提供一個較好用戶體驗,因此,主流的搜索引擎都有這個功能。api

那麼什麼是拼寫檢查,其實很好理解,就是你輸入的搜索詞,多是你輸錯了,也有可能在它的檢索庫裏面根本不存在這個詞,可是這時候它能給你返回,類似或相近的結果來幫助你校訂。

舉個例子,假如你在百度裏面輸入在在線電瓶,可能它的索引庫裏面就沒有,可是它有可能返回在線電影,在線電視,在線觀看等等一些詞,這些,就用到拼寫檢查的功能了。以下圖:數組

 

2、搜索拼寫檢查現狀

solr搜索系統提供了基本的關鍵詞提示功能,因此經常使用的正確關鍵詞基本上都可獲得較爲準確的搜索智能提示。模塊化

可是用戶輸入時會因爲各類緣由致使的輸入錯誤或是關鍵詞太多,從而搜索系統沒法直接利用關鍵詞查找返回用戶想要的提示詞,這下降了系統的用戶體驗。學習

爲此須要開發拼寫檢查模塊,即便用戶輸入錯誤,也能夠根據用戶輸入進行糾錯,從而返回提示詞。測試

通過分析,發現致使出錯的主要在於如下幾種緣由:搜索引擎

    • 中文拼音混合輸入,如:「北京dongwuyuan」。索引中沒有中文拼音混合的索引,因此此類關鍵詞基本上沒法獲得提示詞。
    • 關鍵詞太長,如:「峨眉山 青城山」。若分開搜索則能夠返回結果
    • 同音詞錯誤,如:「每國」。用戶本意是「美國」。
    • 中文或者拼音中帶拼音縮寫,如:「東方mz」。本意爲「東方明珠」。

所以須要分析不一樣的輸入,進行拼寫糾錯。url

 

3、現有拼寫檢查方法

開發前先學習瞭解現有的可用的拼寫檢查方案,發現主要有兩部分:spa

       一、solr自帶封裝好的拼寫檢查功能設計

solr做爲全文搜索引擎提供了很多具備使用功能的組件,拼寫檢查也是其中一部分,可是自帶的拼寫檢查組件只能進行拼音糾錯提示,而且成功率不高,約爲35%;日誌

solr自帶拼寫檢查不支持中文糾錯。由於拼寫檢查控件原理是首先利用QueryConverter類的convert方法對原始查詢的q進行元詞分詞,獲得數個Term,而後分別對各個Term

進行拼寫檢查,最後返回每一個Term的拼寫檢查結果。

可是自帶控件的QueryConverter類實現類SpellingQueryConverter對非ASCII字符支持的很差,好比中文字符串通過分詞後會轉換爲單箇中文字符數組,而後對每一箇中文字符

分別做爲Term調用Lucene的接口進行拼寫檢查,可是lucene的接口拼寫檢查時檢查Term字符串內容的長度,長度小於給定值(默認爲4)是不進行拼寫檢查,直接返回空值。

因此自帶拼寫檢查控件不支持中文拼寫檢查,須要自行改動並實現相關類纔可使用。

       二、lucene提供的拼寫檢查接口

lucene提供了拼寫檢查功能接口,開發者能夠根據系統需求自由定製,非常方便。

其中包括SpellChecker、DirectSpellChecker、WordBreakSpellChecker等三個類提供的三種拼寫檢查方式:

SpellChecker類接口的使用需重建索引(根據已有文本或已有索引的一個字段),其拼音檢錯成功率爲69%左右,中文成功率爲20%左右;

DirectSpellChecker類提供的拼寫檢查無需重建索引,可直接使用現存索引,拼音成功率爲83%,中文爲54%

      WordBreakSpellChecker類暫未測試。

注:

此處測試的元數據是經過分析日誌的來的關鍵詞,而且這些關鍵詞是直接搜索沒法返回提示詞的那部分。

將其中的純拼音關鍵詞與其餘詞分開存儲分析,拼音關鍵詞總個數即爲C1,其餘即爲C2。

在一次調用lucene接口進行拼寫檢查中能夠返回糾錯結果的記爲成功一次,沒法返回的記爲失敗。

拼音成功率=拼音成功次數/C1

中文成功率=中文成功次數/C2

 

4、拼寫檢查設計方案

基本思路

考慮到搜索系統的模塊化,及現有資源的重複利用,這次仿照solr自帶拼寫檢查方案,經過封裝Lucene接口實現一個支持中文的solr拼寫檢查控件,將其直接集成到solr系統中。

這樣能夠直接利用已有的索引資源,不須要從新創建索引。

 

一、編寫一個類,實現QueryConverter類,功能相似於SpellingQueryConverter類,可是須要支持中文。

該類主要用於分析原始查詢字符串,根據特殊字符(如空格等)將原始字符串分爲多個元詞詞組,而且跳過AND/NOT/OR等修飾符號

後續拼寫檢查就是面向這些元詞詞組分別進行的。

二、編寫一個類,功能相似於DirectSolrSpellChecker,其中封裝了lucene的DirectSpellChecker類提供的拼寫檢查接口。

思路以下:

首先對查詢關鍵詞q進行分析,判斷q是純拼音、純中文仍是中英文混合(去除特殊字符),

而後根據用戶的不一樣輸入採起不一樣的拼寫檢查策略,分爲如下三種狀況:

a,如果純拼音則直接調用Lucene的檢錯接口進行糾錯,返回的結果做爲拼寫檢查結果;(純拼音檢錯)

b,如果純中文則先判斷是不是同音詞錯誤,即將中文轉換爲拼音,查看索引中是否有該拼音的索引,

      如有則返回該拼音索引對應的中文做爲同音詞拼寫檢查結果;(同音詞檢錯)

      若不是同音詞,則調用Lucene接口進行糾錯,返回的結果做爲拼寫檢查結果;(純中文檢錯)

c,如果中英文混合,先將其轉換爲全拼音,調用Lucene接口糾錯,如有結果返回,則將結果對應的中文字符串做爲拼寫檢查結果;

    (中文拼音混合檢錯,中文和拼音均拼寫正確,此處可解決大部分由混合輸入引發的問題)

須要判斷拼寫檢查的返回結果與原始詞彙的類似性,經過計算編輯距離判斷。

 

5、測試

拼寫檢查模塊的主要功能是對用戶輸入的錯誤關鍵詞進行糾正,並返回糾正後的建議詞。

錯誤測試關鍵詞分如下幾種狀況:

檢錯狀況 正確關鍵詞 輸入的錯誤關鍵詞
Case 1 : 純拼音 beijing beijink
Case 2 : 同音詞

美國

每國
Case 3 : 純中文 北京 北精、北進
Case 4 : 中文拼音混合(拼寫正確) 北京 北jing、bei京
Case 5 : 中文拼音混合(拼寫錯誤) 北京 北jink
相關文章
相關標籤/搜索