通俗講:自然語言處理(NLP)入門之N-gram語言模型。(樸素貝葉斯分類器的推導)

N-gram語言模型

N-gram是一種語言模型(Language model,這個後面講),是一種概率模型。這個模型輸入的是一個句子,輸出的是一個概率(看完就懂這個是什麼概率了)。

I love deep learning中如果給出l love ( ) learning.那麼空中填入deep的概率就比填入apple的概率大。假設有這樣一個句子,I love deep learning,用
w1w_1表示I,
w2w_2表示love,
w3w_3表示deep,
w4w_4表示learn
那麼:p(ilovedeeplearning)=p(w1,w2,w3,w4)=p(w1)p(w2w1)p(w3w2,w1)p(w4w3,w2,w1)p(i love deep learning)=p(w_1,w_2,w_3,w_4)=p(w_1)p(w_2|w_1)p(w_3|w_2,w_1)p(w_4|w_3,w_2,w_1)很好理解,就是第一個詞是I的概率,然後乘上已知第一個詞是I第二個詞是love的概率……整個下來就是這個句子的概率。直觀來看,如果這個句子越常見、越自然,那麼這個句子的概率就會更大。
那麼怎麼算這個p(w2w1)p(w_2|w_1)的概率呢?其實就是統計你的文本數據庫中有多少個I love這個組合出現,然後除以I的數量(大概是這樣,但是具體會有不同後面說),總之就是I love出現的次數越多,p(loveI)p(love|I)越大。
但是這個公式是有兩個問題

  1. 參數空間過大。假設這個句子非常的長,那麼第n個詞就要基於前面n-1個詞計算概率,參數是n-1,太多了。
  2. 數據過於稀疏。簡單的說就是並不是所有的詞的組合都會出現,萬一本文數據庫中就剛好有某一個組合沒有出現過,那麼這個組合對應的概率就是0,這個句子的概率因爲有一個因子是0,乘起來還是0就不好了。

爲了解決第一個問題
引入馬爾可夫假設:模型的當前狀態僅僅依賴於前面的幾個狀態。
這個假設簡化了模型,減少的參數,假設僅僅依賴於前面兩個狀態的話,那麼第n個詞就只用基於前面的n-1和n-2個詞,而不是從1到n-1所有的詞,參數降低。
根據這個依賴數量,n-gram可以分爲:

  1. Bi-gram:僅僅依賴前面一個詞,例如:p(i)p(lovei)p(deeplove)p(learningdeep)p(i)p(love|i)p(deep|love)p(learning|deep),bi這個英文前綴,表示兩個,所以,這裏其實就是“I love”、“love deep”、“deep learning”這樣兩單詞的組合的意思;

  2. Tri-gram:tri表示3個的意思,所以就是以來前面兩個詞,變成了p(i)p(lovei)p(deepi,love)p(learningdeep,love)p(i)p(love|i)p(deep|i,love)p(learning|deep,love)

  3. 這裏也可以體會到n-gram中的n是一個什麼含義。當然也可以弄個4-gram但是常用的就是2和3。

    這裏舉個例子

    • i love deep learning
    • deep learning I love
    • I want apple
      這三句話就是我們的全部文本數據庫了,我們想要得到p(lovei)p(love|i)的概率,那麼就是文本中i出現的次數,3次,i love出現了兩次,那麼這個概率就是2/32/3.這裏多了一個sos表示句子的開始start of sentence,eos就是end of sentent句子的結束。所以這裏的i的概率其實不是p(i)p(i),而是p(isos)p(i|sos)
  4. Unigran:這是一個可能聽說過,但是不怎麼用的模型。就是每個單詞單獨考慮,完全不考慮單詞之間的組合的一個模型。每一個單子自身就是獨立的,用上面的例子就是:p(i)p(love)p(deep)(learning)p(i)p(love)p(deep)(learning),這個句子與deep learning love i在Unigram模型下沒有區別。這裏要再提到一個概念**bag of word(BOW)**詞袋模型,這個模型其實就是Unigram一樣,不考慮單詞的順序,只考慮單詞的頻率。舉個例子來理解這個模型:

    • I love deep learning.
    • I love deep learning and machine learning.
      這兩句話就是我們的所有的文本數據庫,專業一點叫做語料庫(corpus),就是我們的文本數據庫。然後從語料庫corpus中,找到所有出現的單詞,然後做出一個詞彙表vocabulary,在這個例子中我們的vocabulary就是:{i:0,love:1,deep:2,learning:3,and:4,machine:5}
      那麼,根據BOW模型,第一個句子用BOW表示就是:[1,1,1,1,0,0],第二個句子就是:[1,1,1,2,1,1]這個就是表示對應單詞出現的頻率,跟單詞在句子中什麼位置出現的沒有關係。(值得注意的是BOW現在已經不怎麼用在NLP中了,而是圖像處理中,但是用的也比較少,以瞭解爲主)

這樣的模型可以做什麼呢?

  1. 詞性標註:
    love可以表示名詞,也可以表示動詞。對數據庫中所有的單詞進行詞性標註,然後判斷I love的love是一個什麼詞性,就用n-gram模型:p(Ilove)=lovelovep(動詞|I的詞性,love)=\frac{前一個詞是代詞,love是動詞的組合的數量}{前面一個詞是代詞,不管love是什麼詞性的組合的數量}
  2. 文本類別判斷之是否是垃圾郵件:
    數據庫中有垃圾郵件和非垃圾郵件,然後根據模型可以知道垃圾郵件中有什麼詞組,比如:大甩賣、暢銷這樣的詞彙。然後在根據這些內容,計算一個文本是否是垃圾郵件的概率。(這裏講的不細緻,知道可以做這個就行了)
  3. 文本主題的分析。這個關鍵在於尋找同義詞,同義詞的英文是(synonyms);
  4. 也可以做情感分析。經常用在電影評論上面,判斷一個評論是正面評論(Positive)還是負面評論(Negtive),還是中立的(neutral)。也可以把文本細分成了六個情感類型:憤怒(Anger),厭惡(Disgust),恐懼(Fear),喜悅(Joy),悲傷(Sadness),驚喜(Surprise)

樸素貝葉斯

目前爲止,讀者應該能理解n-gram模型了,其中有unigram,bi-gram和tri-gram。然後unigram又提到了BOW模型作爲了解。那麼語言模型是什麼東西呢?其實語言模型就是基於**樸素貝葉斯(naïve Bayesian)**的一個概率模型。

先簡單說一下貝葉斯公式吧,這是啥公式:P(BA)=P(AB)P(B)P(A)P(B|A)=\frac{P(A|B)P(B)}{P(A)}
或者可以寫成這個樣子:P(A,B)=P(AB)P(B)=P(BA)P(A)P(A,B)=P(A|B)P(B)=P(B|A)P(A)
然後貝葉斯定理解決的問題就是:已知P(BA)P(B|A)怎麼得到P(AB)P(A|B),這個其實很有用。就用上面的識別垃圾郵件作爲例子,A就是{垃圾郵件,不是垃圾郵件},B就是郵件中的信息,想到根據信息來判斷是否是垃圾郵件的概率這個比較難,所以就變成了:P()=P()P()P()P(是垃圾郵件|信息)=\frac{P(信息|是垃圾郵件)P(是垃圾郵件)}{P(信息)}用一個簡單的例子,假設這個信息是這樣一句話:日賺百萬。我們可以去找垃圾郵件中“日賺百萬”這個句子出現的概率,然後再根據所有語料庫中垃圾郵件的比例,得到這個概率。至於分母的P()P(信息)我們可以省略,爲什麼呢?因爲最後我們要找到的是P()P(是垃圾郵件|信息)P()P(不是垃圾郵件|信息)之間的概率,兩者的分子相同,所以可以省略。好比1和1的概率就是50%和50%,那麼10和10的概率也是50%和50%。

所以根據這個原理,我們把之前選擇概率高的,改成選擇打分高的。什麼意思呢?之前可能是0.3,0.7,選擇0.7這個類別。現在變成3,7,選擇7這個類別。所做的改動就是把分母去掉就行了:Score(BA)=P(AB)P(B)Score(B|A)=P(A|B)P(B)

那麼什麼是naive Beyesian呢?我們已經講完了,樸素貝葉斯是一種分類算法,思想就是求解在某個條件下,各個類別出現的概率,哪一個最大,就選擇哪個類別。在上面的例子中,求解“日賺百萬”這個信息下,郵件是“垃圾郵件”還是”不是垃圾郵件“這兩個類別的概率,然後概率大的哪一個就是這個文本的類別。

所以樸素貝葉斯分類器的公式可以寫成:c=arg maxcP(ca1,a2,...,an)=arg maxcP(a1,a2,...,anc)P(c)c^* = \argmax_{c}{P(c|a_1,a_2,...,a_n)}= \argmax_{c}{P(a_1,a_2,...,a_n|c)P(c)}

  • 其中cc^*就是最終判斷的類別,然後c是所有類別中的一種,在上面的例子中,c就是”是垃圾郵件”或者“不是垃圾郵件”,其中的a就是已知的所有信息。
  • 到這裏,就可以把語言模型和n-gram區分開了,樸素貝葉斯分類器就是語言模型的基礎,想象一個垃圾郵件,應該是有一段話的,不會光有四個字“日賺百萬”。那麼a1a_1就是這段話的第一個句子,然後a2a_2就是第二個句子。這就是一種語言模型。當然,用整個句子的話,可以是可以,但是不好(後面會說爲什麼不好)。假設我們這裏的a1a_1是一個詞,然後a2a_2是另外一個詞,這樣的話,就過渡到了之前講的n-gram模型了。

樸素貝葉斯是基於一個假設的:已知信息a之間相互條件獨立
就是假設下面的公式是成立的:P(a1,a2,...,anc)=P(a1c)P(a2c)P(anc)=i=1nP(aic)P(a_1,a_2,...,a_n|c)=P(a_1|c)P(a_2|c)…P(a_n|c)=\prod_{i=1}^n{P(a_i|c)}
然後把這個假設帶到上面樸素貝葉斯分類器的公式中,就可以得到:c=arg maxcP(c)i=1nP(aic)c^*=\argmax_c{P(c)\prod_{i=1}^n{P(a_i|c)}}這個公式就是提到語言模型一定會看到的公式。現在回到之前的一個問題,爲什麼句子不好。假設a是個句子,那麼P(aic)P(a_i|c)表示什麼含義?表示在你的語料庫中,這個句子出現的此時。一個句子一摸一樣出現的次數能有幾次?同樣的含義可以用不同的句子說出來,所以如果用句子的話,這個P(aic)P(a_i|c)大概率是0。因此,使用詞組,使用n-gram的方法會更加有實際意義。
做一個小結
在NLP中假設提到了語言模型,請想到n-gram模型。然後能夠知道什麼是貝葉斯理論,以及樸素貝葉斯分類器及它的一個已知信息條件獨立的假設。
最後的最後就是,這個語言模型是一個什麼級別的呢?在自然語言處理中,處理一些任務,可以用基於天真貝葉斯的語言模型,當然也可以用機器的方法。不過兩者並不是完全衝突,更多是兩者的結合。
額外的概念

  • term-document matrix:有的讀者可能會看到這個名詞。這個矩陣是這樣的,每一行都是一個語料庫的文本,每一列示一個單詞,用這個例子來解釋:
    • I love deep learning.
    • I love deep learning and machine learning.
      那麼這個矩陣的行表示的是:第一個文本,第二個文本
      列就是:i,love,deep, learning,and,machine
      這個矩陣就是:
      1,1,1,1,0,01,1,1,1,1,11,1,1,1,0,0\\1,1,1,1,1,1
      這個矩陣只是體現是否出現,而不是統計出現的次數。
  • Named Entity Recognition,NER:這個是命名實體識別。這個任務可以用上面講的語言模型實現,但是現在已經不用這麼古老的方法了。這個任務的目的就是識別語料中的人名、地名、組織機構等命名實體,比方說知道李雷是一個名字,知道谷歌是一家公司,知道人民大道是一條馬路的名字等等。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章