基於DFA敏感詞查詢的演算法簡析

2021-08-16 10:47:29 字數 1343 閱讀 7285

專案中需要對敏感詞做乙個過濾,首先有幾個方案可以選擇:

a.直接將敏感詞組織成string後,利用indexof方法來查詢。

b.傳統的敏感詞入庫後sql查詢。

c.利用lucene建立分詞索引來查詢。

d.利用dfa演算法來進行。

首先,專案收集到的敏感詞有幾千條,使用a方案肯定不行。其次,為了方便以後的擴充套件性儘量減少對資料庫的依賴,所以放棄b方案。然後lucene本身作為本地索引,敏感詞增加後需要觸發更新索引,並且這裡本著輕量原則不想引入更多的庫,所以放棄c方案。於是我們選定d方案為研究目標。

dfa全稱為:deterministic finite automaton,即確定有窮自動機。其特徵為:有乙個有限狀態集合和一些從乙個狀態通向另乙個狀態的邊,每條邊上標記有乙個符號,其中乙個狀態是初態,某些狀態是終態。但不同於不確定的有限自動機,dfa中不會有從同一狀態出發的兩條邊標誌有相同的符號。

簡單點說就是,它是是通過event和當前的state得到下乙個state,即event+state=nextstate。理解為系統中有多個節點,通過傳遞進入的event,來確定走哪個路由至另乙個節點,而節點是有限的。

以王八蛋和王八羔子兩個敏感詞來進行描述,首先構建敏感詞庫,該詞庫名稱為sensitivemap,這兩個詞的二叉樹構造為:

用hash表構造為:

以上面例子構造出來的sensitivemap為敏感詞庫進行示意,假設這裡輸入的關鍵字為:王八不好,流程圖如下:

對於「王*八&&蛋」這樣的詞,中間填充了無意義的字元來混淆,在我們做敏感詞搜尋時,同樣應該做乙個無意義詞的過濾,當迴圈到這類無意義的字元時進行跳過,避免干擾。

兩種解決思路:一種是最簡單是遇到這類問題,先豐富敏感詞庫進行快速解決。第二種是判斷時將敏感詞轉換為拼音進行對比判斷。

不過目前這兩種方案均不能徹底很好的解決該問題,此類問題還需進一步研究。

基於DFA敏感詞查詢的演算法簡析

專案中需要對敏感詞做乙個過濾,首先有幾個方案可以選擇 a.直接將敏感詞組織成string後,利用indexof方法來查詢。b.傳統的敏感詞入庫後sql查詢。c.利用lucene建立分詞索引來查詢。d.利用dfa演算法來進行。首先,專案收集到的敏感詞有幾千條,使用a方案肯定不行。其次,為了方便以後的擴...

基於DFA敏感詞查詢的演算法簡析

專案中需要對敏感詞做乙個過濾,首先有幾個方案可以選擇 a.直接將敏感詞組織成string後,利用indexof方法來查詢。b.傳統的敏感詞入庫後sql查詢。c.利用lucene建立分詞索引來查詢。d.利用dfa演算法來進行。首先,專案收集到的敏感詞有幾千條,使用a方案肯定不行。其次,為了方便以後的擴...

演算法 DFA敏感詞過濾

最近剛好有群友問到關於敏感詞過濾的問題,當時有人給出了一些辦法。1.利用hashset,對傳多來的字串進行比較。或者將敏感詞儲存到資料庫或者其他地方,然後和傳入的詞做匹配。2.正規表示式匹配。上述兩個方法不用想肯定都是很慢的。後來有人說道可以利用dfa演算法,因此我去研究了一下,增加自己的知識面。具...