在上邊我們知道其實當今的自然語言處理的主流趨勢是統計自然語言處理,而統計自然語言處理的基本目的就是結合語料庫中的一些資料對於某些未知的資料進行處理,從而根據這些資料分佈得到一些推論,大家想一想,我們在語料庫裡發現”你”和”吃飯了麼”這兩個詞總是存在著一些附著關係,是不是我們就有預測在一些未知的文章中也會有這樣附著關係?
在這一篇文章中,我們將會介紹下n元語法模型和解決因為資料缺乏的情況下引入的幾種常用的平滑度演算法,
1:n元語法模型
n元語法模型的基本的公式可以看作為下面的概率公式P:
這個公式所表示的含義其實是在產生第i個詞的概率是由前邊已經產生的從w1到wi-1的這個詞概率來決定的,在這樣的一個過程中,我們使用了先前詞,也就是通過用先前詞來去預測下一個將要出現的詞,然後我們根據大量的文字觀測,我們會知道這個詞會不會越來越趨向於在這些詞的後面.比如上邊舉例的”你””吃飯了麼”,現在假設我們的文字中有1000句話,現在你吃飯了麼出現了20次,這樣的話我們就會得到相應的出現這個詞的概率P(吃飯了麼)=(20/1000)=(1/50).
當然,在實際的任務中沒有那麼多實際的文字歷史供我們參考,很多時候出現的詞或者句子我們之前都沒有見過,這樣的話我們以前的經驗就沒有辦法預測了,比如:我們遇到了一個句子:”你吃飯不吃飯?”,這樣的話就跟”你吃飯了麼”在前半部分是一樣,但是後邊卻有一個不一樣的結尾.那要怎麼解決這個問題呢?是不是把以前的文字出現過的歷史組合進行總結,然後進行學習,對於預期將要出現的詞,會不會出現一個合理的預測呢?
這樣的組合文字歷史的可能出現的方法就是我們常說的馬爾科夫假設,這個假設其實說的就是上邊所對應的問題,這個假設說的其實就是認為接下來要出現的詞是由前邊出現的詞來影響的.如果按照上邊的公式來說,因為前邊是由i-1個詞語,那麼如果我們構造一個模型的話,所有的歷史其實就是前邊的i-1個詞,這樣的話我們構造的模型就成為(n-1)階馬爾科夫模型,或者說n元語法模型(因為我們要預測第n個詞).
這裡要說一下這個n的取值問題,一般情況下我們是不能把這個n取值過大的,要是過大的話,肯定會有很多的等價類,太多的自由引數未必是一件好事(其實把資料劃分成多個等價類有利有弊,一方面如果我們把資料分割成多個類的話其實可以讓我們有更多的辨別性,但是要是使用了太多的等價類,那麼對於每個類別來說,他的訓練資料很小,甚至有些部分沒有訓練資料,這樣的話再去做目標特徵的統計估計這時候就很不準確了,所以這時候如何去權衡,找到一個合適的類別數,是我們的一個探索目標.)那麼這時候我們再去看看n的取值問題,一般情況下大多數常用的n的取值是n=2,3,4的情況,這個時候分別稱為bigram(二元語法),trigram(三元語法),fourgram(四元語法).
現在假設一個說話者的使用詞有20000個,那麼引數的數量如下圖所示:
從這個圖上我們看到,到四元語法模型就已經擁有非常巨大的引數了,所以構造更多的語法模型顯然是不現實的.
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,不足之處請各位多多批評指正,在此謝過!