【自然語言處理基礎技能(NLP)】樸素貝葉斯

樸素貝葉斯

 

目錄:

1. 引言

2. 貝葉斯公式

3. 用機器學習的視角理解貝葉斯公式

4. 垃圾郵件識別

5. 分詞

6. 條件獨立假設

7. 樸素貝葉斯(Naive Bayes),“Naive”在何處?

8. 簡單高效,吊絲逆襲

9.處理重複詞語的三種方式

   9.1多項式模型

   9.2伯努利模型

   9.3.混合模型

10.去除停用詞與選擇關鍵詞

11.淺談平滑技術

12.內容小結

13.爲什麼不直接匹配關鍵詞識別垃圾郵件

14.實際工程的tricks

    14.1 trick1:取對數

    14.2 trick2:轉換爲權重

    14.3 trick3:選取topk的關鍵詞

    14.4 trick4:分割樣本

    14.5 trick5:位置權重

    14.6 trick6:蜜罐

15.貝葉斯方法的思維方式

    15.1逆概率問題

    15.2處理多分類問題

    15.3先驗概率的問題

 16.(樸素)貝葉斯方法的常見應有

     16.1褒貶分析

     16.2拼寫糾錯

17.內容小結

    

 

1. 引言

貝葉斯方法是一個歷史悠久,有着堅實的理論基礎的方法,同時處理很多問題時直接而又高效,很多高級自然語言處理模型也可以從它演化而來。因此,學習貝葉斯方法,是研究自然語言處理問題的一個非常好的切入口。

2. 貝葉斯公式

貝葉斯公式就一行:

而它其實是由以下的聯合概率公式推導出來:

其中P(Y)叫做先驗概率,P(Y|X)叫做後驗概率,P(Y,X)叫做聯合概率。

貝葉斯最核心的公式就這麼些。

3. 用機器學習的視角理解貝葉斯公式

在機器學習的視角下,我們把XX理解成“具有某特徵”,把Y理解成“類別標籤”(一般機器學習爲題中都是X=>特徵Y=>結果對吧)。在最簡單的二分類問題(判定)下,我們將Y理解成“屬於某類”的標籤。於是貝葉斯公式就變形成了下面的樣子:

我們簡化解釋一下上述公式:

而我們二分類問題的最終目的就是要判斷P(“屬於某類”|“具有某特徵”)P(“屬於某類”|“具有某特徵”)是否大於1/2就夠了。貝葉斯方法把計算“具有某特徵的條件下屬於某類”的概率轉換成需要計算“屬於某類的條件下具有某特徵”的概率,而後者獲取方法就簡單多了,我們只需要找到一些包含已知特徵標籤的樣本,即可進行訓練。而樣本的類別標籤都是明確的,所以貝葉斯方法在機器學習裏屬於有監督學習方法。

這裏再補充一下,一般『先驗概率』、『後驗概率』是相對出現的,比如P(Y)與P(Y|X)是關於Y的先驗概率與後驗概率,P(X)與P(X|Y)是關於XX的先驗概率與後驗概率。

4. 垃圾郵件識別

舉個例子好啦,我們現在要對郵件進行分類,識別垃圾郵件和普通郵件,如果我們選擇使用樸素貝葉斯分類器,那目標就是判斷P(“垃圾郵件”|“具有某特徵”)P(“垃圾郵件”|“具有某特徵”)是否大於1/2。現在假設我們有垃圾郵件和正常郵件各1萬封作爲訓練集。需要判斷以下這個郵件是否屬於垃圾郵件:

“我司可辦理正規發票(保真)17%增值稅發票點數優惠!”

也就是判斷概率P(“垃圾郵件”|“我司可辦理正規發票(保真)17%增值稅發票點數優惠!”)P(“垃圾郵件”|“我司可辦理正規發票(保真)17%增值稅發票點數優惠!”)是否大於1/2

咳咳,有木有發現,轉換成的這個概率,計算的方法:就是寫個計數器,然後+1 +1 +1統計出所有垃圾郵件和正常郵件中出現這句話的次數啊!!!好,具體點說:

5. 分詞

一個很悲哀但是很現實的結論: 訓練集是有限的,而句子的可能性則是無限的。所以覆蓋所有句子可能性的訓練集是不存在的。

所以解決方法是? 句子的可能性無限,但是詞語就那麼些!!漢語常用字2500個,常用詞語也就56000個(你終於明白小學語文老師的用心良苦了)。按人們的經驗理解,兩句話意思相近並不強求非得每個字、詞語都一樣。比如“我司可辦理正規發票,17%增值稅發票點數優惠!”,這句話就比之前那句話少了“(保真)”這個詞,但是意思基本一樣。如果把這些情況也考慮進來,那樣本數量就會增加,這就方便我們計算了。

於是,我們可以不拿句子作爲特徵,而是拿句子裏面的詞語(組合)作爲特徵去考慮。比如“正規發票”可以作爲一個單獨的詞語,“增值稅”也可以作爲一個單獨的詞語等等。

句子“我司可辦理正規發票,17%增值稅發票點數優惠!”就可以變成(“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”))

於是你接觸到了中文NLP中,最最最重要的技術之一:分詞!!!也就是把一整句話拆分成更細粒度的詞語來進行表示。另外,分詞之後去除標點符號、數字甚至無關成分(停用詞)是特徵預處理中的一項技術

中文分詞是一個專門的技術領域(我不會告訴你某搜索引擎廠碼磚工有專門做分詞的!!!),上過之前課程的同學都知道python有一個非常方便的分詞工具jieba,假定我們已經完成分詞工作:

我們觀察(“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”),這可以理解成一個向量:向量的每一維度都表示着該特徵詞在文本中的特定位置存在。這種將特徵拆分成更小的單元,依據這些更靈活、更細粒度的特徵進行判斷的思維方式,在自然語言處理與機器學習中都是非常常見又有效的。

因此貝葉斯公式就變成了:

6. 條件獨立假設

下面我們馬上會看到一個非常簡單粗暴的假設。

概率P((“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”)|"垃圾郵件")P((“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”)|"垃圾郵件")依舊不夠好求,我們引進一個很樸素的近似。爲了讓公式顯得更加緊湊,我們令字母S表示“垃圾郵件”,令字母H表示“正常郵件”。近似公式如下:

這就是傳說中的條件獨立假設。基於“正常郵件”的條件獨立假設的式子與上式類似,此處省去。接着,將條件獨立假設代入上面兩個相反事件的貝葉斯公式。

於是我們就只需要比較以下兩個式子的大小:

厲(wo)害(cao)!醬紫處理後式子中的每一項都特別好求!只需要分別統計各類郵件中該關鍵詞出現的概率就可以了!!!比如:

統計次數非常方便,而且樣本數量足夠大,算出來的概率比較接近真實。於是垃圾郵件識別的問題就可解了。

7. 樸素貝葉斯(Naive Bayes),“Naive”在何處?

加上條件獨立假設的貝葉斯方法就是樸素貝葉斯方法(Naive Bayes)。 Naive的發音是“乃一污”,意思是“樸素的”、“幼稚的”、“蠢蠢的”。咳咳,也就是說,大神們取名說該方法是一種比較萌蠢的方法,爲啥?

將句子(“我”,“司”,“可”,“辦理”,“正規發票”) 中的 (“我”,“司”)與(“正規發票”)調換一下順序,就變成了一個新的句子(“正規發票”,“可”,“辦理”, “我”, “司”)。新句子與舊句子的意思完全不同。但由於乘法交換律,樸素貝葉斯方法中算出來二者的條件概率完全一樣!計算過程如下:

也就是說,在樸素貝葉斯眼裏,“我司可辦理正規發票”與“正規發票可辦理我司”完全相同。樸素貝葉斯失去了詞語之間的順序信息。這就相當於把所有的詞彙扔進到一個袋子裏隨便攪和,貝葉斯都認爲它們一樣。因此這種情況也稱作詞袋子模型(bag of words)。詞袋子模型與人們的日常經驗完全不同。比如,在條件獨立假設的情況下,“武松打死了老虎”與“老虎打死了武松”被它認作一個意思了。恩,樸素貝葉斯就是這麼單純和直接,對比於其他分類器,好像是顯得有那麼點萌蠢。

8. 簡單高效,吊絲逆襲

雖然說樸素貝葉斯方法萌蠢萌蠢的,但實踐證明在垃圾郵件識別的應用還令人詫異地好。Paul Graham先生自己簡單做了一個樸素貝葉斯分類器,“1000封垃圾郵件能夠被過濾掉995封,並且沒有一個誤判”。(Paul Graham《黑客與畫家》)

那個...效果爲啥好呢?

“有人對此提出了一個理論解釋,並且建立了什麼時候樸素貝葉斯的效果能夠等價於非樸素貝葉斯的充要條件,這個解釋的核心就是:有些獨立假設在各個分類之間的分佈都是均勻的所以對於似然的相對大小不產生影響;即便不是如此,也有很大的可能性各個獨立假設所產生的消極影響或積極影響互相抵消,最終導致結果受到的影響不大。具體的數學公式請參考這篇 paper。”(劉未鵬《:平凡而又神奇的貝葉斯方法》)

恩,這個分類器中最簡單直接看似萌蠢的小盆友『樸素貝葉斯』,實際上卻是簡單、實用、且強大的。

9. 處理重複詞語的三種方式

我們之前的垃圾郵件向量(“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”),其中每個詞都不重複。而這在現實中其實很少見。因爲如果文本長度增加,或者分詞方法改變,必然會有許多詞重複出現,因此需要對這種情況進行進一步探討。比如以下這段郵件:

“代開發票。增值稅發票,正規發票。” 分詞後爲向量: (“代開”,“發票”,“增值稅”,“發票”,“正規”,“發票”)

其中“發票”重複了三次。

9.1 多項式模型:

如果我們考慮重複詞語的情況,也就是說,重複的詞語我們視爲其出現多次,直接按條件獨立假設的方式推導,則有

在統計計算P(“發票”|S)時,每個被統計的垃圾郵件樣本中重複的詞語也統計多次。

你看這個多次出現的結果,出現在概率的指數/次方上,因此這樣的模型叫作多項式模型

9.2 伯努利模型

另一種更加簡化的方法是將重複的詞語都視爲其只出現1次

統計計算P(“詞語”|S)P(“詞語”|S)時也是如此。

這樣的模型叫作伯努利模型(又稱爲二項獨立模型)。這種方式更加簡化與方便。當然它丟失了詞頻的信息,因此效果可能會差一些。

9.3 混合模型

第三種方式是在計算句子概率時,不考慮重複詞語出現的次數,但是在統計計算詞語的概率P(“詞語”|S)時,卻考慮重複詞語的出現次數,這樣的模型可以叫作混合模型

我們通過下圖展示三種模型的關係。

 

具體實踐中採用那種模型,關鍵看具體的業務場景,一個簡單經驗是,對於垃圾郵件識別,混合模型更好些

10. 去除停用詞與選擇關鍵詞

我們繼續觀察(“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”) 這句話。其實,像“我”、“可”之類詞其實非常中性,無論其是否出現在垃圾郵件中都無法幫助判斷的有用信息。所以可以直接不考慮這些典型的詞。這些無助於我們分類的詞語叫作“停用詞”(Stop Words)。這樣可以減少我們訓練模型、判斷分類的時間。 於是之前的句子就變成了(“司”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”) 。

我們進一步分析。以人類的經驗,其實“正規發票”、“發票”這類的詞如果出現的話,郵件作爲垃圾郵件的概率非常大,可以作爲我們區分垃圾郵件的“關鍵詞”。而像“司”、“辦理”、“優惠”這類的詞則有點雞肋,可能有助於分類,但又不那麼強烈。如果想省事做個簡單的分類器的話,則可以直接採用“關鍵詞”進行統計與判斷,剩下的詞就可以先不管了。於是之前的垃圾郵件句子就變成了(“正規發票”,“發票”) 。這樣就更加減少了我們訓練模型、判斷分類的時間,速度非常快。

“停用詞”和“關鍵詞”一般都可以提前靠人工經驗指定。不同的“停用詞”和“關鍵詞”訓練出來的分類器的效果也會有些差異。

11. 淺談平滑技術

我們來說個問題(中文NLP裏問題超級多,哭瞎T_T),比如在計算以下獨立條件假設的概率:

我們掃描一下訓練集,發現“正規發票”這個詞從出現過!!!*,於是P(“正規發票”|S)=0P(“正規發票”|S)=0...問題嚴重了,整個概率都變成0了!!!樸素貝葉斯方法面對一堆0,很悽慘地失效了...更殘酷的是這種情況其實很常見,因爲哪怕訓練集再大,也可能有覆蓋不到的詞語。本質上還是樣本數量太少,不滿足大數定律,計算出來的概率失真**。爲了解決這樣的問題,一種分析思路就是直接不考慮這樣的詞語,但這種方法就相當於默認給P(“正規發票”|S)賦值爲1。其實效果不太好,大量的統計信息給浪費掉了。我們進一步分析,既然可以默認賦值爲1,爲什麼不能默認賦值爲一個很小的數?這就是平滑技術的基本思路,依舊保持着一貫的作風,樸實/土但是直接而有效

對於伯努利模型,P(“正規發票”|S)的一種平滑算法是:

對於多項式模型,P(“正規發票”| S)的一種平滑算法是:

說起來,平滑技術的種類其實非常多,有興趣的話回頭我們專門拉個專題講講好了。這裏只提一點,就是所有的平滑技術都是給未出現在訓練集中的詞語一個估計的概率,而相應地調低其他已經出現的詞語的概率

平滑技術是因爲數據集太小而產生的現實需求。如果數據集足夠大,平滑技術對結果的影響將會變小。

12. 內容小結

我們找了個最簡單常見的例子:垃圾郵件識別,說明了一下樸素貝葉斯進行文本分類的思路過程。基本思路是先區分好訓練集與測試集,對文本集合進行分詞、去除標點符號等特徵預處理的操作,然後使用條件獨立假設,將原概率轉換成詞概率乘積,再進行後續的處理。

貝葉斯公式 + 條件獨立假設 = 樸素貝葉斯方法

基於對重複詞語在訓練階段與判斷(測試)階段的三種不同處理方式,我們相應的有伯努利模型、多項式模型和混合模型。在訓練階段,如果樣本集合太小導致某些詞語並未出現,我們可以採用平滑技術對其概率給一個估計值。而且並不是所有的詞語都需要統計,我們可以按相應的“停用詞”和“關鍵詞”對模型進行進一步簡化,提高訓練和判斷速度。

13. 爲什麼不直接匹配關鍵詞來識別垃圾郵件?

有同學可能會問:“何必費這麼大勁算那麼多詞的概率?直接看郵件中有沒有‘代開發票’、‘轉售發票’之類的關鍵詞不就得了?如果關鍵詞比較多就認爲是垃圾郵件唄。”

其實關鍵詞匹配的方法如果有效的話真不必用樸素貝葉斯。畢竟這種方法簡單嘛,就是一個字符串匹配。從歷史來看,之前沒有貝葉斯方法的時候主要也是用關鍵詞匹配。但是這種方法準確率太低。我們在工作項目中也嘗試過用關鍵詞匹配的方法去進行文本分類,發現大量誤報。感覺就像扔到垃圾箱的郵件99%都是正常的!這樣的效果不忍直視。而加一個樸素貝葉斯方法就可能把誤報率拉低近一個數量級,體驗好得不要不要的。

另一個原因是詞語會隨着時間不斷變化。發垃圾郵件的人也不傻,當他們發現自己的郵件被大量屏蔽之後,也會考慮採用新的方式,如變換文字、詞語、句式、顏色等方式來繞過反垃圾郵件系統。比如對於垃圾郵件“我司可辦理正規發票,17%增值稅發票點數優惠”,他們採用火星文:“涐司岢辦理㊣規髮票,17%增値稅髮票嚸數優蕙”,那麼字符串匹配的方法又要重新找出這些火星文,一個一個找出關鍵詞,重新寫一些匹配規則。更可怕的是,這些規則可能相互之間的耦合關係異常複雜,要把它們梳理清楚又是大一個數量級的工作量。等這些規則失效了又要手動更新新的規則……無窮無盡貓鼠遊戲最終會把貓給累死

而樸素貝葉斯方法卻顯示出無比的優勢。因爲它是基於統計方法的,只要訓練樣本中有更新的垃圾郵件的新詞語,哪怕它們是火星文,都能自動地把哪些更敏感的詞語(如“髮”、“㊣”等)給凸顯出來,並根據統計意義上的敏感性給他們分配適當的權重 ,這樣就不需要什麼人工了,非常省事。你只需要時不時地拿一些最新的樣本扔到訓練集中,重新訓練一次即可

小補充一下,對於火星文、同音字等替代語言,一般的分詞技術可能會分得不準,最終可能只把一個一個字給分出來,成爲“分字”。效果可能不會太好。也可以用過n-gram之類的語言模型,拿到最常見短語。當然,對於英文等天生自帶空格來間隔單詞的語言,分詞則不是什麼問題,使用樸素貝葉斯方法將會更加順暢。

14.實際工程的tricks

應用樸素貝葉斯方法的過程中,一些tricks能顯著幫助工程解決問題。我們畢竟經驗有限,無法將它們全都羅列出來,只能就所知的一點點經驗與大家分享,歡迎批評指正。

14.1 trick1:取對數

我們提到用來識別垃圾郵件的方法是比較以下兩個概率的大小(字母S表示“垃圾郵件”,字母H表示“正常郵件”):

但這裏進行了很多乘法運算,計算的時間開銷比較大。尤其是對於篇幅比較長的郵件,幾萬個數相乘起來還是非常花時間的。如果能把這些乘法變成加法則方便得多。剛好數學中的對數函數log就可以實現這樣的功能。兩邊同時取對數(本文統一取底數爲2),則上面的公式變爲:

有同學可能要叫了:“做對數運算豈不會也很花時間?”的確如此,但是可以在訓練階段直接計算 logP ,然後把他們存在一張大的hash表裏。在判斷的時候直接提取hash表中已經計算好的對數概率,然後相加即可。這樣使得判斷所需要的計算時間被轉移到了訓練階段,實時運行的時候速度就比之前快得多,這可不止幾個數量級的提升。

14.2 trick2:轉換爲權重

 

14.3 trick3:選取topk的關鍵詞

 

14.4 trick4:分割樣本

選取topk個詞語的方法對於篇幅變動不大的郵件樣本比較有效。但是對篇幅過大或者過小的郵件則會有判斷誤差。

比如這個垃圾郵件的例子:(“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”)。分詞出了10個詞語,其中有“正規發票”、“發票”2個關鍵詞。關鍵詞的密度還是蠻大的,應該算是敏感郵件。但因爲採用最高15個詞語的權重求和,並且相應的閾值是基於15個詞的情況有效,可能算出來的結果還小於之前的閾值,這就造成漏判了。

類似的,如果一封稅務主題的郵件有1000個詞語,其中只有“正規發票”、“發票”、“避稅方法”3個權重比較大的詞語,它們只是在正文表述中順帶提到的內容。關鍵詞的密度被較長的篇幅稀釋了,應該算是正常郵件。但是卻被閾值判斷成敏感郵件,造成誤判了。

這兩種情況都說明topk關鍵詞的方法需要考慮篇幅的影響。這裏有許多種處理方式,它們的基本思想都是選取詞語的個數及對應的閾值要與篇幅的大小成正比,本文只介紹其中一種方方法:

 

14.5 trick5:位置權重

到目前爲止,我們對詞語權重求和的過程都沒有考慮郵件篇章結構的因素。比如“正規發票”如果出現在標題中應該比它出現在正文中對判斷整個郵件的影響更大;而出現在段首句中又比其出現在段落正文中對判斷整個郵件的影響更大。所以可以根據詞語出現的位置,對其權重再乘以一個放大係數,以擴大其對整封郵件的影響,提高識別準確度

 

14.6 trick6:蜜罐

我們通過辛辛苦苦的統計與計算,好不容易得到了不同詞語的權重。然而這並不是一勞永逸的。我們我們之前交代過,詞語及其權重會隨着時間不斷變化,需要時不時地用最新的樣本來訓練以更新詞語及其權重

而蒐集最新垃圾郵件有一個技巧,就是隨便註冊一些郵箱,然後將它們公佈在各大論壇上。接下來就坐等一個月,到時候收到的郵件就絕大部分都是垃圾郵件了(好奸詐)。再找一些正常的郵件,基本就能夠訓練了。這些用於自動蒐集垃圾郵件的郵箱叫做“蜜罐”。“蜜罐”是網絡安全領域常用的手段,因其原理類似誘捕昆蟲的裝有蜜的罐子而得名。比如殺毒軟件公司會利用蜜罐來監視或獲得計算機網絡中的病毒樣本、攻擊行爲等。

15. 貝葉斯方法的思維方式

講了這麼多tricks,但這些手段都是建立在貝葉斯方法基礎之上的。因此有必要探討一下貝葉斯方法的思維方式,以便更好地應用這種方法解決實際問題。

15.1 逆概問題

 

15.2 處理多分類問題

前面我們一直在探討二分類(判斷題)問題,現在可以引申到多分類(單選題)問題了。

還是用郵件分類的例子,這是現在不只要判斷垃圾郵件,還要將正常郵件細分爲私人郵件、工作郵件。現在有這3類郵件各1萬封作爲樣本。需要訓練出一個貝葉斯分類器。這裏依次用Y1,Y2,Y3Y1,Y2,Y3表示這三類郵件,用XX表示被判斷的郵件。套用貝葉斯公式有:

通過比較3個概率值的大小即可得到XX所屬的分類。發現三個式子的分母P(X)一樣,比較大小時可以忽略不計,於是就可以用下面這一個式子表達上面3式:

15.3 先驗概率的問題

16. (樸素)貝葉斯方法的常見應用

說了這麼多理論的問題,咱們就可以探討一下(樸素)貝葉斯方法在自然語言處理中的一些常見應用了。以下只是從原理上進行探討,對於具體的技術細節顧及不多。

16.1 褒貶分析

一個比較常見的應用場景是情感褒貶分析。比如你要統計微博上人們對一個新上映電影的褒貶程度評價:好片還是爛片。但是一條一條地看微博是根本看不過來,只能用自動化的方法。我們可以有一個很粗略的思路:

  • 首先是用爬蟲將微博上提到這個電影名字的微博全都抓取下來,比如有10萬條。

  • 然後用訓練好的樸素貝葉斯分類器分別判斷這些微博對電影是好評還是差評。

  • 最後統計出這些好評的影評佔所有樣本中的比例,就能形成微博網友對這個電影綜合評價的大致估計。

接下來的核心問題就是訓練出一個靠譜的分類器。首先需要有打好標籤的文本。這個好找,豆瓣影評上就有大量網友對之前電影的評價,並且對電影進行1星到5星的評價。我們可以認爲3星以上的評論都是好評,3星以下的評論都是差評。這樣就分別得到了好評差評兩類的語料樣本。剩下就可以用樸素貝葉斯方法進行訓練了。基本思路如下:

  • 訓練與測試樣本:豆瓣影評的網友評論,用爬蟲抓取下100萬條。

  • 標籤:3星以上的是好評,3星以下的是差評。

  • 特徵:豆瓣評論分詞後的詞語。一個簡單的方法是隻選擇其中的形容詞,網上有大量的情緒詞庫可以爲我們所用。

  • 然後再用常規的樸素貝葉斯方法進行訓練。

但是由於自然語言的特點,在提取特徵的過程當中,有一些tricks需要注意:

  • 對否定句進行特別的處理。比如這句話“我不是很喜歡部電影,因爲它讓我開心不起來。”其中兩個形容詞“喜歡”、“開心”都是褒義詞,但是因爲句子的否定句,所以整體是貶義的。有一種比較簡單粗暴的處理方式,就是“對否定詞(“不”、“非”、“沒”等)與句尾標點之間的所有形容詞都採用其否定形式” 。則這句話中提取出來的形容詞就應該是“不喜歡”和“不開心”。

  • 一般說來,最相關的情感詞在一些文本片段中僅僅出現一次,詞頻模型起得作用有限,甚至是負作用,則使用伯努利模型代替多項式模型。這種情況在微博這樣的小篇幅文本中似乎不太明顯,但是在博客、空間、論壇之類允許長篇幅文本出現的平臺中需要注意。

  • 其實,副詞對情感的評價有一定影響。“不很喜歡”與“很不喜歡”的程度就有很大差異。但如果是樸素貝葉斯方法的話比較難處理這樣的情況。我們可以考慮用語言模型或者加入詞性標註的信息進行綜合判斷。這些內容我們將在之後的文章進行探討。

當然經過以上的處理,情感分析還是會有一部分誤判。這裏涉及到許多問題,都是情感分析的難點:

  • 情緒表達的含蓄微妙:“導演你出來,我保證不打死你。”你讓機器怎麼判斷是褒還是貶?

  • 轉折性表達:“我非常喜歡這些大牌演員,非常崇拜這個導演,非常讚賞這個劇本,非常欣賞他們的預告片,我甚至爲了這部影片整整期待了一年,最後進了電影院發現這是個噩夢。” 五個褒義的形容詞、副詞對一個不那麼貶義的詞。機器自然判斷成褒義,但這句話是妥妥的貶義。

16.2 拼寫糾錯

拼寫糾錯本質上也是一個分類問題。但按照錯誤類型不同,又分爲兩種情況:

  • 非詞錯誤(Non-word Errors):指那些拼寫錯誤後的詞本身就不合法,如將“wifi”寫成“wify”;

  • 真詞錯誤(Real-word Errors):指那些拼寫錯誤後的詞仍然是合法的情況,如將“wifi”寫成“wife”。

真詞錯誤複雜一些,我們將在接下來的文章中進行探討。而對於非詞錯誤,就可以直接採用貝葉斯方法,其基本思路如下:

  • 標籤:通過計算錯誤詞語的最小編輯距離(之前咱們提到過的),獲取最相似的候選詞,每個候選詞作爲一個分類。

  • 特徵:拼寫錯誤的詞本身。因爲它就一個特徵,所以沒有什麼條件獨立性假設、樸素貝葉斯啥的。它就是純而又純的貝葉斯方法。

由於自然語言的特點,有一些tricks需要注意:

  • 據統計,80%的拼寫錯誤編輯距離爲1,幾乎所有的拼寫錯誤編輯距離小於等於2。我們只選擇編輯距離爲1或2的詞作爲候選詞, 這樣就可以減少大量不必要的計算

  • 由於我們只選擇編輯距離爲1或2的詞,其差別只是一兩個字母級別差別。因此計算似然函數的時候,可以只統計字母層面的編輯錯誤,這樣蒐集的樣本更多,更滿足大數定律,也更簡單。對於編輯距離爲1的似然函數計算公式可以進化爲:

 

17. 內容小結

從前面大家基本可以看出,工程應用不同於學術理論,有許多tricks需要考慮,而理論本質就是翻來倒去折騰貝葉斯公式,都快玩出花來了。

 


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章