NLP | 天然語言處理 - 語言模型(Language Modeling)

轉:http://blog.csdn.net/lanxu_yy/article/details/29918015算法

爲何須要語言模型?

想象「語音識別」這樣的場景,機器經過必定的算法將語音轉換爲文字,顯然這個過程是及其容易出錯的。例如,用戶發音「Recognize Speech」,機器可能會正確地識別文字爲「Recognize speech」,可是也能夠不當心錯誤地識別爲「Wrench a nice beach"。簡單地從詞法上進行分析,咱們沒法獲得正確的識別,可是計算機也不懂語法,那麼咱們應該若是處理這個問題呢?一個簡單易行的方法就是用統計學方法(馬爾可夫鏈)從機率上來判斷各個識別的正確可能性。測試

 

什麼是語言模型?

首先,咱們定義一個有限的字典V。V = {the, a, man, telescope ... },經過字典間有限或者無限次笛卡兒積,咱們能夠獲得一個無限的字符串組合S,S可能包含:優化

1,the.net

2,ablog

3,the man字符串

4,the man walksit

...變量

 

其次,假設咱們有一個訓練數據集,數據集中包含了許多文章。經過統計數據集中出現的句子、其出現次數c(x)以及數據集句子總數N,咱們能夠計算出每一個句子的出現頻率。令x ∈ S,p(x) = c(x)/N表示x的出現頻率,顯然Σp(x) = 1。語法

 

綜上所述,咱們能夠發現幾個問題:方法

1)上述的語言模型只是理論上存在的,當訓練數據集無限大的時候,數據集中的頻率能夠無限接近語法中實際的機率;

2)對於S中的大部分句子,p(x)應當等於0,所以S是一個很是稀疏的數據集,很難存儲。

 

馬爾可夫鏈

既然上面這個簡單的語言模型不太完美,咱們天然須要尋找其餘的方法來得到語言模型,其中一個比較著名的算法就是馬爾可夫鏈。假如考慮一個長度爲n的句子能夠利用一串隨機變量來表示,即x1, x2, ... xn,其中xk ∈ V。那麼,咱們的目標是求p(X1 = x1, X2 = x2, ..., Xn = xn)。

 

顯然,p(X1 = x1, X2 = x2, ..., Xn = xn) = p(X1 = x1) * p(X2 = x2 | X1 = x1) * p(X3 = x3 | X1 = x1, X2 = x2) * ... * p(Xn = xn | X1 = x1, X2 = x2, ... Xn-1 = xn-1)。當n過大的時候,條件機率的複雜度會大大地增長,是否可以找到一個近似的方法方便求出這些條件機率呢?答案是確定的,咱們須要作一個假設,即每一個單詞這個隨機變量只與前k個隨機變量相關。

 

 

  • 一階馬爾可夫鏈
一階馬爾可夫鏈中咱們認爲每一個單詞這個隨機變量只與前一個隨機變量相關,所以上述表達式能夠簡化爲p(X1 = x1, X2 = x2, ..., Xn = xn) = p(X1 = x1) * p(X2 = x2 | X1 = x1) * p(X3 = x3 | X2 = x2) * ... * p(Xn = xn | Xn-1 = xn-1) = p(X1 = x1) * ∏p(Xk = xk | Xk-1 = xk-1)
  • 二階馬爾可夫鏈
二階馬爾可夫鏈中咱們認爲每一個單詞這個隨機變量只與前兩個隨機變量相關,所以上述表達式能夠簡化爲p(X1 = x1, X2 = x2, ..., Xn = xn) = p(X1 = x1) * p(X2 = x2 | X1 = x1) * p(X3 = x3 | X1 = x1, X2 = x2) * ... * p(Xn = xn | Xn-2 = xn-2, Xn-1 = xn-1) = p(X1 = x1) * p(X2 = x2 | X1 = x1) * ∏p(Xk = xk | Xk-2 = xk-2, Xk-1 = xk-1)
 
一般長度n不是固定的,而且爲了表述方便,咱們能夠作一些細節的優化。
1)增長一個開始符號」*「,咱們定義全部句子都是以」*「開始,即X-1 = X0 = *;
2)增長一個結束符號」STOP「,咱們定義全部句子都是以」STOP「結束。
綜上所述,馬爾可夫鏈表達式能夠簡化爲:
一階馬爾可夫鏈:p(X1 = x1, X2 = x2, ..., Xn = xn) = ∏p(Xk = xk | Xk-1 = xk-1)
二階馬爾可夫鏈:p(X1 = x1, X2 = x2, ..., Xn = xn) = ∏p(Xk = xk | Xk-2 = xk-2, Xk-1 = xk-1)
 

二階馬爾可夫的語言模型

有了二階馬爾可夫,咱們能夠從新定義一下語言模型:
1)一個有限的字典V
2)對於每一個Trigram(三個連續的詞)定義一個參數q(w | u, v),w∈ V ∪ {STOP},u, v ∈ V ∪ {*}
3)對於任意句子x1, x2, ... xn,其中x-1 = x0 = *,xn = STOP,xk(k = 1, 2, ..., n-1)∈ V,句子的出現機率p(x1, x2, ... xn) = ∏q(Xk = xk | Xk-2 = xk-2, Xk-1 = xk-1)
 
舉個例來說,對於句子the dog barks STOP,咱們能夠作以下分析:
p(the dog barks STOP) = q(the | *, *) * q(dog | *, the) * q(barks | the, dog) * q(STOP | dog, barks)
 

二階馬爾可夫的語言模型的計算

計算二階馬爾可夫的語言模型彷佛變成了一個簡單的統計問題,經過在訓練數據集中統計連續三個詞的出現次數c(u, v, w)和兩個詞的出現次數c(u, v),q(w | u, v) = c(u, v, w) / c(u, v)。

 

算法到了這裏看起來挺完美了,若是有一個不錯的訓練數據集,咱們就能夠訓練出語言模型了。可是上文咱們還提到一個問題,即訓練數據集的稀疏性。只有數據集無限大的時候咱們才能保證全部可能出現的句子都被語言模型包含,不然咱們沒法得到可靠的語言模型。另外,假若任意一個Trigram(三個連續的詞)對應的q(w | u, v) = 0,咱們將災難性地得到句子的機率等於0。

 

現實生活中,咱們沒法得到無限大的訓練數據集,由於咱們但願找到一個近似的算法來是全部的Trigram(三個連續的詞)對應的q(w | u, v)都不爲0,同時儘量地找到與事實接近的q(w | u, v)。一種常見的方法是利用Unigram(單個詞)、Bigram(兩個詞)、Trigram(三個詞)來作近似的計算。

Unigram:q'(w) = c(w) / c()

Bigram:q'(w | v) = c(v, w) / c(v)

Trigram:q'(w | u, v) = c(u, v, w) / c(u, v)

咱們定義q(w | u, v) = k1 * q'(w | u, v) + k2 * q'(w | v) + k3 * q'(w),其中k1 + k2 + k3 = 1,ki >= 0。

 

首先,咱們須要證實Σq(w | u, v) = 1。即Σq(w | u, v) = Σ[k1 * q'(w | u, v) + k2 * q'(w | v) + k3 * q'(w)] = k1 * Σq'(w | u, v) + k2 * Σq'(w | v) + k3 * Σq'(w) = k1 * 1 + k2 * 1 + k3 * 1 = k1 + k2 + k3 = 1。

 

其次,咱們應該若是肯定k1, k2與k3呢?利用相似交叉熵(Cross Entropy)的方法,咱們可讓q(w | u, v)儘可能接近訓練集中的統計結果。假設c'(u, v, w)是從測試集中統計出的Trigram(三個詞)的出現次數,L(k1, k2, k3) = Σc'(u, v, w) * log[q(w | u, v)]。知足L(k1, k2, k3)最大化的臨界點便能肯定k1, k2, k3。

 

 

二階馬爾可夫的語言模型的度量:複雜度(Perplexity)

 

假設咱們有一個測試數據集(共M個句子),每一個句子si對應一個機率p(si),所以測試數據集的機率積爲∏p(si)。通過簡化,咱們能夠獲得log∏p(si) = Σlog[p(si)]。Perplexity = 2^-l,其中l = 1 / M Σlog[p(si)]。(相似熵的定義)

 

幾個直觀的例子:

1)假設q(w | u, v) = 1/ M,Perplexity = M;

2)|V| = 50000的數據集的Trigram模型,Perplexity = 74;

3)|V| = 50000的數據集的Bigram模型,Perplexity = 137;

4)|V| = 50000的數據集的Unigram模型,Perplexity = 955。

相關文章
相關標籤/搜索