🎯 什麼情境該想到我
當你「要用機器擋掉垃圾內容或高風險交易,而人工審核已經審不動」的時候。
⚙️ 怎麼用(步驟 / 公式)
A. 文字比對(擋敏感詞)
- 網站維護一份敏感詞列表,若使用者發表的資訊含有列表中的敏感詞,就做消毒處理(把敏感詞轉義為 ***)或拒絕發表。
- 選比對方法:
- 敏感詞比較少、使用者提交的文字長度也短 → 直接用正則表達式比對。
- 但正則的效率一般較差;當敏感詞很多、發布資訊也很長、網站並發量較高時要換方法。公開演算法基本上都是 Trie 樹的變種,空間與時間複雜度都比較好的有雙陣列 Trie 演算法。
- Trie 演算法的本質是確定一個有限狀態自動機,根據輸入資料進行狀態轉移。雙陣列 Trie 用兩個稀疏陣列儲存樹結構:base 陣列存 Trie 樹的節點,check 陣列進行狀態檢查。需要依業務場景與經驗決定陣列大小,避免陣列過大或衝突過多。
- 更簡單的實作是多級 Hash 表過濾樹:例如敏感詞表含「阿拉伯、阿拉汗、阿油、北京、北大荒、北風」,就構造一棵過濾樹,使用者提交的資訊逐字依序在樹中比對;過濾樹分支可能較多,把同一層中相同父節點的字放進 Hash 表以提高比對速度。處理速度較快、稍加變形即可適應各種過濾場景,缺點是用 Hash 表會浪費部分記憶體空間(敏感詞數量不多時可以接受)。
- 加降噪預處理:為了繞過敏感詞檢查,某些輸入會做手腳,例如「阿拉_伯」,這時要先對資訊做降噪預處理再比對。
B. 分類演算法(識別垃圾資訊)
- 早期主要靠人工審核,但大型網站(如 Facebook、LinkedIn 這類 Web2.0 社交網站)每天使用者提交的資訊數千萬計;B2B 撮合網站的站內信也常被廣告淹沒正常詢盤——海量資訊人工審核不現實。
- 訓練流程:先把批量已分類的樣本(書中舉例為 50000 封正常郵件、2000 封垃圾郵件)輸入分類演算法訓練,得到垃圾郵件分類模型;再用分類演算法結合分類模型辨識待處理郵件。
- 從貝氏開始:貝氏分類演算法是用機率統計方法進行分類。根據已分類樣本取得一組特徵值的機率——例如「茶葉」這個詞出現在垃圾郵件中的機率為 20%、出現在非垃圾郵件中的機率為 1%,即得到分類模型;對待處理郵件擷取特徵值後結合模型即可判斷分類。
- 演算法升級路線:貝氏假設特徵值之間互相獨立,所以又叫樸素貝氏(書中寫作 Native Bayes);但這個假設很多時候不成立,特徵值之間具有關聯性——對樸素貝氏增加特徵值的關聯依賴處理,得到 TAN 演算法;更進一步,對關聯規則做聚類挖掘,得到更強大的 ARCS(Association Rule Clustering System)演算法。
- 但先別急著升級:書中明說,由於貝氏分類演算法簡單、處理速度快,仍是許多即時線上系統反垃圾的首選。
- 同一套也能拿來分類資訊:入口網站可用它把採集來的新聞稿件自動分類、分發到不同頻道;郵箱服務商也用它依郵件內容推送個人化廣告以提高投遞相關度。
C. 黑名單(擋已知的壞來源)
- 把被舉報的垃圾郵箱地址放進黑名單,再針對郵件的發件人在黑名單中查找,找到就過濾。黑名單也可用於資訊去重,例如把文章標題或關鍵段落記入黑名單,減少搜尋引擎收錄重複資訊。
- 先用 Hash 表:實作簡單、時間複雜度小,滿足一般場景。
- 算一下記憶體再決定——書中算例:處理 10 億個黑名單郵件地址、每個地址需要 8 個位元組的資訊指紋,即需要 8GB 記憶體;為減少 Hash 衝突還需要空間冗餘,假如空間利用率為 50%,則需要 16GB 記憶體。列表越大一般伺服器越無法承受,而且衝突越多、檢索速度越慢。
- 過濾需求不要求完全精確時,改用布隆過濾器(Bloom Filter,以發明者巴頓・布隆命名):由一個二進位列表與一組隨機數映射函數實現。仍以 10 億郵件地址黑名單為例,在記憶體中建立一個 2GB 大小的儲存空間並全部初始化為 0;
- 加入黑名單:用 **8 個隨機映射函數(F1, F2, …, F8)**得到 8 個隨機數,把該郵箱地址映射到二進位儲存空間的 8 個位置,然後把這些位置置 1。
- 檢查是否在黑名單:用同樣的映射函數取得 8 個位置上的 bit,如果這些值都為 1,那麼該郵箱地址在黑名單中。
- 書中結論:處理同樣數量的資訊,布隆過濾器只使用 Hash 表所需記憶體的 1/8。
D. 電子商務風險控制
- 先分清楚在防哪一類風險(書中四類):
- 帳戶風險:帳戶被駭客盜用、惡意註冊帳號。
- 買家風險:買家惡意下單占用庫存進行不正當競爭;黃牛利用促銷搶購低價商品;此外還有良品拒收、欺詐退款,以及常見於 B2B 交易的虛假詢盤。
- 賣家風險:不良賣家惡意欺詐,例如貨不對板、虛假發貨、炒作信用;此外還有出售違禁商品、侵權產品。
- 交易風險:信用卡盜刷、支付欺詐、洗錢套現。
- 機器 + 人工雙軌:大型電商網站都配備專門的風控團隊,風控手段包括自動與人工兩種。機器自動識別為高風險的交易與資訊,會送給風控審核人員進行人工審核;機器自動風控的技術與方法,也不斷透過人工發現的新風險類型逐步完善。
- 手段一:規則引擎。當交易的某些指標滿足一定條件就被認為有高風險欺詐可能,例如:使用者來自欺詐高發地區、交易金額超過某個數值、與上次登入的地址距離差距很大、使用者登入地與收貨地不符、使用者第一次交易等。大型網站在營運過程中結合業界最新發現,會總結出數以千計的此類高風險交易規則。
- 若在業務邏輯中用 if-else 寫死,程式碼會非常龐大,而且新風險類型不斷出現、規則要不斷調整,程式碼也得跟著一直改。
- 規則引擎是一種將業務規則與規則處理邏輯相分離的技術:業務規則檔由營運人員透過管理介面編輯,需要修改規則時無需更改程式碼、發布程式即可即時使用新規則;規則處理邏輯則負責呼叫規則處理輸入的資料。
- 手段二:統計模型。規則引擎技術雖簡單,但隨著規則逐漸增加會出現規則衝突、難以維護,而且規則越多效能越差;目前大型網站更傾向使用統計模型做風控。
- 做法:使用前述分類演算法或更複雜的機器學習演算法做智慧統計——根據歷史交易中的欺詐交易資訊訓練分類演算法,再把採集加工後的交易資訊輸入,即可得到交易風險分值。
- 書中結論:經過充分訓練後的統計模型,準確率不低於規則引擎,分類演算法的即時計算效能更好;由於統計模型使用模糊識別、並不精確比對欺詐類型規則,因此對新出現的交易欺詐還具有一定預測性。
🧪 我實際套用的紀錄
- (待填)
⚠️ 注意 / 什麼時候不適用
- 布隆過濾器可能誤判:檢查結果說在黑名單中,但實際卻從未放入過——因為一個地址映射的 8 個 bit 可能正好都被其他地址設為 1。這種可能性極小、通常在系統可接受範圍內,但需要精確判斷時就不適合使用布隆過濾器。
- 分類演算法一定會有誤判與漏判:貝氏得到的是機率值,會有誤判(非垃圾郵件判成垃圾郵件)與漏判(垃圾郵件判成非垃圾郵件)。所以高風險結果要接人工審核,而不是直接處決。
- 正則不要硬撐:敏感詞多、文字長、並發高時,正則的效率會先垮,該換 Trie 變種或多級 Hash 表。
- 敏感詞比對不做降噪等於白做:「阿拉_伯」這類手腳會直接繞過。
- 規則引擎不是終點:規則數量上千之後衝突、維護與效能都會惡化。
- Hash 表黑名單有記憶體天花板:先按 10 億 × 8 位元組 ÷ 50% 利用率 = 16GB 這種方式算一遍,再決定資料結構。
🔗 相關工具
- 工具-資料加密與密鑰管理 —— 同一章的資料安全篇:內容與交易守住之後,靜態資料靠加密守
- 工具-網站應用攻擊與防禦 —— 同一章的攻擊防禦篇,和反垃圾同屬「使用者輸入不可信」的處理
- 工具-從規則到統計 —— 規則引擎 →統計模型正是這條路線的教科書級案例
- 工具-用資訊消除不確定性 —— 貝氏與特徵值機率背後的資訊觀
- 工具-資料結構的選擇 —— Trie/Hash 表/布隆過濾器之間的取捨思路
- 工具-時間複雜度分析 —— 判斷正則撐不撐得住、比對要不要換演算法的量尺
- 大型網站技術架構 —— 來源書