1. 程式人生 > >【樸素貝葉斯】實戰樸素貝葉斯_文字分類

【樸素貝葉斯】實戰樸素貝葉斯_文字分類

【文字分類】

文字分類是經典的NLP問題,就是把一個文字自動分到若干個類別之一當中。類別可以是政治、經濟、女性、財經等,既可以用字串形式表示,也可以內部用整數形式來表示。對於我的文字過濾問題,則類別只有兩個:不應該過濾 和 應該過濾。接下來是文字表示問題,即用什麼量來代表一個文字,從而可以區別其他文字。通常是用“特徵詞”來表示。特徵詞是一些經過挑選的詞語(特徵選擇問題我們後面再詳細講),這些詞語能最好的表徵一個文字,從而與其他的文字相區別。特徵詞的數量一般很大,通常有幾萬個,共同組成了樸素貝葉斯模型的輸入空間;每一個特徵詞就是空間中的一個維度,有兩個可能取值,分別是1(表示當前樣本包含這個詞)和0(表示當前樣本不包含這個詞)。這樣,我們通過文字表示的設計,將文字分類和樸素貝葉斯模型的相關引數對應起來了,分類任務就轉化成了貝葉斯預測任務。當輸入特徵都被提取出來之後 ,利用貝葉斯公式進行計算就可以了。

不過,事情沒那麼簡單——真那麼簡單也沒有意思了。我們具體看看,貝葉斯模型是怎麼做的。

【樸素貝葉斯——貝努利模型】

貝努利模型?和貝努利分佈有什麼關係?我們先別管這個名字,先看做法吧。

其實貝努利模型就是嚴格按照我們上面的描述過程進行操作的。我們再回顧一下,假設我們已經挑選好了特徵詞,由1w個,如下:

x(0), x(1), x(2)......x(9999)

來了一個新的待分類樣本,進行分詞、停用詞過濾,得到了一個由(部分)特徵片語成的序列,這個序列可以用一個0-1向量來表示,如下:

0, 0, 1, 0, .........

當序列包含某個特徵詞的時候,這一個維度的值為0,否則為0。可以想到,這個向量的絕大部分維度的值都是0,尤其是當這個文字比較短小的時候。那概率怎麼算?尤其是,對於值是0的那些特徵維度,概率怎麼算?貝努利模型的回答是:不管取值是0還是1,都是輸入維度的一個取值,概率該怎麼算還怎麼算,嚴格按照樸素貝葉斯模型走。就是說,這麼算:

p(c(0) | X) = p(c(0)) * p( x(0,0) | c(0) ) * p( x(1,0) | c(0) ) * p( x(2,1) | c(0) ) * ... p( x(9999,0) | c(0) )

注:我隨機將某個維度的值取0或者1,能說明問題就好,類別暫定為c(0),其他類別也是一樣。而前文中,我們也提到過,實際上我們並沒有儲存  p( x(i,0) | c(0) ) 的值,而僅僅儲存  p( x(i,1) | c(0) ) 的,p( x(i,0) | c(0) ) 的值由 1.0 - p( x(i,1) | c(0) ) 計算得到。我就不將這個公式帶入到上面的公式當中了,大家明白意思就好。

以上就是樸素貝葉斯——貝努利模型。用貝努利這個名字,我猜想可能與貝努利分佈有關。貝努利分佈,就是每一次都有兩個可選擇值,yes或者no,以一定的概率出現;這樣組成的序列,就是貝努利序列。而對於上面的分類問題,考慮每一維特徵的時候,也是有兩個選擇:它在輸入樣本里,或者不在,這兩個值至少有一個被考慮進去。而R維的輸入向量,也是一個貝努利序列。

不過對於文字分類,還有一種做法,也是大家用樸素貝葉斯的時候自然而然選擇的一個做法。這種選擇,可能有獨特的考慮,也可能是——對樸素貝葉斯模型的原始模型沒有充分理解。總之,有這樣的做法,效果還不一定比原始的樸素貝葉斯模型差。

【樸素貝葉斯——多項式模型】

這個模型和上面貝努利模型的關鍵區別有兩個:

  1. 貝努利模型是以“文件”為統計單位,即統計某個特徵詞出現在多少個文件當中 (最大似然方法估計條件概率p(x(i)|c)的時候),當某個特徵詞在某一個文件中出現多次的時候,貝努利模型忽略了出現的次數,只算作一次。而多項式模型是以“詞”為統計單位,當某個特徵詞在某個文件中多次出現的時候,與貝努利模型相反,它算作多次——這個更符合做NLP人的想法。
  2. 對特徵向量中0值維度的處理。對於某個新的輸入樣本,當某個維度的取值是0的時候(也就是該特徵詞不出現在輸入樣本中),貝努利模型是要計算 p( x(i,0) | c(0)) 的值。而多項式模型直接忽略這樣的特徵,即只用 p( x(i,1) | c(0) ) 的值來進行計算,從而區分各個類別。

其中2是比較“激進”的,直接把bayes模型的基本計算方式改變了。

為什麼叫多項式模型?我猜想啊,是將某個特徵詞是否出現,當做了多項式某項的係數。當特徵詞不出現的時候,係數為0,則該項的值對整個多項式的值沒有影響——在多項式模型中,某個特徵詞不出現,則他的條件概率的值對樣本對這個類別的條件概率的值也沒有影響。

【QA】

說一下我在學習和實現這個模型的時候曾經疑惑的問題。有的現在看起來蠻幼稚的,學習的時候覺得自己已經掌握了這個模型,不過真的實現的時候,遇到下面的幼稚的問題,還是停下來花了些時間去思考。

問題一:

特徵詞的選擇,或者說特徵向量的確定,是每個類別都有不同的特徵詞集合(不同的特徵向量),還是各個類別都共享一個特徵詞集合?

答:各個類別共享一個。

這個問題可以反過來想,如果每個類別一個特徵詞集合,那麼每個集合中的特徵詞個數是否相同?在計算 p(c(k) | X) 的時候,如果X都不相同,那麼條件概率 p(c(k) | X) 的值在k個類別中如何作比較?這些概率也不滿足歸一化條件啊(原則上是必須要滿足的)。所以,各個類別共享一個特徵詞集合。

上面的思考過程很簡單,在實際中,還會有一個推論。我在做文字過濾的時候,需要過濾色情文字,在特徵選擇之後,發現有些色情詞語,如:”裸照“、”自慰“什麼的都沒有被選作特徵詞,而很多通用詞彙在裡面,我就將這些色情詞手動加入到特徵詞集合當中,而刪除通用詞彙。其實要注意的是,對於正常文字,也有一些區分能力強的詞語,就有可能是那些通用詞彙,也要相應的保留在集合當中,不能只加入色情詞語。形式化地說,色情詞語是 p( x(i,1) | c(色情) ) 高的詞語,固然需要加入,但是相應地也要保留 p( x(i,1) | c(正常) ) 高的詞語在特徵詞集合。

還是用逆向思維來想,如果特徵詞集合當中只有色情詞彙,那麼當一個正常文字來分類的時候,文字不包含任意一個特徵詞,這樣不論對正常類別還是對色情類別,條件概率 p(c(k) | X) 的值無法計算。則該樣本無法被分類。有人說,這個例子太極端了。那麼,一般色情短文字,自身包含的色情詞彙也不是很多,通用中性詞彙佔大多數。很有可能,色情文字中的色情詞彙不在特徵詞集合裡面,通用詞彙就更不在了,那麼這個文字還是沒有辦法被分類。總而言之,特徵詞集合中對於每一類的特徵詞彙,都要包含一些,才能保證分類正常進行——對於c(k)來講,至少對某個k,條件概率 p(c(k) | X)  可以計算。

問題二:

這個問題是針對”多項式模型“那一節的要點”2“的。上文說,多項式模型直接忽略 p( x(i,0) | c(0))  的特徵。我們知道 p( x(i,1) | c(0) )的值都是小於1的,乘的越少,最終獲得的概率越大——這和我們的直覺相悖。我們的直覺是,當某個文字,它包含某個類別的特徵詞越多,他就越有可能是某個類別的文字。但是事實是,當某個文字中,他一個特徵詞都不包含,反而計算出的概率是最大的。怎麼回事?

答:

其實這個問題和”問題一“相關,或者說是解決了問題一,這個問題就解決了。為什麼呢?因為特徵向量對於每個類別都是相同的,那麼某個特定的輸入樣本,它所包含的特徵詞子集,對於每個類別也是相同的,即對每個類別都是”公平的“。賴以分類的,是這些特徵詞在每個類別當中不同的條件概率值,以及每個類別的先驗概率值 (樸素貝葉斯模型的基本引數),而不是這些詞本身,或是他們的個數。換句話說,只要樣本的特徵詞子集不是空集,那麼子集裡面的特徵詞,對於每個類別的條件概率都是不同的,最終樣本對於每個類別的概率值也是不同的,這就足以將這個樣本分類了(分到概率值最大的那個類別當中)。