<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                作者:[寒小陽](http://blog.csdn.net/han_xiaoyang?viewmode=contents)?&&?[龍心塵](http://blog.csdn.net/longxinchen_ml?viewmode=contents)? 時間:2016年1月。? 出處:[http://blog.csdn.net/longxinchen_ml/article/details/50597149](http://blog.csdn.net/longxinchen_ml/article/details/50597149)? [http://blog.csdn.net/han_xiaoyang/article/details/50616559](http://blog.csdn.net/han_xiaoyang/article/details/50616559)? 聲明:版權所有,轉載請聯系作者并注明出處 ### 1\. 引言 貝葉斯方法是一個歷史悠久,有著堅實的理論基礎的方法,同時處理很多問題時直接而又高效,很多高級自然語言處理模型也可以從它演化而來。因此,學習貝葉斯方法,是研究自然語言處理問題的一個非常好的切入口。 ### 2\. 貝葉斯公式 貝葉斯公式就一行: > P(Y|X)=P(X|Y)P(Y)P(X) 而它其實是由以下的聯合概率公式推導出來: > P(Y,X)=P(Y|X)P(X)=P(X|Y)P(Y) 其中P(Y)叫做先驗概率,P(Y|X)叫做后驗概率,P(Y,X)叫做聯合概率。 額,恩,沒了,貝葉斯最核心的公式就這么些。 ### 3\. 用機器學習的視角理解貝葉斯公式 在機器學習的視角下,我們把X理解成“具有某特征”,把Y理解成“類別標簽”(一般機器學習問題中都是`X=>特征`,?`Y=>結果`對吧)。在最簡單的二分類問題(`是`與`否`判定)下,我們將Y理解成“屬于某類”的標簽。于是貝葉斯公式就變形成了下面的樣子: P(“屬于某類”|“具有某特征”)=P(“具有某特征”|“屬于某類”)P(“屬于某類”)P(“具有某特征”) 我們嘗試更口(shuo)語(ren)化(hua)的方式解釋一下上述公式: P(“屬于某類”|“具有某特征”)=在已知某樣本“具有某特征”的條件下,該樣本“屬于某類”的概率。所以叫做『后驗概率』。? P(“具有某特征”|“屬于某類”)=在已知某樣本“屬于某類”的條件下,該樣本“具有某特征”的概率。? P(“屬于某類”)=(在未知某樣本具有該“具有某特征”的條件下,)該樣本“屬于某類”的概率。所以叫做『先驗概率』。? P(“具有某特征”)=(在未知某樣本“屬于某類”的條件下,)該樣本“具有某特征”的概率。 而我們二分類問題的最終目的就是要判斷P(“屬于某類”|“具有某特征”)是否大于1/2就夠了。貝葉斯方法把計算“具有某特征的條件下屬于某類”的概率轉換成需要計算“屬于某類的條件下具有某特征”的概率,而后者獲取方法就簡單多了,我們只需要找到一些包含已知特征標簽的樣本,即可進行訓練。而樣本的類別標簽都是明確的,所以貝葉斯方法在機器學習里屬于有監督學習方法。 這里再補充一下,一般『先驗概率』、『后驗概率』是相對出現的,比如P(Y)與P(Y|X)是關于Y的先驗概率與后驗概率,P(X)與P(X|Y)是關于X的先驗概率與后驗概率。 ### 4\. 垃圾郵件識別 舉個例子好啦,我們現在要對郵件進行分類,識別垃圾郵件和普通郵件,如果我們選擇使用樸素貝葉斯分類器,那目標就是判斷P(“垃圾郵件”|“具有某特征”)是否大于1/2。現在假設我們有垃圾郵件和正常郵件各1萬封作為訓練集。需要判斷以下這個郵件是否屬于垃圾郵件: > “我司可辦理正規發票(保真)17%增值稅發票點數優惠!” 也就是判斷概率P(“垃圾郵件”|“我司可辦理正規發票(保真)17%增值稅發票點數優惠!”)是否大于1/2。 咳咳,有木有發現,轉換成的這個概率,計算的方法:就是寫個計數器,然后+1 +1 +1統計出所有垃圾郵件和正常郵件中出現這句話的次數啊!!!好,具體點說: P(“垃圾郵件”|“我司可辦理正規發票(保真)17%增值稅發票點數優惠!”)? =垃圾郵件中出現這句話的次數垃圾郵件中出現這句話的次數+正常郵件中出現這句話的次數 ### 5\. 分詞 然后同學們開始朝我扔爛白菜和臭雞蛋,“騙紙!!誤人子弟!!你以為發垃圾郵件的人智商都停留在20世紀嗎!!你以為它們發郵件像抄作業一樣不改內容嗎!!哪來那么多相同的句子!!”。 咳咳,表鬧,確實,在我們這樣的樣本容量下,『完全擊中』的句子很少甚至沒有(無法滿足大數定律,),算出來的概率會很失真。一方面找到龐大的訓練集是一件非常困難的事情,另一方面其實對于任何的訓練集,我們都可以構造出一個從未在訓練集中出現的句子作為垃圾郵件(真心的,之前看過樸素貝葉斯分類分錯的郵件,我覺得大中華同胞創(zao)新(jia)的能力簡直令人驚(fa)呀(zhi))。 一個很悲哀但是很現實的結論:? 訓練集是有限的,而句子的可能性則是無限的。所以覆蓋所有句子可能性的訓練集是不存在的。 所以解決方法是?? 對啦!句子的可能性無限,但是詞語就那么些!!漢語常用字2500個,常用詞語也就56000個(你終于明白小學語文老師的用心良苦了)。按人們的經驗理解,兩句話意思相近并不強求非得每個字、詞語都一樣。比如“我司可辦理正規發票,17%增值稅發票點數優惠!”,這句話就比之前那句話少了“(保真)”這個詞,但是意思基本一樣。如果把這些情況也考慮進來,那樣本數量就會增加,這就方便我們計算了。 于是,我們可以不拿句子作為特征,而是拿句子里面的詞語(組合)作為特征去考慮。比如“正規發票”可以作為一個單獨的詞語,“增值稅”也可以作為一個單獨的詞語等等。 句子“我司可辦理正規發票,17%增值稅發票點數優惠!”就可以變成(“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”))。 于是你接觸到了中文NLP中,最最最重要的技術之一:分詞!!!也就是把一整句話拆分成更細粒度的詞語來進行表示。咳咳,另外,分詞之后去除標點符號、數字甚至無關成分(停用詞)是特征預處理中的一項技術。 中文分詞是一個專門的技術領域(我不會告訴你某搜索引擎廠碼磚工有專門做分詞的!!!),我們將在下一篇文章探討,這里先將其作為一個已知情況進行處理。具體細節請見下回分曉 我們觀察(“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”),這可以理解成一個向量:向量的每一維度都表示著該特征詞在文本中的特定位置存在。這種將特征拆分成更小的單元,依據這些更靈活、更細粒度的特征進行判斷的思維方式,在自然語言處理與機器學習中都是非常常見又有效的。 因此貝葉斯公式就變成了: P(“垃圾郵件”|(“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”))? =P((“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”)|"垃圾郵件")P(“垃圾郵件”)P((“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”)) P(“正常郵件”|(“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”))? =P((“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”)|"正常郵件")P(“正常郵件”)P((“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”)) ### 6\. 條件獨立假設 有些同學說…好像…似乎…經過上面折騰,概率看起來更復雜了-_-||? 那…那我們簡化一下… 概率P((“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”)|"垃圾郵件")依舊不夠好求,我們引進一個很樸素的近似。為了讓公式顯得更加緊湊,我們令字母S表示“垃圾郵件”,令字母H表示“正常郵件”。近似公式如下: P((“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”)|S)? =P(“我”|S)×P(“司”|S)×P(“可”|S)×P(“辦理”|S)×P(“正規發票”|S)? ×P(“保真”|S)×P(“增值稅”|S)×P(“發票”|S)×P(“點數”|S)×P(“優惠”|S) 這就是傳說中的條件獨立假設。基于“正常郵件”的條件獨立假設的式子與上式類似,此處省去。接著,將條件獨立假設代入上面兩個相反事件的貝葉斯公式。 于是我們就只需要比較以下兩個式子的大小: C=P(“我”|S)P(“司”|S)P(“可”|S)P(“辦理”|S)P(“正規發票”|S)? ×P(“保真”|S)P(“增值稅”|S)P(“發票”|S)P(“點數”|S)P(“優惠”|S)P(“垃圾郵件”)? Cˉˉˉ=P(“我”|H)P(“司”|H)P(“可”|H)P(“辦理”|H)P(“正規發票”|H)? ×P(“保真”|H)P(“增值稅”|H)P(“發票”|H)P(“點數”|H)P(“優惠”|H)P(“正常郵件”) 厲(wo)害(cao)!醬紫處理后**式子中的每一項都特別好求**!只需要**分別統計各類郵件中該關鍵詞出現的概率**就可以了!!!比如: P(“發票”|S)=垃圾郵件中所有“發票”的次數垃圾郵件中所有詞語的次數 統計次數非常方便,而且樣本數量足夠大,算出來的概率比較接近真實。于是垃圾郵件識別的問題就可解了。 ### 7\. 樸素貝葉斯(Naive Bayes),“Naive”在何處? 加上條件獨立假設的貝葉斯方法就是樸素貝葉斯方法(Naive Bayes)。Naive的發音是“乃一污”,意思是“樸素的”、“幼稚的”、“蠢蠢的”。咳咳,也就是說,大神們取名說該方法是一種比較萌蠢的方法,為啥? 將句子(“我”,“司”,“可”,“辦理”,“正規發票”) 中的 (“我”,“司”)與(“正規發票”)調換一下順序,就變成了一個新的句子(“正規發票”,“可”,“辦理”, “我”, “司”)。新句子與舊句子的意思完全不同。但由于乘法交換律,樸素貝葉斯方法中算出來二者的條件概率完全一樣!計算過程如下: P((“我”,“司”,“可”,“辦理”,“正規發票”)|S)? =P(“我”|S)P(“司”|S)P(“可”|S)P(“辦理”|S)P(“正規發票”|S)? =P(“正規發票”|S)P(“可”|S)P(“辦理”|S)P(“我”|S)P(“司”|S)? =P((“正規發票”,“可”,“辦理”,“我”,“司”)|S) 也就是說,在樸素貝葉斯眼里,“我司可辦理正規發票”與“正規發票可辦理我司”完全相同。樸素貝葉斯失去了詞語之間的順序信息。這就相當于把所有的詞匯扔進到一個袋子里隨便攪和,貝葉斯都認為它們一樣。因此這種情況也稱作詞袋子模型(bag of words)。? ![](https://box.kancloud.cn/2016-03-11_56e243108ec25.jpg)? 詞袋子模型與人們的日常經驗完全不同。比如,在條件獨立假設的情況下,“武松打死了老虎”與“老虎打死了武松”被它認作一個意思了。恩,樸素貝葉斯就是這么單純和直接,對比于其他分類器,好像是顯得有那么點萌蠢。 ### 8\. 簡單高效,吊絲逆襲 雖然說樸素貝葉斯方法萌蠢萌蠢的,但實踐證明在垃圾郵件識別的應用還令人詫異地好。Paul Graham先生自己簡單做了一個樸素貝葉斯分類器,“1000封垃圾郵件能夠被過濾掉995封,并且沒有一個誤判”。(Paul Graham《黑客與畫家》) 那個…效果為啥好呢? “有人對此提出了一個理論解釋,并且建立了什么時候樸素貝葉斯的效果能夠等價于非樸素貝葉斯的充要條件,這個解釋的核心就是:有些獨立假設在各個分類之間的分布都是均勻的所以對于似然的相對大小不產生影響;即便不是如此,也有很大的可能性各個獨立假設所產生的消極影響或積極影響互相抵消,最終導致結果受到的影響不大。具體的數學公式請參考[這篇 paper](http://www.cs.unb.ca/profs/hzhang/publications/FLAIRS04ZhangH.pdf)。”(劉未鵬《:平凡而又神奇的貝葉斯方法》) 恩,這個分類器中最簡單直接看似萌蠢的小盆友『樸素貝葉斯』,實際上卻是簡單、實用、且強大的。 ### 9\. 處理重復詞語的三種方式 我們之前的垃圾郵件向量(“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”),其中每個詞都不重復。而這在現實中其實很少見。因為如果文本長度增加,或者分詞方法改變,必然會有許多詞重復出現,因此需要對這種情況進行進一步探討。比如以下這段郵件: “代開發票。增值稅發票,正規發票。”? 分詞后為向量:? (“代開”,“發票”,“增值稅”,“發票”,“正規”,“發票”) 其中“發票”重復了三次。 ### 9.1 多項式模型: 如果我們考慮重復詞語的情況,也就是說,**重復的詞語我們視為其出現多次**,直接按條件獨立假設的方式推導,則有 P((“代開”,“發票”,“增值稅”,“發票”,“正規”,“發票”)|S)? =P(“代開””|S)P(“發票”|S)P(“增值稅”|S)P(“發票”|S)P(“正規”|S)P(“發票”|S)? =P(“代開””|S)P3(“發票”|S)P(“增值稅”|S)P(“正規”|S)? 注意這一項:P3(“發票”|S)。 在統計計算P(“發票”|S)時,每個被統計的垃圾郵件樣本中重復的詞語也統計多次。 > P(“發票”|S)=每封垃圾郵件中出現“發票”的次數的總和每封垃圾郵件中所有詞出現次數(計算重復次數)的總和 你看這個多次出現的結果,出現在概率的指數/次方上,因此這樣的模型叫作多項式模型。 ### 9.2 伯努利模型 另一種更加簡化的方法是**將重復的詞語都視為其只出現1次**, P((“代開”,“發票”,“增值稅”,“發票”,“正規”,“發票”)|S)? =P(“發票”|S)P(“代開””|S)P(“增值稅”|S)P(“正規”|S) 統計計算P(“詞語”|S)時也是如此。 P(“發票”|S)=出現“發票”的垃圾郵件的封數每封垃圾郵件中所有詞出現次數(出現了只計算一次)的總和 這樣的模型叫作伯努利模型(又稱為二項獨立模型)。這種方式更加簡化與方便。當然它丟失了詞頻的信息,因此效果可能會差一些。 ### 9.3 混合模型 第三種方式是在計算句子概率時,不考慮重復詞語出現的次數,但是在統計計算詞語的概率P(“詞語”|S)時,卻考慮重復詞語的出現次數,這樣的模型可以叫作混合模型。 我們通過下圖展示三種模型的關系。? ![](https://box.kancloud.cn/2016-03-11_56e243109ebc3.jpg)? 實踐中采用哪種模型,關鍵看具體的業務場景。筆者的簡單經驗是,對于垃圾郵件識別,混合模型更好些。 ### 10\. 去除停用詞與選擇關鍵詞 我們繼續觀察(“我”,“司”,“可”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”)?這句話。其實,像“我”、“可”之類詞其實非常中性,無論其是否出現在垃圾郵件中都無法幫助判斷的有用信息。所以可以直接不考慮這些典型的詞。這些無助于我們分類的詞語叫作“停用詞”(Stop Words)。這樣可以減少我們訓練模型、判斷分類的時間。 于是之前的句子就變成了(“司”,“辦理”,“正規發票”,“保真”,“增值稅”,“發票”,“點數”,“優惠”)?。 我們進一步分析。以人類的經驗,其實“正規發票”、“發票”這類的詞如果出現的話,郵件作為垃圾郵件的概率非常大,可以作為我們區分垃圾郵件的“關鍵詞”。而像“司”、“辦理”、“優惠”這類的詞則有點雞肋,可能有助于分類,但又不那么強烈。如果想省事做個簡單的分類器的話,則可以直接采用“關鍵詞”進行統計與判斷,剩下的詞就可以先不管了。于是之前的垃圾郵件句子就變成了(“正規發票”,“發票”)?。這樣就更加減少了我們訓練模型、判斷分類的時間,速度非常快。 “停用詞”和“關鍵詞”一般都可以提前靠人工經驗指定。不同的“停用詞”和“關鍵詞”訓練出來的分類器的效果也會有些差異。那么有沒有量化的指標來評估不同詞語的區分能力?在我們之前的文章[《機器學習系列(6)_從白富美相親看特征選擇與預處理(下)》](http://blog.csdn.net/longxinchen_ml/article/details/50493845)其實就提供了一種評價方法,大家可以參考。此處就不贅述了。 ### 11\. 淺談平滑技術 我們來說個問題(中文NLP里問題超級多,哭瞎T_T),比如在計算以下獨立條件假設的概率: > P((“我”,“司”,“可”,“辦理”,“正規發票”)|S)? > =P(“我”|S)P(“司”|S)P(“可”|S)P(“辦理”|S)P(“正規發票”|S) 我們掃描一下訓練集,發現“正規發票”這個詞從出現過!!!,于是P(“正規發票”|S)=0…問題嚴重了,整個概率都變成0了!!!樸素貝葉斯方法面對一堆0,很凄慘地失效了…更殘酷的是這種情況其實很常見,因為哪怕訓練集再大,也可能有覆蓋不到的詞語。本質上還是樣本數量太少,不滿足大數定律,計算出來的概率失真。為了解決這樣的問題,一種分析思路就是直接不考慮這樣的詞語,但這種方法就相當于默認給P(“正規發票”|S)賦值為1。其實效果不太好,大量的統計信息給浪費掉了。我們進一步分析,既然可以默認賦值為1,為什么不能默認賦值為一個很小的數?這就是平滑技術的基本思路,依舊保持著一貫的作風,`樸實/土`但是`直接而有效`。 對于伯努利模型,P(“正規發票”|S)的一種平滑算法是: > P(“正規發票”|S)=出現“正規發票”的垃圾郵件的封數+1每封垃圾郵件中所有詞出現次數(出現了只計算一次)的總和+2 對于多項式模型,P(“正規發票”| S)的一種平滑算法是: > P(“發票”|S)=每封垃圾郵件中出現“發票”的次數的總和+1每封垃圾郵件中所有詞出現次數(計算重復次數)的總和+被統計的詞表的詞語數量 說起來,平滑技術的種類其實非常多,有興趣的話回頭我們專門拉個專題講講好了。這里只提一點,就是所有的平滑技術都是給未出現在訓練集中的詞語一個估計的概率,而相應地調低其他已經出現的詞語的概率。 平滑技術是因為數據集太小而產生的現實需求。如果數據集足夠大,平滑技術對結果的影響將會變小。 ### 12\. 小結 我們找了個最簡單常見的例子:垃圾郵件識別,說明了一下樸素貝葉斯進行文本分類的思路過程。基本思路是先區分好訓練集與測試集,對文本集合進行分詞、去除標點符號等特征預處理的操作,然后使用條件獨立假設,將原概率轉換成詞概率乘積,再進行后續的處理。 > 貝葉斯公式 + 條件獨立假設 = 樸素貝葉斯方法 基于對重復詞語在訓練階段與判斷(測試)階段的三種不同處理方式,我們相應的有伯努利模型、多項式模型和混合模型。在訓練階段,如果樣本集合太小導致某些詞語并未出現,我們可以采用平滑技術對其概率給一個估計值。而且并不是所有的詞語都需要統計,我們可以按相應的“停用詞”和“關鍵詞”對模型進行進一步簡化,提高訓練和判斷速度。 因為公式比較多,為了防止看到公式就狗帶的情況,我們盡量用口(shuo)語(ren)化(hua)的方式表達公式,不嚴謹之處還望見諒,有紕漏之處歡迎大家指出。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看