N-gram模型
(一)引言
N-gram是自然語言處理中常見一種基於統計的語言模型。它的基本思想是將文本里面的內容按照字節進行大小為N的滑動窗口操作,形成了長度是N的字節片段序列。每一個字節片段稱為gram,在所給語句中對所有的gram出現的頻數進行統計。再根據整體語料庫中每個gram出現的頻數進行比對可以得到所給語句中每個gram出現的概率。N-gram在判斷句子合理性、句子相似度比較、分詞等方面有突出的表現。
(二)朴素貝葉斯(Naive Bayes)
首先我們復習一下一個非常基本的模型,朴素貝葉斯(Naive Bayes)。朴素貝葉斯的關鍵組成是貝葉斯公式與條件獨立性假設。可以參考(https://www.yuque.com/dadahuang/tvnnrr/gksobm)。為了方便說明,我們舉一個垃圾短信分類的例子:
假如你的郵箱受到了一個垃圾郵件,里面的內容包含:
“性感荷官在線發牌...”
根據朴素貝葉斯的目的是計算這句話屬於垃圾短信敏感句子的概率。根據前面朴素貝葉斯的介紹,由 可得:
P(垃圾短信|“性感荷官在線發牌”) 正相關於 P(垃圾郵件)P(“性感荷官在線發牌”|垃圾短信)
由條件獨立性假設可得:
P(“性感荷官在線發牌”|垃圾短信) = P("性","感","荷","官","在","線","發","牌"|垃圾短信) = P(“性”|垃圾短信)P(“感”|垃圾短信)P(“荷”|垃圾短信)...P(“牌”|垃圾短信)
上面每一項條件概率都可以通過在訓練數據的垃圾短信中統計每個字出現的次數得到,然而這里有一個問題,朴素貝葉斯將句子處理為一個“詞袋模型(Bag-of-Words, BoW)”,以至於不考慮每個單詞的順序。這一點在中文里可能沒有問題,因為有時候即使把順序打亂,我們還是能看懂這句話在說什么,但有時候不行,例如:
“我喜歡打游戲”跟“游戲喜歡打我”意思就變了。
下面就介紹考慮到語句中單詞之間順序的語言模型----N-gram
(二)N-gram模型
(1) 概念
N-gram是一種語言模型N-gram模型是一種語言模型(Language Model,LM),語言模型是一個基於概率的判別模型,它的輸入是一句話(單詞的順序序列),輸出是這句話的概率,即這些單詞的聯合概率(joint probability)。比如:
假設你在和一個外國人交流,他說了一句“I have a gun”,但是由於他的發音不標准,到你耳朵里可能是“I have a gun”、“I have a gull”或“I have a gub”。那么哪句話是正確的呢?。假設你根據經驗覺得有80%的概率是“I have a gun”,那么你已經得到一個N-gram的輸出。即:
P(****I have a gun) = 80%
N-gram本身也指一個由N個單詞組成的集合,各單詞具有先后順序,且不要求單詞之間互不相同。常用的有 Bi-gram (N=2) 和 Tri-gram (N=3),一般已經夠用了。例如在“I love deep learning”這句話里,可以分解的** Bi-gram** 和 Tri-gram :
**Bi-gram : {I, love}, {love, deep}, {love, deep}, {deep, learning}
Tri-gram : **{I, love, deep}, {love, deep, learning}
(2) 概率計算
假設你並不知道馬爾科夫假設(Markov Assumption),那么我們該如何計算N-gram的輸出,即一個句子的概率呢。給定一個句子S=(),首先假設句子中的每個單詞
都依賴於第一個單詞到它前一個單詞
的影響,則這個句子的概率為(
):
但是,顯而易見,這種計算方法有兩個缺陷:
- 參數空間過大,計算量太大:p(w_3|w_1w_2)···p(w_n|w_{n-1}···w_2w_1)的參數就有O(n)個。
- 數據稀疏嚴重:詞同事出現的情況很大可能沒有。組合階數越大越明顯。
(3) 引入馬爾科夫假設
舉個例子:以Bi-gram為例。假如有三句話:“you like cat”、“he like cat and dog”,“he like you”。
根據統計可得 “you”出現了3次,“you like”出現了1次。則根據公式得:
同理:
再提供一個經典的例子:
《Language Modeling with Ngrams》中,Jurafsky et al., 1994 從加州一個餐廳的數據庫中做了一些統計:
據統計, 則"I want chinese food"這句話的概率為:
如果一段話很長,則結果會很小(約等於0),這時可以用log概率來做。
(4) N-gram中的數據平滑方法
n-gram最大的問題就是稀疏問題(Sparsity)。例如,在bi-gram中,若詞庫中有20k個詞,那么兩兩組合就有近2億個組合。其中的很多組合在語料庫中都沒有出現,根據極大似然估計得到的組合概率將會是0,從而整個句子的概率就會為0。最后的結果是,我們的模型只能計算零星的幾個句子的概率,而大部分的句子算得的概率是0,這顯然是不合理的。
因此,我們要進行數據平滑(data Smoothing),數據平滑的目的有兩個:一個是使所有的N-gram概率之和為1,使所有的n-gram概率都不為0。它的本質,是重新分配整個概率空間,使已經出現過的n-gram的概率降低,補充給未曾出現過的n-gram。
(4) N-gram對訓練數據集的要求
關於N-gram的訓練數據,如果你以為“只要是英語就可以了”,那就大錯特錯了。文獻《Language Modeling with Ngrams》**的作者做了個實驗,分別用莎士比亞文學作品,以及華爾街日報作為訓練集訓練兩個N-gram,他認為,兩個數據集都是英語,那么用他們生成的文本應該也會有所重合。然而結果是,用兩個語料庫生成的文本沒有任何重合性,即使在語法結構上也沒有。
這告訴我們,N-gram的訓練是很挑數據集的,你要訓練一個問答系統,那就要用問答的語料庫來訓練,要訓練一個金融分析系統,就要用類似於華爾街日報這樣的語料庫來訓練。