拼寫糾錯

對大多數(shù)拼寫糾錯來說,存在兩個基本原則:

  1. 對于一個拼寫糾錯的查詢,在其中正確的拼寫中荸实,選擇距離最近的一個。
  2. 當(dāng)兩個正確拼寫查詢臨近度相等時缴淋,選擇更常見的那個准给。

有兩大類拼寫糾錯的方法,一種是詞項獨(dú)立的校正重抖,另一種是上下文敏感的校正露氮。其中,在詞項獨(dú)立的校正中钟沛,不管查詢中包含多少個查詢詞項畔规,每次只對單個查詢詞項進(jìn)行校正。利用這種詞項獨(dú)立的方式恨统,很難檢測到查詢 flew form Heathrow中form這個錯詞叁扫。

方法1:編輯距離

給定兩個字符串s1和s2三妈, 兩者的編輯距離定義為將s1轉(zhuǎn)換為s2的最小編輯操作次數(shù)。編輯操作主要包括:

  1. 將一個字符插入字符串莫绣、

  2. 將一個字符從字符串中刪除

  3. 將一個字符替換為另一個字符

    基于這些操作的編輯距離也稱為Levenshtein距離畴蒲,例如:cat和dog的編輯距離是3。

? 可以在O(|s1| * |s2|)的時間復(fù)雜度下計算兩個字符串的編輯距離对室。|si| (i=1,2)表示字符串si的長度模燥。主要解決思路是采用動態(tài)規(guī)劃的思想:

s1和s2以字符數(shù)組的形式存放,整數(shù)矩陣M的行號和列號分別是兩個字符串的長度掩宜,算法在運(yùn)行過程中不斷填充矩陣蔫骂,矩陣的第i行和第j列保存的是s1的前i個字符構(gòu)成的字符串和s2的前j個字符構(gòu)成的字符串的編輯距離。其中求最小值的三個參數(shù)分別對應(yīng)在s1中替換一個字符牺汤、在s1中插入一個字符和在s2中插入一個字符纠吴。

? 兩個字符串的編輯距離計算算法如下:

public int  minDistance(String word1,String word2){
    int m=word1.length();
    int n=word2.length();
    int [][]dp=new int [m+1][n+1];
    for(int i=0;i<=m;i++){
        dp[i][0]=i; //單純的刪除操作
    }
    for(int i=0;i<=n;i++){
        dp[0][i]=i; //單純的插入操作
    }
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            if(word1.charAt(i)==word2.charAt(j)){
                dp[i+1][j+1]=dp[i][j];
            }else{
                dp[i+1][j+1]=Math.min(dp[i][j+1],Math.min(dp[i+1][j],dp[i][j]))+1;
            }
        }
    }
    return dp[m][n];
}

? 拼寫糾錯的問題:

給定字符串集合V(對應(yīng)詞項詞匯表)和查詢詞字符串,從V中尋找和q具有最小編輯距離的字符串慧瘤。最直接的算法是計算q到V中的每個詞項的編輯距離戴已,然后選擇其中編輯距離最小的字符串。很顯然這種窮舉的搜索開銷很大锅减,實際當(dāng)中使用列多種啟發(fā)式方法來提升查詢效率糖儡。最簡單的啟發(fā)式方法是將搜索限制在與查詢詞有相同首字母的字符串上,也就是說我們期望查詢的拼寫錯誤不會出現(xiàn)在第一個字符上怔匣。

方法2:k-gram 索引

? 為了進(jìn)一步限制需要計算編輯距離的詞匯表大小握联,利用k-gram索引來輔助返回與查詢q具有較小編輯距離的詞項,一旦返回這些詞項后每瞒,就能從中找到與q具有最小編輯距離的詞金闽。

? 查詢bord的2-gram索引如下所示,其中包含3個2-gram組成的倒排記錄剿骨,假定我們要返回包含上面3個2-gram的至少2個詞項代芜,對倒排記錄表的單遍掃描會返回滿足該條件的所有詞項。

bo ----> aboard ----> about ----> boardroom ----> border
or ----> border ----> lord  ----> morbid    ----> sordid
rd ----> aboard ----> ardent ---> boardroom ----> border

? 缺點(diǎn):

比如boardroom這種不可能是bord的正確拼寫也會返回浓利。

針對上面的問題挤庇,需要計算查詢詞和詞匯表更精細(xì)的重疊度計算方法。比如:Jaccard系數(shù)

Jaccard系數(shù)的計算公式為:

|A \bigcap B | \div |A \bigcup B|

其中贷掖,A嫡秕、B分別是查詢q、詞匯表詞項中的k-gram集合苹威。掃描過程中昆咽,一旦掃描到當(dāng)前的詞項t,就快速計算q和t的Jaccard系數(shù),然后繼續(xù)掃描下一個詞項掷酗。如果Jaccard系數(shù)超過閾值调违,則將t輸出,否則繼續(xù)下一個掃描汇在。

方法3: 上下文敏感的拼寫校正

? 獨(dú)立的詞項拼寫校正方法在面對諸如flew form Heathrow 中的輸出錯誤時無能為力翰萨,因此這3個單詞獨(dú)立看來拼寫都沒有錯誤脏答。當(dāng)輸入這類查詢時糕殉,搜索引擎可能會發(fā)現(xiàn)返回的文檔非常少,隨后也許提供正確的查詢建議flew form Heathrow殖告。

這種功能的一種簡單的實現(xiàn)方法就是阿蝶,及時每個單詞拼寫都是對的,仍然要對每個單詞找到可能的拼寫正確詞黄绩,然后嘗試對短語中的每個詞進(jìn)行替換羡洁。比如對于上面flew form Heathrow的例子,我們可能會返回如下短語fled from Heathrow 和 flew fore Heathrow爽丹。對每個替換后的短語筑煮,搜索引擎進(jìn)行查找并確定最后的返回數(shù)目。

? 對于單獨(dú)的查詢有多種可能的正確拼寫形式粤蝎,那么上述方法中窮舉過程的開銷會非常大真仲,最后我們就會面對非常多的拼寫組合。有一些啟發(fā)式方法可以減少可能的拼寫結(jié)果空間初澎。

上述例子中秸应,我們對flew及from進(jìn)行擴(kuò)展時,我們只保留文檔集合或者查詢?nèi)罩局械母哳l組合結(jié)果碑宴。比如软啼,我們可能會保存flew from 而不是 fled fore 或 flea form,這是因為fled fore很可能比flew from 出現(xiàn)的次數(shù)少延柠。接下來我們僅僅根據(jù)高頻雙詞(如flew from)來獲得Heathrow的可能的正確拼寫祸挪。計算雙詞頻率的時候可以使用文檔集,也可以使用用戶的查詢?nèi)罩尽?/p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贞间,一起剝皮案震驚了整個濱河市匕积,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌榜跌,老刑警劉巖闪唆,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異钓葫,居然都是意外死亡悄蕾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帆调,“玉大人奠骄,你說我怎么就攤上這事》” “怎么了含鳞?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長芹务。 經(jīng)常有香客問我蝉绷,道長,這世上最難降的妖魔是什么枣抱? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任熔吗,我火速辦了婚禮,結(jié)果婚禮上佳晶,老公的妹妹穿的比我還像新娘桅狠。我一直安慰自己,他們只是感情好轿秧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布中跌。 她就那樣靜靜地躺著,像睡著了一般菇篡。 火紅的嫁衣襯著肌膚如雪漩符。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天逸贾,我揣著相機(jī)與錄音陨仅,去河邊找鬼。 笑死铝侵,一個胖子當(dāng)著我的面吹牛灼伤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咪鲜,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼狐赡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了疟丙?” 一聲冷哼從身側(cè)響起颖侄,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎享郊,沒想到半個月后览祖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炊琉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年展蒂,在試婚紗的時候發(fā)現(xiàn)自己被綠了又活。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡锰悼,死狀恐怖柳骄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情箕般,我是刑警寧澤耐薯,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站丝里,受9級特大地震影響曲初,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丙者,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一复斥、第九天 我趴在偏房一處隱蔽的房頂上張望营密。 院中可真熱鬧械媒,春花似錦、人聲如沸评汰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽被去。三九已至主儡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惨缆,已是汗流浹背糜值。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坯墨,地道東北人寂汇。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像捣染,于是被迫代替她去往敵國和親骄瓣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353