語言模型
在統計自然語言處理中語言模型是很重要的一塊,常用的語言模型是n元語法模型,當然現在比較流行的還有神經網路語言模型。n元語法模型需要額外的平滑處理,而神經網路語言模型則不必,它自帶平滑效果。
n元語法
n元語法(n-gram)是NLP中很重要的統計語言模型,簡單來說就是計算某個句子出現的概率,比如“我今天上班遲到了”這句話在整個語言下的概率,一般我們會通過一個大的語料庫來進行統計。
用數學語言來描述,假設我們的句子為
,則該句子的概率為
其中P(w1)表示第一個詞w1出現的概率;P(w2|w1)是第一個詞出現的前提下第二個詞出現的概率;以此類推。比如s=“我今天上班遲到了”,那麼P(s)=P(我)P(今天|我)P(上班|我,今天)P(遲到了|我,今天,上班)。
如果嚴格按照上述公式計算概率,假設總詞彙大小為 N,那麼第 t 個詞的概率 要考慮
種情況,當 N 較大時,句子長度也較長時,將產生一個天文數字的自有引數,無法計算。
上述的語言模型的引數空間太大而且資料稀疏,導致在實際中基本無法使用。所以我們需要一個假設,某個詞出現的概率只與它前面的一個或幾個詞有關,這個假設就是馬爾科夫假設。
- 當 n=1 時,稱為一元語法,被記為unigram,此時第 i 個詞出現的概率完全獨立與之前的情況。
- 當 n=2 時,稱為二元語法,被稱為一階馬爾科夫鏈,記為bigram,此時第 i 個詞出現的概率與它的前一個詞有關。
- 當 n=3 時,稱為三元語法,被稱為二階馬爾科夫鏈,記作trigram,此時第 i 個詞出現的概率與它的前兩個詞有關。
有了上面的假設,問題就變簡單了,對於二元語法,某個句子出現的概率就可以用下面表示
實際應用中 n 取3比較多,取太大仍然存在自由引數太多問題。另外為了使當 t=1 時上述公式仍然有意義,可以在句子面前加上一個句子起始標記,而結尾也可以新增句子結束標記。
計算條件概率
平滑處理
為什麼需要平滑處理?假如有些句子中存在一些訓練語料未包含的詞,或者連著的詞在訓練語料中未出現過。這時候就會讓概率變為0,比如,計算
但實際上它的概率不能說是為0,所以此時就需要平滑處理。最簡單的平滑處理就是加1法,假設出現的次數比實際多一次,這樣就不會存在為0的情況了。
其中T為總詞彙數量。
加1法有時效果不好,可以用其他方法處理,包括
- Good-Turing估計法
- Katz平滑法
- Jelinek-Mercer平滑法
- Kneser-Ney平滑法
- 貝葉斯平滑法
- 等等
缺點
n-gram這種處理序列資訊的方式依然存在侷限性,比如當n大於3時基本就無法處理了,引數空間太大。另外它不能表示詞與詞之間的關聯性。
========廣告時間========
公眾號的選單已分為“分散式”、“機器學習”、“深度學習”、“NLP”、“Java深度”、“Java併發核心”、“JDK原始碼”、“Tomcat核心”等,可能有一款適合你的胃口。
鄙人的新書《Tomcat核心設計剖析》已經在京東銷售了,有需要的朋友可以到 item.jd.com/12185360.ht… 購買。感謝各位朋友。
=========================
歡迎關注: