經典的語言模型:N-gram

語言模型

一個語言模型通常構建為字符串的S的概率分布P(s)。比如,每個人100句話中平均大約有一句“你好”,那么“你好”這句話的概率大致為p= 0.01,像“野豬會做飯燒菜”,基本沒人會說,則可以認為其概率為0。語言模型中的句子和語法無關,只和出現的可能性相關。
假設構成一個句子S = w1w2w3....wn。其概率計算公式可以表示為:
p(s) = p(w1)p(w2|w1)p(w3|w1w2).....p(wl|w1...w_{l-1}),隨著句子的增長,計算難度是呈指數型增長的。
一個比較實際的做法是只考慮當前詞只和前n個詞相關,其余無關。這種語言模型稱之為n-gram。一般n=2,3應用的比較多。

以二元文法為例:2-gram

我寫了一本書,分詞后為:我 寫了 一本 書。因為開頭和結尾沒有,則會為句子添加<BOS>,<EOS>,分別代表開始和結束。
即這句話的概率p=p(我|BOS)*p(寫了|我)*p(一本|寫了)*p(書|寫了)*P(EOS|書)

如何確定p(我|BOS)的值呢?
首先構建語言模型的數據為訓練數據。假設通過統計得到 "BOS 我” = 5次
“BOS 你” = 3次 ,“BOS 他” = 4次,,則p(我|BOS)= 5/(5+3+4) = 5/12 ,其他同理,最終可以得出這句話的概率。 顯然,語言中肯定存在不在模型中的詞(未登錄詞,新詞等等)。比如心來的句子p(開始|BOS) = 0。 那么這個以“開始”開頭的句子概率為0,顯然不夠合理。

數據平滑

平滑技術就是用來解決這類概率為0的情況。

加法平滑技術

在上述問題中,字面理解,就是默認給每個詞組+1,即p(我|BOS)= 5+1/{(5+3+4)+3} =6/ 15。p(開始|BOS) = (0+1)/{(5+3+4)+3 +1} = 1/16。 概率為0的問題也得到了有效的解決。

古德圖零估計法

基本思路:對于任何一個出現r次的n元語法,都假設它出出現了r^*次。
r^* = (r+1)*\frac{n_{r+1}}{n_r}
其中,n_r為出現r次的n元語法個數,n_{r+1}同理。
可以看出,這個估計法不能直接應用于n_r = 0 的情況。

Kaza平滑技術

待定

模型評估

評估一個模型的好壞,就是看這個模型在測試數據(實際數據)上的表現情況。準確率,回歸率等等。而評價一個語言模型常用的方法有測試數據的概率,或交叉熵,困惑度等等。

語言模型設計的任務就是尋找最接近真實語言的模型。所以,采用用交叉熵或困惑度來評估模型,熵值越小,表示模型越接近真實語言。
交叉熵公式為:
H(L,q) = -\lim_{n ->\infty}\frac{1}{n}\sum_n^ip(x_i)logq(x_i)
首先p(x_i)是真實詞x_i的概率,這個值無法獲取。但可以確定的是,它是一個定值。
所以H(L,q)\approx-\frac{1}{W}logp(T),p(T)的是文本T的概率,W是文本T詞的個數 。
加個2的次冪其實就是困惑度了。所以一般用困惑度來代替交叉熵來評估語言模型。
困惑度:PP = 2^{-\frac{1}{W}logp(T)}

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容