Noisy Channel模型糾正單詞拼寫錯誤


本文介紹 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)-為什么是最大化似然函數?

使用最大似然法來求解線性模型(3)-求解似然函數

使用最大似然法來求解線性模型(4)-最大化似然函數背后的數學原理

 

 NLP里面的一些基本概念

 

原文:http://www.cnblogs.com/hapjin/p/8012069.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM