N-gram模型是一種語言模型(Language Model,LM),語言模型是一個基於概率的判別模型,它的輸入是一句話(單詞的順序序列),輸出是這句話的概率,即這些單詞的聯合概率(joint probability)。
N-gram本身也指一個由N個單詞組成的集合,考慮單詞的先后順序,且不要求單詞之間互不相同。常用的有 Bi-gram (N=2N=2N=2) 和 Tri-gram (N=3N=3N=3),一般已經夠用了。例如在上面這句話里,我可以分解的 Bi-gram 和 Tri-gram :
Bi-gram : {I, love}, {love, deep}, {love, deep}, {deep, learning}
Tri-gram : {I, love, deep}, {love, deep, learning}N-gram中的概率計算
聯合概率的簡單推導過程:A,B,C三個有順序的句子。
由於
P(C/(A,B))=P(A,B,C)/P(A,B)
P(B/A) = P(A,B)/P(B)
所以
P(C/(A,B))=P(A,B,C)/(P(B/A) *P(B))
P(A,B,C) = P(C/(A,B))*P(B/A) *P(B)
所以我們可以很容易的得到上面的多個單詞的聯合概率,但是由於存在參數空間過大等問題,我們可以僅僅考慮之前的一個或者幾個詞的前提條件的聯合概率,可以降低時間復雜度,減少計算量。
然后通過極大似然函數求解上面的概率值
是從整個數據庫中去計算上述的概率值,而不是一整句話。
1、可以用於詞性標注,類似成多分類的情況:
例如:我愛中國!
判斷愛的詞性可以通過P(詞性i/(名詞我出現,愛字出現))=P(名詞我出現,愛字不同的詞性)/P(名詞的我出現,愛字所有出現的次數)
2、可以用於垃圾短信分類:
- 步驟一:給短信的每個句子斷句。
- 步驟二:用N-gram判斷每個句子是否垃圾短信中的敏感句子。
- 步驟三:若敏感句子個數超過一定閾值,認為整個郵件是垃圾短信。
3、用於分詞作用
在NLP中,分詞的效果很大程度上影響着模型的性能,因此分詞甚至可以說是最重要的工程。用N-gram可以實現一個簡單的分詞器(Tokenizer)。同樣地,將分詞理解為多分類問題:X表示有待分詞的句子,Yi表示該句子的分詞方案:
X="我愛深度學習"
Y1={"我","愛深","度學習"}
Y2={"我愛","深","度學","習"}
Y3={"我","愛","深度學習"}
p(Y1)=p(我)p(愛深∣我)p(度學習∣愛深)
p(Y2)=p(我愛)p(深∣我愛)p(度學∣深)p(習∣度學)
p(Y3)=p(我)p(愛∣我)p(深度學習∣愛)
三個概率中,“我愛”可能在語料庫中比較常見,因此p(愛∣我)p(愛|我)p(愛∣我)會比較大,然而“我愛深”這樣的組合比較少見,
於是p(愛深∣我)p(愛深|我)p(愛深∣我)和p(深∣我愛)p(深|我愛)p(深∣我愛)都比較小 ,因此第三種分詞方案最佳。
語音識別和機器翻譯中也用到。
N-gram中的數據平滑方法
由於N-gram的N越大,模型效果越好。這在直觀意義上是說得通的,畢竟依賴的詞越多,我們獲得的信息量越多,對未來的預測就越准確。然而,語言是有極強的創造性的(Creative),當N變大時,更容易出現這樣的狀況:某些n-gram從未出現過,這就是稀疏問題。
n-gram最大的問題就是稀疏問題(Sparsity)。例如,在bi-gram中,若詞庫中有20k個詞,那么兩兩組合就有近2億個組合。其中的很多組合在語料庫中都沒有出現,根據極大似然估計得到的組合概率將會是0,從而整個句子的概率就會為0。最后的結果是,我們的模型只能計算零星的幾個句子的概率,而大部分的句子算得的概率是0,這顯然是不合理的。
因此,我們要進行數據平滑(data Smoothing),數據平滑的目的有兩個:一個是使所有的N-gram概率之和為1,使所有的n-gram概率都不為0。它的本質,是重新分配整個概率空間,使已經出現過的n-gram的概率降低,補充給未曾出現過的n-gram。
為了解決稀疏問題和參數空間過大的問題,從機器學習的角度看N-gram模型:
vi*hi代表利用神經網絡學習出來的預測值,利用預測值與真實的概率值的差值作為損失函數。
v和h通過上述這種網絡結構進行學習,然后經過softmax函數計算出概率值然后和目標值做差進行更新參數v,h。
每一個神經元在上一個單詞的前提下預測此單詞的概率,最終把所有的計算出來,相乘就是最終的結果。在RNN上的應用
RNN結構比神經網絡結構好是因為可以減少參數。