N-Grams筆記
本文為羅周楊原創,轉載請註明作者和出處。
斯坦福經典NLP教程 ofollow,noindex">Speech and Language Processing 中N-Grams讀書筆記。
給一系列的詞語計算概率的模型叫做 語言模型(Language Models) ,其中, n-gram 是最簡單的一種。一個 n-gram
就是一個長度為 N
的詞語組成的序列:
-
N=2
,則是2-gram
( bigram ) -
N=3
,則是3-gram
( trigram )
一個簡單的例子
有一個任務,要計算,即給定歷史計算的概率。假設,我們要計算下一個詞 the
的概率,即:
一個可行的方式是: 在一個很大的語料庫中,統計出現的次數,然後統計的次數,後者除以前者 ,即:
這種方式在很多情況下可行。但是某些情況下仍然會有以下問題:
- 有些詞語在預料中出現次數為0。
相似的問題還出現在:如果我們想知道整個序列的 聯合概率 ,例如,那我們就可以將問題轉化為:“在所有5個詞語的序列中, its water is so transparent
出現了幾次?”
為了解決這個問題,我們需要更好地方式來估計基於的概率,或者整個序列的概率。
我們把一個長度為 N
的序列表示為,簡單表示成,那麼:
上面的 鏈式法則(chain rule) 表面了 聯合概率 和 條件概率 之間的聯絡。
但是上面的連乘也帶來問題:
- 對於很長的序列,計算量很大
- 如果其中任何一項概率為0,那麼整個聯合概率變為0
N-Grams
n-gram並不是計算某個詞基於整個歷史的概率,而是用少數幾個歷史詞語來替代整個歷史。
對於 bigram 模型,我們只計算即可,也就是說,退化成了,即:
這個 單詞的概率只基於前面若干個個單詞 假設叫做 馬爾科夫假設(Markov assumption) 。
因此,對於通常的 n-gram 模型,下一個單詞基於前面所有詞的條件概率,可以簡化為:
回到 bigram 模型,我們整個序列的聯合概率,可以簡化成:
那麼我們怎麼估計這些 bigram 或者 n-gram 的概率呢?一個直觀的方法就是 最大似然估計(maximum likelihood estimation or MLE) 。
具體的做法是,選一個預料,進行計數,然後進行歸一化。
還是以 bigram 為例,
分母是 所有以開頭的詞語的總數 ,也就是所,可以簡化為**出現的次數**!即:
在實際的處理中,我們通常會給每一個句子加上 開始標記 和 結束標記 ,例如 <s>
和 </s>
。
<s>
是為了讓第一個詞語有上下文, </s>
是為了製造一個更加真實的概率分佈。
We need the end-symbol to make the bigram grammer a true probability distribution. Without an end-symbol, the sentence probabilities for all sentences of given length would sum to one.
實際操作的問題和技巧
還有一些實際上的問題和處理方法。
在 N
比較大的 n-gram 模型中,比如 4-gram 或者 5-gram ,對於句子前面的幾個單詞,我們沒有足夠長的歷史詞,那麼我們的做法就是製造幾個偽詞。
例如,在 3-gram 中,對於句子 I love cake.
,我們首先處理成 <s>I love cake.</s>
,那麼對於第一個詞的條件概率$$P(I)$$怎麼計算呢?答案是使用偽詞, P(I|<s><s>)
。
還有就是,我們通常使用 對數概率(log probability) 而不是上面所說的概率,因為對數概率帶來兩個好處:
- 取對數可以把連乘轉換成累加,可以加速計算
- 可以防止數值溢位
評估語言模型
在資料集的劃分上,通常的做法是把訓練集分成以下三部分:
. |-data_set |----training_set(80%) |----dev_set(10%) |----test_set(10%) 複製程式碼
其中,訓練集用來訓練模型,驗證集用來調整模型的引數,測試集用來評估模型的效能。
一個常用的評估方式就是 困惑度(perplexity) 。
對於一個測試集,困惑度計算如下:
根據鏈式法則,有
特別地,對於 bigram ,上式可以簡化為