本文介紹 Stanford《From Languages to Information》課程中講到的 單詞拼寫錯誤 糾正。背后的數學原理主要是貝葉斯公式。單詞拼寫錯誤糾正主要涉及到兩個模型:一個是Nosiy Channel模型,它是貝葉斯公式中的似然函數;另一個模型是Language Model,它是貝葉斯公式中的先驗概率。
一,問題描述
在這句話中“. . . was called a “stellar and versatile acress whose combination of sass and glamour has defined her. . .”,有一個錯誤的單詞:acress
這個錯誤單詞 acress 對應的 正確單詞是哪個呢?是 actress? 還是cress?還是 caress?……
二,出現單詞拼寫錯誤的情形
一種是 Non-word spelling errors,它是指:錯誤的單詞 不存在 於詞典中。也就說,你鍵盤輸入了一個單詞,而這個單詞根本沒有被英文詞典收錄,在字典中查不到。比如你將 正確的單詞graffe,多打了一個字符 i ,變成了 giraffe,而 英文字典中根本沒有 giraffe這個單詞。
另一種是 real-word errors,比如:想輸入 there are,結果輸入成了 three are。而錯誤單詞 three 是存在於字典中的,關鍵問題是:怎么知道將 three 改成 there 呢?
三,單詞拼寫錯誤的糾正步驟
①首先檢測出 是哪個單詞發生了拼寫錯誤。
這可以通過查字典來實現,比如依次掃描每個單詞,若該單詞不在詞典中(未被詞典收錄),則認為它是一個拼寫錯誤的單詞。顯然,詞典越大,詞典收錄的單詞越多,我們就越能正確檢測出錯誤的單詞。
②其次,是要從一組候選的 正確單詞中,選擇一個“最准確”的單詞,而這個“最准確”的單詞,就是要找的結果(錯誤單詞 對應的 正確單詞)。
這里有個問題就是:如何找出一組候選的正確單詞呢?這就需要根據實際情況進行分析了。以上面提到的錯誤單詞 acress 為例:
本來想輸入“across”,但是一不小心將 'o',輸入成了'e',結果變成了 "acress", 這是substition 操作:將 'o' 替換成了 'e'
本來想輸入 "actress",但是打字太快,漏打了 't',結果變成了"acress",這是deletion操作:刪除了 't'
.....
或者說:鍵盤上字符'm' 和 'n' 很近,打字時,很容易將 'm'替換成了'n';又或者說:'m' 和 'n'發音相似,也導致經常將 'm' 替換成 'n'
而尋找一組候選單詞,就可以通過“編輯距離算法”來實現。關於編輯距離,可參考“Damerau-Levenshtein Edit Distance”或者:最短編輯距離算法實現
四,貝葉斯推斷 糾正 單詞拼寫錯誤
①Noisy Channel Model
Noisy Channel Model的示意圖如下:
原來的一個正確的單詞:經過 noisy channel ,結果變成了一個 noisy word。而這個noisy channel,其實就是前面講的“兩個詞發音相近,容易拼錯它們",或者"兩個字符在鍵盤上相鄰,輸入時就會錯誤地將一個詞 輸入成了(type) 另一個詞。(其實niosy channel就是對現實世界存在的問題的一個建模)
而要想得出錯誤單詞(noisy word) 對應的 正確單詞,就需要用到貝葉斯推斷。具體原理如下:
既然 noisy word (或者說錯誤單詞,記為 x )已經出現了,那么我們在詞典中找一個單詞w,在 x 已經出現的條件下,最有可能是由 哪個單詞w 造成的?
We see an observation x (a misspelled word) and our job is to find the word w that generated this misspelled word
Out of all possible words in the vocabulary V we want to find the
word w such that P(w|x) is highest. We use the hat notation ˆ to mean “our estimate
of the correct word”.
用公式(1)表示如下:
(公式1)
V是詞典(Vocabulary),p(w|x)表示:從V中選出一個w,計算概率 P(w|x),概率最大的那個 w,就是 錯誤單詞x 對應的正確單詞,將該正確單詞記為: wˆ
根據貝葉斯公式法則(公式2):
將公式(1)變成如下形式:
(公式3)
從公式3 可以看出:就是對於 詞典V 中的每個單詞w,計算 [p(x|w)*p(w)]/p(x),找出 計算結果最大(概率最大) 的那個 w,該 w 就是最優解 wˆ
而在這個計算過程中,可以不需要計算分母p(x),因為這不影響我們 找出 概率最大的那個 w 。因此將 p(x) 視為一個常量值。(這里關於貝葉斯的理解,可參考后面給出的參考文獻)
於是我們的公式就變成了:
(公式4)
可以看出,公式4 由兩部分組成,一部分是 p(x|w),我們稱之為 channel model 或者 稱為 error model,它就是似然函數
另一部分是 p(w) 我們稱之為先驗概率(prior)。
另外,值得一提的是這個Vocabulary V,由於Vocabulary中單詞個數是很多的,只有在發生某種”條件“的情況下,一個單詞才會被誤拼寫成了另一個單詞。換句話說,Vocabulary中的某些詞與錯誤單詞 x 之間是”八桿子打不着“的關系,因此我們只在某些Candidate words 中 尋找 [p(x|w)*p(w)] 的那個 w
而這些Candidate words 就是由前面提到的”編輯距離算法“生成。因此,公式可繼續變成(注意 argmax 的下標的變化。V變成了C,而C就是 Candidate words的集合)
因此,現在的問題變成了:如何求出channel model 和 prior呢?
首先介紹下先驗概率p(w)的求解(Prior)
我們使用 unigram language model 來作為 p(w)。這里解釋一下 unigram language model:
選擇一個語料庫(詞庫),這個語料庫里面總共有 404253213個單詞,然后”編輯距離“算法 根據 錯誤的單詞 acress 生成了一系列的候選詞(Candidate words),每一個候選詞在語料庫中出現的次數count(candidate word) 除以 404253213 就是每個Candidate word的先驗概率。如下圖所示,第一列是錯誤單詞acress的 候選詞,第二列是這些候選詞在語料庫中出現的次數,第三列是這些候選詞在語料庫中出現的概率(頻率)
For this example let’s start in the following table by assuming a unigram language model. We computed the language model from the
404,253,213 words in the Corpus of Contemporary English (COCA).
接下來是求解 channel model
個人理解就是:求解channel model需要用到日常生活中用到的知識經驗,或者行業應用中累積下來的數據(經驗)。
從公式:p(x|w)理解上來看,給定一個正確的候選單詞 w 的條件下,導致錯誤單詞x 的概率有多大?
如果我們收集了足夠多的數據,比如觀察了很多用戶一共輸入了(打字)1萬次 w,其中有10次 輸入成了x(打字打成了 x),那么 p(x|w)=0.0001
我們考慮四種出錯情況:
del[x,y] 表示,輸入 xy 時,少打了字符 'y',結果變成了 x,那么最終得到的單詞是一個錯誤的單詞,記錄下這種情況下出錯的總次數 count(xy typed as x)
trans[x,y]表示,輸入 xy 時,輸入反了,變成了 yx,那么最終得到的單詞是一個錯誤的單詞,記錄下這種情況下出錯的總次數 count(xy typed as yx)
把這些數據統計起來,放在一個表里面,這個表稱為:confusion matrix
比如這個網站(Corpora of misspellings for download)就有一系列的”錯誤單詞的統計數據“。
("錯誤單詞" 示意圖)
那么根據 confusion matrix,就能計算 似然函數的概率了(也即能求解 channel model 了)
解釋一下 if transposition情況:
count[wi wi+1]表示:含有 wi wi+1 字符的所有單詞w 的個數;trans[wi ,wi+1 ] 表示,將 wi 與 wi+1 交換的次數。(將wi 與 wi+1 交換后,就變成了一個錯誤的單詞了)
另一種計算 confusion matrix 的方法是 EM算法,這個我也沒學,不懂,就不說了。
對於錯誤的單詞 acress,根據下面的7個候選單詞計算出來的似然概率如下圖:
上圖中,第一行表示,其中一個正確的候選單詞是 actress,正確的單詞是 t,由於某種原因(鍵盤輸入太快了,漏打了t,本來是輸入ct 的,結果輸入成了c ),統計到的這種情形出現的概率是0.000117 。這種原因,其實就是一個deleteion操作而導致的錯誤。
現在計算出了 似然概率,也計算出了先驗概率,二者相乘:p(x|w)*p(w),就得出了正確的候選單詞 actress 由於deletion 操作導致 得到錯誤單詞 acress 的概率是 0.000117
同理,計算其它的候選單詞 cress、caress、access……的 p(x|w)*p(w)概率,比較一下,哪個概率最大,從上圖中看出:across 對應的概率最大,也就是說:應該將 acress 糾正為:across
但是,事實上,從句子”“的意思來看,acress 應該糾正為 actress 更為合理。那上而的channel model 為什么沒有給出正確的糾正結果呢?
主要原因是:先驗概率是由 unigram language model 得出的,如果采用 bigram language model,那么就能夠正確地找出”actress“,從而將acress糾正為actress
下面是使用Contemporary American English語料庫訓練得到的二元Language Model。對於單詞w:actress 和 across,它給出的先驗概率p(w)如下:
actress對應的先驗概率:p(actress)=p("versatile actress whose")=0.000021*0.0010
across對應的先驗概率:p(across)=1*10-10
這樣,再將先驗概率和似然概率相乘,就能得到正確的單詞應該是”actress“,而不是”across“了。
參考文章:
Natural Language Corpus Data: Beautiful Data
Corpora of misspellings for download
理解貝葉斯公式的一系列文章 或者 推薦《A first course in machine learning 》這本書
機器學習中的貝葉斯方法---先驗概率、似然函數、后驗概率的理解及如何使用貝葉斯進行模型預測(1)
機器學習中的貝葉斯方法---先驗概率、似然函數、后驗概率的理解及如何使用貝葉斯進行模型預測(2)
使用最大似然法來求解線性模型(2)-為什么是最大化似然函數?
使用最大似然法來求解線性模型(4)-最大化似然函數背后的數學原理
原文:http://www.cnblogs.com/hapjin/p/8012069.html