N-Gram(有時(shí)也稱為N元模型)是自然語言處理中一個(gè)非常重要的概念,通常在NLP中,人們基于一定的語料庫,可以利用N-Gram來預(yù)計(jì)或者評估一個(gè)句子是否合理。另外一方面,N-Gram的另外一個(gè)作用是用來評估兩個(gè)字符串之間的差異程度。這是模糊匹配中常用的一種手段。本文將從此開始,進(jìn)而向讀者展示N-Gram在自然語言處理中的各種powerful的應(yīng)用。
基于N-Gram模型定義的字符串距離
利用N-Gram模型評估語句是否合理
使用N-Gram模型時(shí)的數(shù)據(jù)平滑算法
歡迎關(guān)注白馬負(fù)金羈的博客 http://blog.csdn.net/baimafujinji,為保證公式、圖表得以正確顯示,強(qiáng)烈建議你從該地址上查看原版博文。本博客主要關(guān)注方向包括:數(shù)字圖像處理、算法設(shè)計(jì)與分析、數(shù)據(jù)結(jié)構(gòu)、機(jī)器學(xué)習(xí)、數(shù)據(jù)挖掘、統(tǒng)計(jì)分析方法、自然語言處理。
基于N-Gram模型定義的字符串距離
在自然語言處理時(shí),最常用也最基礎(chǔ)的一個(gè)操作是就是“模式匹配”,或者稱為“字符串查找”。而模式匹配(字符串查找)又分為精確匹配和模糊匹配兩種。
所謂精確匹配,大家應(yīng)該并不陌生,比如我們要統(tǒng)計(jì)一篇文章中關(guān)鍵詞 “information” 出現(xiàn)的次數(shù),這時(shí)所使用的方法就是精確的模式匹配。這方面的算法也比較多,而且應(yīng)該是計(jì)算機(jī)相關(guān)專業(yè)必修的基礎(chǔ)課中都會涉及到的內(nèi)容,例如KMP算法、BM算法和BMH算法等等。
另外一種匹配就是所謂的模糊匹配,它的應(yīng)用也隨處可見。例如,一般的文字處理軟件(例如,Microsoft Word等)都會提供拼寫檢查功能。當(dāng)你輸入一個(gè)錯誤的單詞,例如 “ informtaion” 時(shí),系統(tǒng)會提示你是否要輸入的詞其實(shí)是 “information” 。將一個(gè)可能錯拼單詞映射到一個(gè)推薦的正確拼寫上所采用的技術(shù)就是模糊匹配。
模糊匹配的關(guān)鍵在于如何衡量兩個(gè)長得很像的單詞(或字符串)之間的“差異”。這種差異通常又稱為“距離”。這方面的具體算法有很多,例如基于編輯距離的概念,人們設(shè)計(jì)出了 Smith-Waterman 算法和Needleman-Wunsch 算法,其中后者還是歷史上最早的應(yīng)用動態(tài)規(guī)劃思想設(shè)計(jì)的算法之一?,F(xiàn)在Smith-Waterman 算法和Needleman-Wunsch 算法在生物信息學(xué)領(lǐng)域也有重要應(yīng)用,研究人員常常用它們來計(jì)算兩個(gè)DNA序列片段之間的“差異”(或稱“距離”)。甚至于在LeetCode上也有一道“No.72 Edit Distance”,其本質(zhì)就是在考察上述兩種算法的實(shí)現(xiàn)??梢娤嚓P(guān)問題離我們并不遙遠(yuǎn)。
N-Gram在模糊匹配中的應(yīng)用
事實(shí)上,筆者在新出版的《算法之美——隱匿在數(shù)據(jù)結(jié)構(gòu)背后的原理》一書中已經(jīng)詳細(xì)介紹了包括Needleman-Wunsch算法、Smith-Waterman算法、N-Gram算法、Soundex算法、Phonix算法等在內(nèi)的多種距離定義算法(或模糊匹配算法)。而今天為了引出N-Gram模型在NLP中的其他應(yīng)用,我們首先來介紹一下如何利用N-Gram來定義字符串之間的距離。
我們除了可以定義兩個(gè)字符串之間的編輯距離(通常利用Needleman-Wunsch算法或Smith-Waterman算法)之外,還可以定義它們之間的N-Gram距離。N-Gram(有時(shí)也稱為N元模型)是自然語言處理中一個(gè)非常重要的概念。假設(shè)有一個(gè)字符串 s
,那么該字符串的N-Gram就表示按長度 N 切分原詞得到的詞段,也就是 s
中所有長度為 N 的子字符串。設(shè)想如果有兩個(gè)字符串,然后分別求它們的N-Gram,那么就可以從它們的共有子串的數(shù)量這個(gè)角度去定義兩個(gè)字符串間的N-Gram距離。但是僅僅是簡單地對共有子串進(jìn)行計(jì)數(shù)顯然也存在不足,這種方案顯然忽略了兩個(gè)字符串長度差異可能導(dǎo)致的問題。比如字符串 girl 和 girlfriend,二者所擁有的公共子串?dāng)?shù)量顯然與 girl 和其自身所擁有的公共子串?dāng)?shù)量相等,但是我們并不能據(jù)此認(rèn)為 girl 和girlfriend 是兩個(gè)等同的匹配。
為了解決該問題,有學(xué)者便提出以非重復(fù)的N-Gram分詞為基礎(chǔ)來定義 N-Gram距離這一概念,可以用下面的公式來表述:
|GN(s)|+|GN(t)|?2×|GN(s)∩GN(t)|
此處,|GN(s)|
是字符串 s
的 N-Gram集合,N 值一般取2或者3。以 N = 2 為例對字符串Gorbachev和Gorbechyov進(jìn)行分段,可得如下結(jié)果(我們用下畫線標(biāo)出了其中的公共子串)。
結(jié)合上面的公式,即可算得兩個(gè)字符串之間的距離是8 + 9 ? 2 × 4 = 9。顯然,字符串之間的距離越小,它們就越接近。當(dāng)兩個(gè)字符串完全相等的時(shí)候,它們之間的距離就是0。
利用N-Gram計(jì)算字符串間距離的Java實(shí)例
在《算法之美——隱匿在數(shù)據(jù)結(jié)構(gòu)背后的原理》一書中,我們給出了在C++下實(shí)現(xiàn)的計(jì)算兩個(gè)字符串間N-Gram距離的函數(shù),鑒于全書代碼已經(jīng)在本博客中發(fā)布,這里不再重復(fù)列出。事實(shí)上,很多語言的函數(shù)庫或者工具箱中都已經(jīng)提供了封裝好的計(jì)算 N-Gram 距離的函數(shù),下面這個(gè)例子演示了在Java中使用N-Gram 距離的方法。
針對這個(gè)例子,這里需要說明的是:
調(diào)用函數(shù)需要引用lucene的JAR包,我所使用的是lucene-suggest-5.0.0.jar
前面我們所給出的算法計(jì)算所得為一個(gè)絕對性的距離分值。而Java中所給出的函數(shù)在此基礎(chǔ)上進(jìn)行了歸一化,也就是說所得之結(jié)果是一個(gè)介于0~1之間的浮點(diǎn)數(shù),即0的時(shí)候表示兩個(gè)字符串完全不同,而1則表示兩個(gè)字符串完全相同。
import org.apache.lucene.search.spell.*;
public class NGram_distance {
public static void main(String[] args) {
NGramDistance ng = new NGramDistance();
float score1 = ng.getDistance("Gorbachev", "Gorbechyov");
System.out.println(score1);
float score2 = ng.getDistance("girl", "girlfriend");
System.out.println(score2);
}
}
有興趣的讀者可以在引用相關(guān)JAR包之后在Eclipse中執(zhí)行上述Java程序,你會發(fā)現(xiàn),和我們預(yù)期的一樣,字符串Gorbachev和Gorbechyov所得之距離評分較高(=0.7),說明二者很接近;而girl和girlfriend所得之距離評分并不高(=0.3999),說明二者并不很接近。
利用N-Gram模型評估語句是否合理
從現(xiàn)在開始,我們所討論的N-Gram模型跟前面講過N-Gram模型從外在來看已經(jīng)大不相同,但是請注意它們內(nèi)在的聯(lián)系(或者說本質(zhì)上它們?nèi)匀皇墙y(tǒng)一的概念)。
為了引入N-Gram的這個(gè)應(yīng)用,我們從幾個(gè)例子開始。首先,從統(tǒng)計(jì)的角度來看,自然語言中的一個(gè)句子 s
可以由任何詞串構(gòu)成,不過概率 P(s)
有大有小。例如:
s1
= 我剛吃過晚飯
s2
= 剛我過晚飯吃
顯然,對于中文而言 s1
是一個(gè)通順而有意義的句子,而s2
則不是,所以對于中文來說,P(s1)>P(s2)
。但不同語言來說,這兩個(gè)概率值的大小可能會反轉(zhuǎn)。
其次,另外一個(gè)例子是,如果我們給出了某個(gè)句子的一個(gè)節(jié)選,我們其實(shí)可以能夠猜測后續(xù)的詞應(yīng)該是什么,例如
the large green __ . Possible answer may be “mountain” or “tree” ?
Kate swallowed the large green __ . Possible answer may be “pill” or “broccoli” ?
顯然,如果我們知道這個(gè)句子片段更多前面的內(nèi)容的情況下,我們會得到一個(gè)更加準(zhǔn)確的答案。這就告訴我們,前面的(歷史)信息越多,對后面未知信息的約束就越強(qiáng)。
如果我們有一個(gè)由 m
個(gè)詞組成的序列(或者說一個(gè)句子),我們希望算得概率 P(w1,w2,?,wm)
,根據(jù)鏈?zhǔn)揭?guī)則,可得
P(w1,w2,?,wm)=P(w1)P(w2|w1)P(w3|w1,w2)?P(wm|w1,?,wm?1)
這個(gè)概率顯然并不好算,不妨利用馬爾科夫鏈的假設(shè),即當(dāng)前這個(gè)詞僅僅跟前面幾個(gè)有限的詞相關(guān),因此也就不必追溯到最開始的那個(gè)詞,這樣便可以大幅縮減上訴算式的長度。即P(wi|w1,?,wi?1)=P(wi|wi?n+1,?,wi?1)
特別地,對于 n
取得較小值的情況當(dāng) n=1
, 一個(gè)一元模型(unigram model)即為P(w1,w2,?,wm)=∏i=1mP(wi)
當(dāng) n=2
, 一個(gè)二元模型(bigram model)即為P(w1,w2,?,wm)=∏i=1mP(wi|wi?1)
當(dāng) n=3
, 一個(gè)三元模型(trigram model)即為P(w1,w2,?,wm)=∏i=1mP(wi|wi?2wi?1)
接下來的思路就比較明確了,可以利用最大似然法來求出一組參數(shù),使得訓(xùn)練樣本的概率取得最大值。
對于unigram model而言,其中c(w1,..,wn)
表示 n-gram w1,..,wn
在訓(xùn)練語料中出現(xiàn)的次數(shù),M
是語料庫中的總字?jǐn)?shù)(例如對于 yes no no no yes 而言,M=5
)P(wi)=C(wi)M
對于bigram model而言,P(wi|wi?1)=C(wi?1wi)C(wi?1)
對于n
-gram model而言,P(wi|wi?n?1,?,wi?1)=C(wi?n?1,?,wi)C(wi?n?1,?,wi?1)
來看一個(gè)具體的例子,假設(shè)我們現(xiàn)在有一個(gè)語料庫如下,其中<s1><s2>
是句首標(biāo)記,</s2></s1>
是句尾標(biāo)記:
<s1><s2>yesnonononoyes</s2></s1><s1><s2>nononoyesyesyesno</s2></s1>
下面我們的任務(wù)是來評估如下這個(gè)句子的概率:<s1><s2>yesnonoyes</s2></s1>
我們來演示利用trigram模型來計(jì)算概率的結(jié)果P(yes|<s1><s2>)=12,P(no|<s2>yes)=1P(no|yesno)=12,P(yes|nono)=25P(</s2>|noyes)=12,P(</s1>|yes</s2>)=1
所以我們要求的概率就等于:12×1×12×25×12×1=0.05
再舉一個(gè)來自文獻(xiàn)[1]的例子,假設(shè)現(xiàn)在有一個(gè)語料庫,我們統(tǒng)計(jì)了下面一些詞出現(xiàn)的數(shù)量
下面這個(gè)概率作為其他一些已知條件給出:P(i|<s>)=0.25P(english|want)=0.0011P(food|english)=0.5P(</s>|food)=0.68
下面這個(gè)表給出的是基于Bigram模型進(jìn)行計(jì)數(shù)之結(jié)果例如,其中第一行,第二列 表示給定前一個(gè)詞是 “i” 時(shí),當(dāng)前詞為“want”的情況一共出現(xiàn)了827次。據(jù)此,我們便可以算得相應(yīng)的頻率分布表如下。
因?yàn)槲覀儚谋?中知道 “i” 一共出現(xiàn)了2533次,而其后出現(xiàn) “want” 的情況一共有827次,所以P(want|i)=827/2533≈0.33
現(xiàn)在設(shè)s1=“<s>iwantenglishfood</s>”
,則可以算得P(s1)=P(i|<s>)P(want|i)P(english|want)P(food|english)P(</s>|food)=0.25×0.33×0.0011×0.5×0.68=0.000031
使用N-Gram模型時(shí)的數(shù)據(jù)平滑算法
有研究人員用150萬詞的訓(xùn)練語料來訓(xùn)練 trigram 模型,然后用同樣來源的測試語料來做驗(yàn)證,結(jié)果發(fā)現(xiàn)23%的 trigram 沒有在訓(xùn)練語料中出現(xiàn)過。這其實(shí)就意味著上一節(jié)我們所計(jì)算的那些概率有空為 0,這就導(dǎo)致了數(shù)據(jù)稀疏的可能性,我們的表3中也確實(shí)有些為0的情況。對語言而言,由于數(shù)據(jù)稀疏的存在,極大似然法不是一種很好的參數(shù)估計(jì)辦法。
這時(shí)的解決辦法,我們稱之為“平滑技術(shù)”(Smoothing)或者 “減值” (Discounting)。其主要策略是把在訓(xùn)練樣本中出現(xiàn)過的事件的概率適當(dāng)減小,然后把減小得到的概率密度分配給訓(xùn)練語料中沒有出現(xiàn)過的事件。實(shí)際中平滑算法有很多種,例如: ? Laplacian (add-one) smoothing ? Add-k smoothing ? Jelinek-Mercer interpolation ? Katz backoff ? Absolute discounting ? Kneser-Ney
對于這些算法的詳細(xì)介紹,我們將在后續(xù)的文章中結(jié)合一些實(shí)例再來進(jìn)行討論。
A Final Word
如果你能從前面那些繁冗、復(fù)雜的概念和公式中挺過來,恭喜你,你對N-Gram模型已經(jīng)有所認(rèn)識了。盡管,我們還沒來得及探討平滑算法(但它即將出現(xiàn)在我的下一篇博文里,如果你覺得還未過癮的話),但是其實(shí)你已經(jīng)掌握了一個(gè)相對powerful的工具。你可以能會問,在實(shí)踐中N-Gram模型有哪些具體應(yīng)用,作為本文的結(jié)束,主頁君便在此補(bǔ)充幾個(gè)你曾見過的或者曾經(jīng)好奇它是如何實(shí)現(xiàn)的例子。
Eg.1 搜索引擎(Google或者Baidu)、或者輸入法的猜想或者提示。你在用百度時(shí),輸入一個(gè)或幾個(gè)詞,搜索框通常會以下拉菜單的形式給出幾個(gè)像下圖一樣的備選,這些備選其實(shí)是在猜想你想要搜索的那個(gè)詞串。再者,當(dāng)你用輸入法輸入一個(gè)漢字的時(shí)候,輸入法通??梢月?lián)系出一個(gè)完整的詞,例如我輸入一個(gè)“劉”字,通常輸入法會提示我是否要輸入的是“劉備”。通過上面的介紹,你應(yīng)該能夠很敏銳的發(fā)覺,這其實(shí)是以N-Gram模型為基礎(chǔ)來實(shí)現(xiàn)的,如果你能有這種覺悟或者想法,那我不得不恭喜你,都學(xué)會搶答了!
Eg.2 某某作家或者語料庫風(fēng)格的文本自動生成。這是一個(gè)相當(dāng)有趣的話題。來看下面這段話(該例子取材自文獻(xiàn)【1】):
“You are uniformly charming!” cried he, with a smile of associating and now and then I bowed and they perceived a chaise and four to wish for.
你應(yīng)該還沒有感覺到它有什么異樣吧。但事實(shí)上這并不是由人類寫出的句子,而是計(jì)算機(jī)根據(jù)Jane Austen的語料庫利用trigram模型自動生成的文段。(Jane Austen是英國著名女作家,代表作有《傲慢與偏見》等)
再來看兩個(gè)例子,你是否能看出它們是按照哪位文豪(或者語料庫)的風(fēng)格生成的嗎?
This shall forbid it should be branded, if renown made it empty.
They also point to ninety nine point six billion dollars from two hundred four oh three percent of the rates of interest stores as Mexico and Brazil on market conditions.
答案是第一個(gè)是莎士比亞,第二個(gè)是華爾街日報(bào)。最后一個(gè)問題留給讀者思考,你覺得上面兩個(gè)文段所運(yùn)用的n-gram模型中,n應(yīng)該等于多少?
推薦閱讀和參考文獻(xiàn):
[1] Speech and Language Processing. Daniel Jurafsky & James H. Martin, 3rd. Chapter 4[2] 本文中的一些例子和描述來自 北京大學(xué) 常寶寶 以及 The University of Melbourne “Web Search and Text Analysis” 課程的幻燈片素材
轉(zhuǎn)載自 http://blog.csdn.net/baimafujinji/article/details/51281816}