因為工作需求,需要一個敏感詞檢測的功能,本來準備接入雲平臺.但是後來想想還是自己做了吧.由於是第一次接觸敏感詞檢測,剛開始的想法是使用字串匹配,或者分詞匹配,但是一想到如果敏感詞有幾千,而需要檢測的內容又特別長的時候,效率就非常低,於是從《演算法導論》裡面查了一下,找到了
dfa
演算法.於是dfa
的go
語言包就誕生了.
DFA 全稱為:Deterministic Finite Automaton,即確定有窮自動機。其特徵為:有一個有限狀態集合和一些從一個狀態通向另一個狀態的邊,每條邊上標記有一個符號,其中一個狀態是初態,某些狀態是終態。但不同於不確定的有限自動機,DFA 中不會有從同一狀態出發的兩條邊標誌有相同的符號。
這裡我們用 Trie 樹實現. 下面我們有and,as,at,cn,com這些關鍵詞, 我們看下使用Tire 樹怎麼儲存這些資料
從這個圖中可以看出這個樹儲存的資料規律:
根節點不包含字元,除根節點外的每一個子節點都包含一個字元。
從根節點到某一節點,路徑上經過的字元連線起來,就是該節點對應的字串。
每個單詞的公共字首作為一個字元節點儲存
根據這些特性,我們構建一個 Trie 樹, 我實現了一個敏感詞檢測包.程式碼非常簡單,有需要使用的可以直接將檔案拷貝到自己的專案中使用.
GitHub地址: github.com/bean-du/dfa
本作品採用《CC 協議》,轉載必須註明作者和本文連結