目前,全球每天發出的3000億封電子郵件中,至少有半數屬於垃圾郵件。郵件服務供應商的首要任務自然是過濾掉這些垃圾郵件,以確保使用者能夠快速找到真正具有價值的重要郵件。
但垃圾郵件的檢測本身相當複雜。首先,垃圾郵件與正常郵件之間的界限非常模糊,而且評判標準往往會隨時間推移而有所變化。截至目前,各家郵件服務商普遍採用自動化垃圾郵件檢測方法,而機器學習已經成為其中最有效、也最受青睞的核心選項。雖然我們或多或少還是會看到垃圾郵件,但在機器學習演算法的強大支援之下,大多數垃圾郵件已經被從收件箱中直接清除。
那麼,機器學習技術是怎麼確定哪些是垃圾郵件、而哪些屬於正常郵件的?在本文中,我們將具體聊聊其中的工作原理。
挑戰所在
垃圾郵件有著多種不同風格。有些只是些市場調研的資訊,只是想引誘收件人開啟郵件或者傳播虛假資訊。但也有一些屬於偽造型郵件,目標是引導收件者點選惡意連結或下載惡意軟體。
但二者的共同點在於,它們都跟收件人的實際需求沒有半毛錢關係。垃圾郵件檢測演算法需要找到可靠的垃圾郵件過濾方法,在遮蔽不必要內容的同時,避免清理掉那些使用者希望接收並檢視的真實郵件。此外,演算法本身還得持續適應新的趨勢性動態——例如由新冠疫情引發的群體恐慌、選舉訊息以及加密貨幣社群的迅速升溫等等。
靜態規則適合解決這類需求。例如,如果郵件包含大量抄送方、正文部分極短以及主題部分全部大寫,那麼其很可能屬於垃圾郵件。同樣,某些傳送方的域名可能已經被列入垃圾郵件黑名單。但在大多數情況下,垃圾郵件檢測主要還是依賴於對郵件內容的具體分析。
樸素貝葉斯機器學習
機器學習演算法使用統計模型對資料進行分類。在檢測垃圾郵件這一使用場景下,經過訓練的機器學習模型必須能夠根據郵件中的詞彙順序,判斷其可能屬於垃圾郵件抑或是正常郵件。
不同的機器學習演算法都具備一定的垃圾郵件檢測能力,但目前最受關注的仍然是“樸素貝葉斯”演算法。顧名思義,樸素貝葉斯演算法以“貝葉斯定理”為基礎,即基於先驗知識對事件的機率做出描述。
之所以被冠名以“樸素”,是因為它首先假設觀測的特徵只獨立存在。例如,如果使用樸素貝葉斯機器學習方法來預測是否會下雨,那麼只需要溼度及溫度等少數特徵,即可對是否降雨這個事件做出預測。
在檢測垃圾郵件時,情況無疑更為複雜。我們的目標變數為給定電子郵件屬於“垃圾”或者“非垃圾”。其特徵則為電子郵件正文中包含的單詞或單詞組合。簡而言之,我們希望根據文字內容判斷出當前郵件屬於垃圾郵件的可能性。
這裡需要強調的是,檢測垃圾郵件時使用的各項特徵不一定彼此獨立。例如,我們可以將詞彙“烤”、“乳酪”和“三明治”結合起來,其在郵件語境下是否連續存在將表達出完全不同的含義。另一個更明確的例子就是“不”和“好玩”,獨立與非獨立分析將帶來徹底相反的結論。但好訊息是,雖然文字資料內的特徵獨立性往往非常複雜,但只要正確加以配置,樸素貝葉斯分類器同樣能夠有效處理大部分自然語言處理任務。
關於資料
垃圾郵件檢測屬於有監督機器學習問題。這意味著您需要為機器學習模型提供大量垃圾郵件與正常訊息示例,幫助其從中找出相應模式以準確將二者區分開來。
大多數電子郵件服務商都擁有自己的標記郵件資料集。例如,每當您在Gmail賬戶內將一封電子郵件標記為垃圾郵件,谷歌方面就會使用這部分資料訓練自己的機器學習演算法。(請注意,谷歌使用的垃圾郵件檢測演算法要比本文示例複雜得多,而且他們還擁有一套用於防止「報告垃圾郵件」功能遭到濫用的完善機制。)
目前也有不少值得一試的開源資料集,例如加利福尼亞大學歐文分校的垃圾郵件資料庫資料集以及安然垃圾郵件資料集。但請注意,這些資料集僅供教育及測試使用,對於生產級機器學習模型的建立沒有太大實際意義。
自行託管電子郵件伺服器的供應商可以建立起專門的資料集,並根據具體行業及用語對機器學習模型加以調整。例如,金融服務類企業的資料集在內容上將與建築類企業存在巨大差異。
訓練機器學習模型
儘管近年來,自然語言處理技術取得了令人振奮的進步,但人工智慧演算法本身仍然無法像人類那樣順暢理解語言內容。
因此,開發垃圾郵件檢測類機器學習模型的一大關鍵步驟,在於準備資料以進行統計處理。在訓練樸素貝葉斯分類器之前,必須透過特定步驟整理出垃圾郵件與正常郵件的語料庫。
考慮一套包含以下語句的資料集:
Steve想為聚會買點烤芝士三明治
Sally正為晚飯燒烤雞肉
我買了奶油芝士做蛋糕
在訓練模型以及隨後對新資料進行預測時,我們首先需要對文字資料進行“令牌化”,而後將其新增到機器學習演算法當中。在本質上,令牌化是指將文字資料拆分成較小的部分。如果您將上述資料集按用詞進行拆分,那麼將獲得以下詞彙。請注意,每個詞只出現一次。
Steve、想為、聚會、買、烤、芝士、三明治、Sally、正、晚飯、燒烤、雞肉、我、買了、奶油、蛋糕
我們可以刪除掉那些垃圾郵件和正常郵件中都會出現的詞彙,因為這些詞彙沒法幫我們區分出郵件本身的性質。這些被稱為“停用詞”,常見的例子包括這、那、是、要、某等。在以上資料集中,刪除停用詞之後,我們的詞彙量將快速縮減為5個。
我們還可以使用其他技術,例如“詞幹提取”與“詞條化”等,藉此將詞彙轉換為更基礎的形式。繼續來看我們的示例資料集,其中的“買了”和“買”有著相同的詞根,“烤”和“燒烤”也有相同的詞根。透過這樣的處理,我們可以進一步簡化機器模型。
在某些情況下,大家還可以考慮使用雙詞(包含兩個詞的令牌)、三詞(包含三個詞的令牌)或者更長的N字令牌。例如,使用雙詞形式對上述資料集進行標記,將得到“芝士蛋糕”表達;三詞形式則會帶來“烤芝士三明治”表達。
在資料處理完成之後,您將獲得一份術語表,這些術語定義了機器學習模型中的各項特徵。接下來,您需要確定哪些詞彙或者詞彙序列(如果使用N詞表達)與垃圾郵件及正常郵件相關。
在訓練資料集上訓練機器學習模型時,需要根據不同術語在垃圾郵件及正常郵件中出現的次數為其分配權重。例如,如果“贏大獎”屬於其中一項特徵,而且只出現在垃圾郵件當中,那麼任何具有此特徵的郵件都很可能被歸類為垃圾郵件。與之對應,如果“重要會議”只出現在正常電子郵件中,那麼任何具有此特徵的郵件都很可能被歸類為正常郵件。
在資料處理完成,並對各特徵分配了權重之後,您的機器學習模型即可過濾垃圾郵件。在收到一封新郵件之後,其中的文字將接受標記並按照貝葉斯公式執行。郵件正文中的每個術語均將乘以其權重,權重的總和即代表該電子郵件屬於垃圾郵件的可能性。(實際計算過程要更為複雜,但這裡為了簡便起見,我們直接求取所有權重之和。)
使用機器學習技術實現高階垃圾郵件檢測
聽起來很簡單,但樸素貝葉斯機器學習演算法在處理大部分文字分類任務(包括垃圾郵件檢測)時都取得了不錯的效果。
但它仍然不夠完美,這是肯定的。
與其他機器學習演算法一樣,樸素貝葉斯演算法無法理解語言的上下文,只能依靠詞彙之間的統計關係來判斷一段文字是否屬於某個類別。這意味著,如果發件人在郵件末尾新增一些符合正常郵件條件的詞彙,或者將符合垃圾郵件特徵的某些術語替換為其他同義詞或相關詞,那麼樸素貝葉斯演算法很可能將垃圾郵件錯誤判斷為正常郵件。
樸素貝葉斯方法當然不是唯一能夠檢測出垃圾郵件的機器學習演算法。其他流行的演算法選項還包括遞迴神經網路(RNN)與transformers,它們都能高效處理電子郵件及文字訊息等有序資料。
最後需要注意的是,垃圾郵件檢測一直在不斷髮展。就在開發者利用AI乃至其他技術檢測並過濾電子郵件中的有害訊息時,垃圾郵件傳送者也在尋求新的方法,希望騙過檢測系統、將垃圾郵件傳送到收件者手中。也正因為如此,電子郵件服務商才需要持續運用使用者的資料改進並更新其垃圾郵件檢測器。