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

文章版權由做者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/算法

1.背景

項目中須要對敏感詞作一個過濾,首先有幾個方案能夠選擇:數據庫

a.直接將敏感詞組織成String後,利用indexOf方法來查詢。微信

b.傳統的敏感詞入庫後SQL查詢。優化

c.利用Lucene創建分詞索引來查詢。3d

d.利用DFA算法來進行。blog

首先,項目收集到的敏感詞有幾千條,使用a方案確定不行。其次,爲了方便之後的擴展性儘可能減小對數據庫的依賴,因此放棄b方案。而後Lucene自己做爲本地索引,敏感詞增長後須要觸發更新索引,而且這裏本着輕量原則不想引入更多的庫,因此放棄c方案。因而咱們選定d方案爲研究目標。索引

2.DFA算法簡介

DFA全稱爲:Deterministic Finite Automaton,即肯定有窮自動機。其特徵爲:有一個有限狀態集合和一些從一個狀態通向另外一個狀態的邊,每條邊上標記有一個符號,其中一個狀態是初態,某些狀態是終態。但不一樣於不肯定的有限自動機,DFA中不會有從同一狀態出發的兩條邊標誌有相同的符號。路由

 

簡單點說就是,它是是經過event和當前的state獲得下一個state,即event+state=nextstate。理解爲系統中有多個節點,經過傳遞進入的event,來肯定走哪一個路由至另外一個節點,而節點是有限的。get

3.敏感詞搜尋中的DFA算法

3.1敏感詞庫構造描述

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

 

用hash表構造爲:

 

3.2基於敏感詞庫收索算法的描述

以上面例子構造出來的SensitiveMap爲敏感詞庫進行示意,假設這裏輸入的關鍵字爲:王八很差,流程圖以下:

  

4.代碼編寫

4.1構造敏感詞實現代碼

 

4.2實現敏感詞查詢代碼

 

5.優化思路

5.1敏感詞中間填充無心義字符問題

對於「王*八&&蛋」這樣的詞,中間填充了無心義的字符來混淆,在咱們作敏感詞搜索時,一樣應該作一個無心義詞的過濾,當循環到這類無心義的字符時進行跳過,避免干擾。

5.2敏感詞用拼音或部分用拼音代替

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

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

 

                                                                         -----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/

                                                                           若是您以爲本文確實幫助了您,能夠微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^

                                                                                                                     

相關文章
相關標籤/搜索