1. 程式人生 > >通俗理解N-gram語言模型。(轉)

通俗理解N-gram語言模型。(轉)

資料 簡化 事情 自然 自然語言 規模 什麽 發音 給定

N-gram語言模型

考慮一個語音識別系統,假設用戶說了這麽一句話:“I have a gun”,因為發音的相似,該語音識別系統發現如下幾句話都是可能的候選:1、I have a gun. 2、I have a gull. 3、I have a gub. 那麽問題來了,到底哪一個是正確答案呢?

一般的解決方法是采用統計的方法。即比較上面的1、2和3這三句話哪一句在英語中出現的概率最高,哪句概率最高就把哪句返回給用戶。那麽如何計算一個句子出現的概率呢?說白了就是“數數”的方法。但是即使是“數數”也有很多種數法,其中,最簡單的策略如下:

給定一個語料庫,數出其中所有的長度為4的句子的個數,設為N,然後再看在這N個長度為4的句子中,“I have a gun”出現了多少次,不妨設為N0

,那麽句子“I have a gun”的概率就是N0/N。其它兩個句子的概率也這麽計算。

上述的這種數數方法,從邏輯上講是完全OK的,但是因為自然語言的靈活多變性,以及語料庫的規模總是有限的,對於一個稍長一點的句子,很可能語料庫中根本就沒有。比如說下面這個句子:“I am looking for a restaurant to eat breakfast”,直觀上看,這句話在語料庫中應該出現次數很多吧?但是如果把這句話輸入到Google的搜索框中,點擊搜索,你會發現返回的結果中根本就沒有完全匹配上的。所以,我們需要提出更加有效的“數數”方法。

為了把事情說清楚,需要引入一些簡單的數學符號。

1、word序列:w1

, w2, w3, … , wn

2、鏈式規則:P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)

好了,我們想要計算“I have a gun”的概率,也就是計算P(I,have,a,gun),按照鏈式規則,則有:

P(I,have,a,gun)=P(I)P(have|I)P(a|I,have)P(gun|I,have,a)

但是事情並沒有得到簡化,例如要計算P(gun|I,have,a),按照條件概率公式展開:

P(gun|I,have,a) = P(I,have,a,gun)/P(I,have,a)

發現了什麽?為了計算P(gun|I,have,a),我們需要先計算P(I,have,a,gun)和P(I,have,a)。哎?P(I,have,a,gun)不就是我們一開始想要計算的值嗎?所以繞了一圈,我們又回到了原地?

好了,現在我們來整理一下思路。

對於一個句子,其可以表示為一個word序列:w1, w2, w3, … , wn。我們現在想要計算句子出現的概率,也就是計算P(w1, w2, w3, … , wn)。這個概率我們可以直接用數數的方法求解,但是效果並不好,所以我們利用鏈式規則,把計算P(w1, w2, w3, … , wn)轉化為計算一系列的乘積:P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)。但是轉化之後,問題並沒有變得簡單。怎麽辦?

N-gram這時候就派上用場了。

對於1-gram,其假設是P(wn|w1w2…wn-1)≈P(wn|wn-1)

對於2-gram,其假設是P(wn|w1w2…wn-1)≈P(wn|wn-1,wn-2)

對於3-gram,其假設是P(wn|w1w2…wn-1)≈P(wn|wn-1,wn-2,wn-3)

依次類推。

所以:

在1-gram模型下:

P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)

≈P(w1)P(w2|w1)P(w3|w2)P(w4|w3)…P(wn|wn-1)

在2-gram模型下:

P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)

≈P(w1)P(w2|w1)P(w3|w1w2)P(w4|w2w3)…P(wn|wn-2wn-1)

在3-gram模型下:

P(w1, w2, w3, … , wn)=P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|w1w2…wn-1)

≈P(w1)P(w2|w1)P(w3|w1w2)P(w4|w1w2w3)…P(wn|wn-3wn-2wn-1)

假設我們采用的是1-gram模型,那麽:

P(I,have,a,gun)=P(I)P(have|I)P(a|have)P(gun|a).

然後,我們再用“數數”的方法求P(I)和其他的三個條件概率:

P(I)=語料庫中I出現的次數 / 語料庫中的總詞數

P(have|I) = 語料庫中I和have一起出現的次數 / 語料庫中I出現的次數。

總結,本文只是對N-gram做了非常簡單的介紹,目的在於簡單易懂,但是不夠嚴謹。感興趣的同學可以進一步查閱相關的資料。在任何一本關於自然語言處理的書上都能夠找到N-gram的內容。

通俗理解N-gram語言模型。(轉)