Java DFA算法案例詳解
1.背景
項目中需要對敏感詞做一個過濾,首先有幾個方案可以選擇:
- 直接將敏感詞組織成String後,利用indexOf方法來查詢。
- 傳統的敏感詞入庫後SQL查詢。
- 利用Lucene建立分詞索引來查詢。
- 利用DFA算法來進行。
首先,項目收集到的敏感詞有幾千條,使用a方案肯定不行。其次,為瞭方便以後的擴展性盡量減少對數據庫的依賴,所以放棄b方案。然後Lucene本身作為本地索引,敏感詞增加後需要觸發更新索引,並且這裡本著輕量原則不想引入更多的庫,所以放棄c方案。於是我們選定d方案為研究目標。
2.DFA算法簡介
DFA全稱為:Deterministic Finite Automaton,即確定有窮自動機。其特征為:有一個有限狀態集合和一些從一個狀態通向另一個狀態的邊,每條邊上標記有一個符號,其中一個狀態是初態,某些狀態是終態。但不同於不確定的有限自動機,DFA中不會有從同一狀態出發的兩條邊標志有相同的符號。
簡單點說就是,它是是通過event和當前的state得到下一個state,即event+state=nextstate。理解為系統中有多個節點,通過傳遞進入的event,來確定走哪個路由至另一個節點,而節點是有限的。
3.敏感詞搜尋中的DFA算法
3.1敏感詞庫構造描述
以王八蛋和王八羔子兩個敏感詞來進行描述,首先構建敏感詞庫,該詞庫名稱為SensitiveMap,這兩個詞的二叉樹構造為:
用hash表構造為:
3.2基於敏感詞庫收索算法的描述
以上面例子構造出來的SensitiveMap為敏感詞庫進行示意,假設這裡輸入的關鍵字為:王八不好,流程圖如下:
4.代碼編寫
4.1構造敏感詞實現代碼
4.2實現敏感詞查詢代碼
5.優化思路
5.1敏感詞中間填充無意義字符問題
對於“王*八&&蛋”這樣的詞,中間填充瞭無意義的字符來混淆,在我們做敏感詞搜索時,同樣應該做一個無意義詞的過濾,當循環到這類無意義的字符時進行跳過,避免幹擾。
5.2敏感詞用拼音或部分用拼音代替
兩種解決思路:一種是最簡單是遇到這類問題,先豐富敏感詞庫進行快速解決。第二種是判斷時將敏感詞轉換為拼音進行對比判斷。
不過目前這兩種方案均不能徹底很好的解決該問題,此類問題還需進一步研究。
到此這篇關於Java DFA算法案例詳解的文章就介紹到這瞭,更多相關Java DFA算法內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java面試重點中的重點之Elasticsearch核心原理
- C++有限狀態機實現詳解
- Java正則表達式裡隱藏的陷阱
- Python 敏感詞過濾的實現示例
- vue-router中hash模式與history模式的區別