朴素贝叶斯算法--过滤垃圾短信
文章目錄
- 1. 基于黑名單過濾
- 2. 基于規則過濾
- 3. 基于概率統計過濾
- 4. 總結
上一節我們講到,如何用位圖、布隆過濾器,來 過濾重復數據。今天,我們再講一個跟過濾相關的問題,如何過濾垃圾短信?
1. 基于黑名單過濾
可以維護一個騷擾電話號碼和垃圾短信發送號碼的黑名單。
- 黑名單的搜集,有很多途徑,比如,公開的網站下載,用戶自主標記。標記個數超過一定閾值的號碼,我們就可以定義為騷擾電話,并將它加入到我們的黑名單中。
- 如果黑名單中的電話號碼不多的話,我們可以使用散列表、二叉樹等動態數據結構來存儲,對內存的消耗并不會很大。如果我們把每個號碼看作一個字符串,并且假設平均長度是16個字節,那存儲50萬個電話號碼,大約需要10MB的內存空間。對于手機這樣的內存有限的設備來說,這點內存的消耗也是可以接受的。
- 黑名單中的電話號碼很多呢?比如有500萬個。這個時候,如果再用散列表存儲,就需要大約100MB的存儲空間。為了實現一個攔截功能,耗費如此多的手機內存,顯然有點不合理。
- 布隆過濾器最大的特點就是比較省存儲空間,所以,用它來解決這個問題再合適不過。如果我們要存儲500萬個手機號碼,我們把位圖大小設置為10倍數據大小,也就是5000萬,那也只需要使用5000萬個二進制位(5000萬bits),換算成字節,也就是不到7MB的存儲空間。比起散列表的解決方案,內存的消耗減少了很多。
- 時間換空間,把黑名單存儲在服務器端上,把過濾和攔截的核心工作,交給服務器端來做。手機端只負責將要檢查的號碼發送給服務器端,服務器端通過查黑名單,判斷這個號碼是否應該被攔截,并將結果返回給手機端。這個解決思路完全不占用手機內存。不過網絡通信是比較慢的,所以,網絡延遲就會導致處理速度降低。而且必須聯網。
- 布隆過濾器會有判錯的概率!如果它把一個重要的電話或短信,當成垃圾攔截了,對于用戶來說,這是無法接受的。這是一個很大的問題。
2. 基于規則過濾
如果某個垃圾短信發送者的號碼并不在黑名單中,那這種方法就沒辦法攔截了。所以,基于黑名單的過濾,還不夠完善,再繼續看基于規則的過濾。
- 通過短信的內容,來判斷是垃圾短信。預先設定一些規則,如果短信符合這些規則,就判定它是垃圾短信。規則可以有很多,比如:
可以綜合多條規則進行判斷。比如,滿足2條以上才會被判定為垃圾短信;
或者每條規則對應一個不同的得分,某條短信的總得分超過某個閩值,才會被判定為垃圾短信。
以上規則還有很多細節需要處理。比如,第1條規則中,我們該如何定義特殊單詞;第2條規則中,我們該如何定義什么樣的號碼是群發號碼等等。
這里只講一下,如何定義特殊單詞?
可以基于概率統計的方法,借助計算機強大的計算能力,找出哪些單詞最常出現在垃圾短信中,將這些最常出現的單詞,作為特殊單詞,用來過濾短信。
這種方法的前提是,有大量的樣本數據,也就是說,要有大量的短信(比如1000萬條短信),并且每條短信都做好了標記,它是垃圾短信還是非垃圾短信。
對這1000萬條短信,進行分詞處理(借助中文或者英文分詞算法),去掉“的、和、是”等沒有意義的停用詞(Stop words),得到n個不同的單詞。針對每個單詞,統計有多少個垃圾短信出現了這個單詞,有多少個非垃圾短信會出現這個單詞,求出每個單詞出現在垃圾短信中的概率,以及出現在非垃圾短信中的概率。如果某個單詞出現在垃圾短信中的概率,遠大于出現在非垃圾短信中的概率,就把這個單詞作為特殊單詞。
3. 基于概率統計過濾
基于規則的過濾器,看起來很直觀,也很好理解,但是它也有一定的局限性。一方面,這些規則受人的思維方式局限,規則未免太過簡單;另一方面,垃圾短信發送者可能會針對規則,精心設計短信,繞過這些規則的攔截。對此,我們再來看一種更加高級的過濾方式,基于概率統計的過濾方式。
基于概率統計的過濾,基礎理論是基于樸素貝葉斯算法。先通過一個非常簡單的例子來看下,什么是樸素貝葉斯算法?
假設事件A是“小明不去上學”,事件B是“下雨了”。我們現在統計了一下過去10天的下雨情況和小明上學的情況,作為樣本數據。
我們來分析一下,這組樣本有什么規律。在這10天中,有4天下雨,所以下雨的概率P(B)=4/10。10天中有3天,小明沒有去上學,所以小明不去上學的概率P(A)=3/10。在4個下雨天中,小明有2天沒去上學,所以下雨天不去上學的概率P(A|B)=2/4。在小明沒有去上學的3天中,有2天下雨了,所以小明因為下雨而不上學的概率是P(BIA)=2/3。實際上,這4個概率值之間,有一定的關系,這個關系就是樸素貝葉斯算法,我們用公式表示出來,就是下面這個樣子。
我們需要把短信抽象成一組計算機可以理解并且方便計算的特征項,用這一組特征項代替短信本身,來做垃圾短信過濾。
可以通過分詞算法,把一個短信分割成n個單詞。這n個單詞就是一組特征項,全權代表這個短信。因此,判定一個短信是否是垃圾短信,就變成了,判定同時包含這幾個單詞的短信是否是垃圾短信。
不過,這里并不像基于規則的過濾器那樣,非黑即白。我們使用概率,來表征一個短信是垃圾短信的可信程度。
盡管有大量的短信樣本,但是我們沒法通過樣本數據統計得到這個概率。你可能會說,我只需要統計同時包含W1,W2,W3,……Wn 這n個單詞的短信有多少個(我們假設有x個),然后看這里面屬于垃圾短信的有幾個(假設y個),那包含W1,W2,W3,……Wn 這n個單詞的短信是垃圾短信的概率就是y/x。
But,實際情況,樣本中不會有太多同時包含W1,W2,W3,……Wn 的短信的,甚至根本不存在這樣的短信。沒有樣本,也就無法計算概率。
這個時候,樸素貝葉斯公式就可以派上用場了。通過樸素貝葉斯公式,將這個概率的求解,分解為其他三個概率的求解。如下。那轉化之后的三個概率是否可以通過樣本統計得到呢?
P(W1,W2,W3,……Wn 同時出現在一條短信中 | 短信是垃圾短信)這個概率照樣無法通過樣本來統計得到。但是我們可以基于下面這條著名的概率規則來計算。
獨立事件發生的概率計算公式:P(AB)=P(A)X P(B)
事件A和事件B是獨立事件,兩者的發生沒有相關性,那兩個同時發生的概率 P(A*B)就等于 P(A)*P(B)。
基于這條獨立事件發生概率的計算公式,把P(W1,W2,W3,……Wn 同時出現在一條短信中 | 短信是垃圾短信)分解為下面這個公式:
其中,P(Wi 出現在短信中 | 短信是垃圾短信)表示垃圾短信中包含Wi 這個單詞的概率有多大。
P(短信是垃圾短信)把樣本中垃圾短信的個數除以總樣本短信個數。
不過,P(W1,W2,W3,……Wn 同時出現在一條短信中)這個概率還是不好通過樣本統計得到,原因前面說過了,樣本空間有限。不過,我們沒必要非得計算這一部分的概率值。為什么這么說呢?
實際上,我們可以分別計算同時包含W1,W2,W3,……Wn 這n個單詞的短信,是垃圾短信和非垃圾短信的概率。假設它們分別是 P1 和 P2。我們可以通過對比 P1 和 P2 值的大小,來判斷一條短信是否是垃圾短信。如果 P1 是 P2 的很多倍(比如10倍),我們確信這條短信是垃圾短信。
在求解 P1 和 P2 倍數(P1/P2)的時候,我們也就不需要這個值。
4. 總結
今天,講了基于黑名單、規則、概率統計三種垃圾短信的過濾方法,這三種方法,還可以應用到很多類似的過濾、攔截的領域,比如垃圾郵件的過濾等等。
在講黑名單過濾的時候,我講到布隆過濾器可能會存在誤判情況,可能會導致用戶投訴。
實際上,我們可以結合三種不同的過濾方式的結果,對同一個短信處理,如果三者都表明這個短信是垃圾短信,才把它當作垃圾短信攔截過濾,這樣就會更精準。
在實際的工程中,還需要結合具體的場景,以及大量的實驗,不斷去調整策略,權衡垃圾短信判定的準確率(是否會把不是垃圾的短信錯判為垃圾短信)和召回率(是否能把所有的垃圾短信都找到),來實現我們的需求。
總結
以上是生活随笔為你收集整理的朴素贝叶斯算法--过滤垃圾短信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构--散列表 Hash Table
- 下一篇: html 获取鼠标在canvas上的坐标