Java DFA算法案例詳解
項(xiàng)目中需要對(duì)敏感詞做一個(gè)過(guò)濾,首先有幾個(gè)方案可以選擇:
直接將敏感詞組織成String后,利用indexOf方法來(lái)查詢(xún)。 傳統(tǒng)的敏感詞入庫(kù)后SQL查詢(xún)。 利用Lucene建立分詞索引來(lái)查詢(xún)。 利用DFA算法來(lái)進(jìn)行。首先,項(xiàng)目收集到的敏感詞有幾千條,使用a方案肯定不行。其次,為了方便以后的擴(kuò)展性盡量減少對(duì)數(shù)據(jù)庫(kù)的依賴(lài),所以放棄b方案。然后Lucene本身作為本地索引,敏感詞增加后需要觸發(fā)更新索引,并且這里本著輕量原則不想引入更多的庫(kù),所以放棄c方案。于是我們選定d方案為研究目標(biāo)。
2.DFA算法簡(jiǎn)介DFA全稱(chēng)為:Deterministic Finite Automaton,即確定有窮自動(dòng)機(jī)。其特征為:有一個(gè)有限狀態(tài)集合和一些從一個(gè)狀態(tài)通向另一個(gè)狀態(tài)的邊,每條邊上標(biāo)記有一個(gè)符號(hào),其中一個(gè)狀態(tài)是初態(tài),某些狀態(tài)是終態(tài)。但不同于不確定的有限自動(dòng)機(jī),DFA中不會(huì)有從同一狀態(tài)出發(fā)的兩條邊標(biāo)志有相同的符號(hào)。
簡(jiǎn)單點(diǎn)說(shuō)就是,它是是通過(guò)event和當(dāng)前的state得到下一個(gè)state,即event+state=nextstate。理解為系統(tǒng)中有多個(gè)節(jié)點(diǎn),通過(guò)傳遞進(jìn)入的event,來(lái)確定走哪個(gè)路由至另一個(gè)節(jié)點(diǎn),而節(jié)點(diǎn)是有限的。
3.敏感詞搜尋中的DFA算法3.1敏感詞庫(kù)構(gòu)造描述以王八蛋和王八羔子兩個(gè)敏感詞來(lái)進(jìn)行描述,首先構(gòu)建敏感詞庫(kù),該詞庫(kù)名稱(chēng)為SensitiveMap,這兩個(gè)詞的二叉樹(shù)構(gòu)造為:
用hash表構(gòu)造為:
以上面例子構(gòu)造出來(lái)的SensitiveMap為敏感詞庫(kù)進(jìn)行示意,假設(shè)這里輸入的關(guān)鍵字為:王八不好,流程圖如下:
對(duì)于“王*八&&蛋”這樣的詞,中間填充了無(wú)意義的字符來(lái)混淆,在我們做敏感詞搜索時(shí),同樣應(yīng)該做一個(gè)無(wú)意義詞的過(guò)濾,當(dāng)循環(huán)到這類(lèi)無(wú)意義的字符時(shí)進(jìn)行跳過(guò),避免干擾。
5.2敏感詞用拼音或部分用拼音代替兩種解決思路:一種是最簡(jiǎn)單是遇到這類(lèi)問(wèn)題,先豐富敏感詞庫(kù)進(jìn)行快速解決。第二種是判斷時(shí)將敏感詞轉(zhuǎn)換為拼音進(jìn)行對(duì)比判斷。
不過(guò)目前這兩種方案均不能徹底很好的解決該問(wèn)題,此類(lèi)問(wèn)題還需進(jìn)一步研究。
到此這篇關(guān)于Java DFA算法案例詳解的文章就介紹到這了,更多相關(guān)Java DFA算法內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5動(dòng)態(tài)(可拖動(dòng)控件大小)布局控件QSplitter詳細(xì)使用方法與實(shí)例2. ASP將數(shù)字轉(zhuǎn)中文數(shù)字(大寫(xiě)金額)的函數(shù)3. XML 非法字符(轉(zhuǎn)義字符)4. ASP 處理JSON數(shù)據(jù)的實(shí)現(xiàn)代碼5. js開(kāi)發(fā)中的頁(yè)面、屏幕、瀏覽器的位置原理(高度寬度)說(shuō)明講解(附圖)6. CSS清除浮動(dòng)方法匯總7. 不要在HTML中濫用div8. vue跳轉(zhuǎn)頁(yè)面常用的幾種方法匯總9. CSS3實(shí)例分享之多重背景的實(shí)現(xiàn)(Multiple backgrounds)10. XML入門(mén)的常見(jiàn)問(wèn)題(三)
