========================================
貝葉斯推斷及其網際網路應用
作者:阮一峰

(接上文)
七、什麼是貝葉斯過濾器?
垃圾郵件是一種令人頭痛的頑症,困擾着所有的網際網路使用者。
正确識别垃圾郵件的技術難度非常大。傳統的垃圾郵件過濾方法,主要有"關鍵詞法"和"校驗碼法"等。前者的過濾依據是特定的詞語;後者則是計算郵件文本的校驗碼,再與已知的垃圾郵件進行對比。它們的識别效果都不理想,而且很容易規避。
另外,這種過濾器還具有自我學習的功能,會根據新收到的郵件,不斷調整。收到的垃圾郵件越多,它的準确率就越高。
八、建立曆史資料庫
貝葉斯過濾器是一種統計學過濾器,建立在已有的統計結果之上。是以,我們必須預先提供兩組已經識别好的郵件,一組是正常郵件,另一組是垃圾郵件。
我們用這兩組郵件,對過濾器進行"訓練"。這兩組郵件的規模越大,訓練效果就越好。paul graham使用的郵件規模,是正常郵件和垃圾郵件各4000封。
"訓練"過程很簡單。首先,解析所有郵件,提取每一個詞。然後,計算每個詞語在正常郵件和垃圾郵件中的出現頻率。比如,我們假定"sex"這個詞,在4000封垃圾郵件中,有200封包含這個詞,那麼它的出現頻率就是5%;而在4000封正常郵件中,隻有2封包含這個詞,那麼出現頻率就是0.05%。(【注釋】如果某個詞隻出現在垃圾郵件中,paul graham就假定,它在正常郵件的出現頻率是1%,反之亦然。這樣做是為了避免機率為0。随着郵件數量的增加,計算結果會自動調整。)
有了這個初步的統計結果,過濾器就可以投入使用了。
九、貝葉斯過濾器的使用過程
現在,我們收到了一封新郵件。在未經統計分析之前,我們假定它是垃圾郵件的機率為50%。(【注釋】有研究表明,使用者收到的電子郵件中,80%是垃圾郵件。但是,這裡仍然假定垃圾郵件的"先驗機率"為50%。)
我們用s表示垃圾郵件(spam),h表示正常郵件(healthy)。是以,p(s)和p(h)的先驗機率,都是50%。
然後,對這封郵件進行解析,發現其中包含了sex這個詞,請問這封郵件屬于垃圾郵件的機率有多高?
我們用w表示"sex"這個詞,那麼問題就變成了如何計算p(s|w)的值,即在某個詞語(w)已經存在的條件下,垃圾郵件(s)的機率有多大。
根據條件機率公式,馬上可以寫出
公式中,p(w|s)和p(w|h)的含義是,這個詞語在垃圾郵件和正常郵件中,分别出現的機率。這兩個值可以從曆史資料庫中得到,對sex這個詞來說,上文假定它們分别等于5%和0.05%。另外,p(s)和p(h)的值,前面說過都等于50%。是以,馬上可以計算p(s|w)的值:
是以,這封新郵件是垃圾郵件的機率等于99%。這說明,sex這個詞的推斷能力很強,将50%的"先驗機率"一下子提高到了99%的"後驗機率"。
十、聯合機率的計算
做完上面一步,請問我們能否得出結論,這封新郵件就是垃圾郵件?
回答是不能。因為一封郵件包含很多詞語,一些詞語(比如sex)說這是垃圾郵件,另一些說這不是。你怎麼知道以哪個詞為準?
paul graham的做法是,選出這封信中p(s|w)最高的15個詞,計算它們的聯合機率。(【注釋】如果有的詞是第一次出現,無法計算p(s|w),paul graham就假定這個值等于0.4。因為垃圾郵件用的往往都是某些固定的詞語,是以如果你從來沒見過某個詞,它多半是一個正常的詞。)
所謂聯合機率,就是指在多個事件發生的情況下,另一個事件發生機率有多大。比如,已知w1和w2是兩個不同的詞語,它們都出現在某封電子郵件之中,那麼這封郵件是垃圾郵件的機率,就是聯合機率。
在已知w1和w2的情況下,無非就是兩種結果:垃圾郵件(事件e1)或正常郵件(事件e2)。
其中,w1、w2和垃圾郵件的機率分别如下:
如果假定所有事件都是獨立事件(【注釋】嚴格地說,這個假定不成立,但是這裡可以忽略),那麼就可以計算p(e1)和p(e2):
又由于在w1和w2已經發生的情況下,垃圾郵件的機率等于下面的式子:
将p(s)等于0.5代入,得到
将p(s|w1)記為p1,p(s|w2)記為p2,公式就變成
十一、最終的計算公式
将上面的公式擴充到15個詞的情況,就得到了最終的機率計算公式:
一封郵件是不是垃圾郵件,就用這個式子進行計算。這時我們還需要一個用于比較的門檻值。paul graham的門檻值是0.9,機率大于0.9,表示15個詞聯合認定,這封郵件有90%以上的可能屬于垃圾郵件;機率小于0.9,就表示是正常郵件。
有了這個公式以後,一封正常的信件即使出現sex這個詞,也不會被認定為垃圾郵件了。
(完)