NLP入門之N元語法模型

在上邊咱們知道其實當今的天然語言處理的主流趨勢是統計天然語言處理,而統計天然語言處理的基本目的就是結合語料庫中的一些數據對於某些未知的數據進行處理,從而根據這些數據分佈獲得一些推論,你們想想,咱們在語料庫裏發現」你」和」吃飯了麼」這兩個詞老是存在着一些附着關係,是否是咱們就有預測在一些未知的文章中也會有這樣附着關係?
算法

在這一篇文章中,咱們將會介紹下n元語法模型和解決由於數據缺少的狀況下引入的幾種經常使用的平滑度算法,學習

1:n元語法模型3d

n元語法模型的基本的公式能夠看做爲下面的機率公式P:cdn

這個公式所表示的含義實際上是在產生第i個詞的機率是由前邊已經產生的從w1到wi-1的這個詞機率來決定的,在這樣的一個過程當中,咱們使用了先前詞,也就是經過用先前詞來去預測下一個將要出現的詞,而後咱們根據大量的文本觀測,咱們會知道這個詞會不會愈來愈趨向於在這些詞的後面.好比上邊舉例的」你」」吃飯了麼」,如今假設咱們的文本中有1000句話,如今你吃飯了麼出現了20次,這樣的話咱們就會獲得相應的出現這個詞的機率P(吃飯了麼)=(20/1000)=(1/50).blog

固然,在實際的任務中沒有那麼多實際的文本歷史供咱們參考,不少時候出現的詞或者句子咱們以前都沒有見過,這樣的話咱們之前的經驗就沒有辦法預測了,好比:咱們遇到了一個句子:」你吃飯不吃飯?」,這樣的話就跟」你吃飯了麼」在前半部分是同樣,可是後邊卻有一個不同的結尾.那要怎麼解決這個問題呢?是否是把之前的文本出現過的歷史組合進行總結,而後進行學習,對於預期將要出現的詞,會不會出現一個合理的預測呢?事件

這樣的組合文本歷史的可能出現的方法就是咱們常說的馬爾科夫假設,這個假設其實說的就是上邊所對應的問題,這個假設說的其實就是認爲接下來要出現的詞是由前邊出現的詞來影響的.若是按照上邊的公式來講,由於前邊是由i-1個詞語,那麼若是咱們構造一個模型的話,全部的歷史其實就是前邊的i-1個詞,這樣的話咱們構造的模型就成爲(n-1)階馬爾科夫模型,或者說n元語法模型(由於咱們要預測第n個詞).it

這裏要說一下這個n的取值問題,通常狀況下咱們是不能把這個n取值過大的,要是過大的話,確定會有不少的等價類,太多的自由參數未必是一件好事(其實把數據劃分紅多個等價類有利有弊,一方面若是咱們把數據分割成多個類的話其實可讓咱們有更多的辨別性,可是要是使用了太多的等價類,那麼對於每一個類別來講,他的訓練數據很小,甚至有些部分沒有訓練數據,這樣的話再去作目標特徵的統計估計這時候就很不許確了,因此這時候如何去權衡,找到一個合適的類別數,是咱們的一個探索目標.)那麼這時候咱們再去看看n的取值問題,通常狀況下大多數經常使用的n的取值是n=2,3,4的狀況,這個時候分別稱爲bigram(二元語法),trigram(三元語法),fourgram(四元語法).io

如今假設一個說話者的使用詞有20000個,那麼參數的數量以下圖所示:class

從這個圖上咱們看到,到四元語法模型就已經擁有很是巨大的參數了,因此構造更多的語法模型顯然是不現實的.語法

2:構建n元語法模型

1;一般構建模型的第一步是處理語料

首先咱們須要對語料進行處理,由於根據n元語法要求,一個詞的機率只跟前邊的詞的機率有關,由於要使全部的機率之和爲1,所以咱們要在句首和句尾加上一個句首標記和句尾標記,這樣的話咱們就能夠計算,下邊舉一個例子:

p(I Love You)

在這樣處理完句子以後,若是咱們獲得了一個肯定的語料庫,若是如今一個詞出現了10次,好比:」good」後面有8次跟着」morning」,1次」boy」,一次」girl」,那麼估計下一個詞,咱們會出現哪種機率呢?

其實咱們能夠考慮使用相對機率來估計:

P(morning)=0.8

P(girl)=0.1

P(boy)=0.1

P(other)=0(other不屬於上述三個詞彙)

這樣歸類以後,去給這些數據計算他們的機率了,再去歸一化,這樣就能夠計算出來:

在這裏咱們去用C(w1.......wn)來表示n元語法在給定文本中出現的次數,這樣的話咱們就有下邊的計算公式:

像這樣的估計的處理方式,咱們叫作p(wn|w1.........wn-1)的最大似然估計(MLF)

之因此稱爲最大似然估計,是由於他選擇的參數相對於訓練數據給出了最高的機率(知足了正常隨機約束),可是其實我在上網搜這個問題的時候,不少人說MLF是不太適合天然語言處理的,由於自己咱們的語料庫規模會很大,咱們的數據會很稀疏,而且像上邊那樣的經常使用詞機率這麼高的狀況是很是理想的狀態,大部分詞都是不經常使用的,那麼這樣就會出現一個問題,若是一個n元組正好在判別時沒有了訓練語料出現時,這時候的機率就會不好,就跟上邊的詞,good後邊還能夠跟不少的詞,可是最大似然估計並不會認爲會有其餘的詞跟在這個good後邊.

那麼應該怎麼去解決這個問題,這個時候咱們就會想應該要有一種更好的估計方法,要是可以判別出在訓練數據中沒有出現的事件,而且可以給出必定的機率,這時候一些研究者給出了更好方法:

若是能夠經過稍微減小已經觀察到的事件機率的大小,而且能夠把少許的機率分配到沒有看到過的事件上,這時候每件事件都會發生而且可能有效的工做,這個就是咱們常說的折扣法,折扣的過程就叫作平滑(這難道是由於沒有0值分佈會比有0值分佈更平滑?)

那麼咱們應該如何進行平滑,平滑的經常使用方式有幾種,在下一篇文章中咱們將講述下幾種經常使用的數據平滑方法.

初學NLP,不足之處請各位多多批評指正,在此謝過!

相關文章
相關標籤/搜索