Java DFA算法案例詳解
1.背景
項(xiàng)目中需要對(duì)敏感詞做一個(gè)過濾,首先有幾個(gè)方案可以選擇:
- 直接將敏感詞組織成String后,利用indexOf方法來查詢。
- 傳統(tǒng)的敏感詞入庫(kù)后SQL查詢。
- 利用Lucene建立分詞索引來查詢。
- 利用DFA算法來進(jìn)行。
首先,項(xiàng)目收集到的敏感詞有幾千條,使用a方案肯定不行。其次,為了方便以后的擴(kuò)展性盡量減少對(duì)數(shù)據(jù)庫(kù)的依賴,所以放棄b方案。然后Lucene本身作為本地索引,敏感詞增加后需要觸發(fā)更新索引,并且這里本著輕量原則不想引入更多的庫(kù),所以放棄c方案。于是我們選定d方案為研究目標(biāo)。
2.DFA算法簡(jiǎn)介
DFA全稱為: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)說就是,它是是通過event和當(dāng)前的state得到下一個(gè)state,即event+state=nextstate。理解為系統(tǒng)中有多個(gè)節(jié)點(diǎn),通過傳遞進(jìn)入的event,來確定走哪個(gè)路由至另一個(gè)節(jié)點(diǎn),而節(jié)點(diǎn)是有限的。
3.敏感詞搜尋中的DFA算法
3.1敏感詞庫(kù)構(gòu)造描述
以王八蛋和王八羔子兩個(gè)敏感詞來進(jìn)行描述,首先構(gòu)建敏感詞庫(kù),該詞庫(kù)名稱為SensitiveMap,這兩個(gè)詞的二叉樹構(gòu)造為:
用hash表構(gòu)造為:
3.2基于敏感詞庫(kù)收索算法的描述
以上面例子構(gòu)造出來的SensitiveMap為敏感詞庫(kù)進(jìn)行示意,假設(shè)這里輸入的關(guān)鍵字為:王八不好,流程圖如下:
4.代碼編寫
4.1構(gòu)造敏感詞實(shí)現(xiàn)代碼
4.2實(shí)現(xiàn)敏感詞查詢代碼
5.優(yōu)化思路
5.1敏感詞中間填充無意義字符問題
對(duì)于“王*八&&蛋”這樣的詞,中間填充了無意義的字符來混淆,在我們做敏感詞搜索時(shí),同樣應(yīng)該做一個(gè)無意義詞的過濾,當(dāng)循環(huán)到這類無意義的字符時(shí)進(jìn)行跳過,避免干擾。
5.2敏感詞用拼音或部分用拼音代替
兩種解決思路:一種是最簡(jiǎn)單是遇到這類問題,先豐富敏感詞庫(kù)進(jìn)行快速解決。第二種是判斷時(shí)將敏感詞轉(zhuǎn)換為拼音進(jìn)行對(duì)比判斷。
不過目前這兩種方案均不能徹底很好的解決該問題,此類問題還需進(jìn)一步研究。
到此這篇關(guān)于Java DFA算法案例詳解的文章就介紹到這了,更多相關(guān)Java DFA算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)動(dòng)態(tài)代理
本文給大家介紹的是java使用動(dòng)態(tài)代理類實(shí)現(xiàn)動(dòng)態(tài)代理的方法和示例,這里推薦給大家,有需要的小伙伴參考下吧2015-02-02Java 中的CharArrayReader 介紹_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
CharArrayReader 是字符數(shù)組輸入流。它和ByteArrayInputStream類似,只不過ByteArrayInputStream是字節(jié)數(shù)組輸入流,而CharArray是字符數(shù)組輸入流。CharArrayReader 是用于讀取字符數(shù)組,它繼承于Reader2017-05-05修改Android應(yīng)用的樣式的一些關(guān)鍵點(diǎn)解析
這篇文章主要介紹了修改Android應(yīng)用的樣式的一些關(guān)鍵點(diǎn),即對(duì)影響外觀的theme跟style的相關(guān)修改,需要的朋友可以參考下2015-12-12springboot3+r2dbc響應(yīng)式編程實(shí)踐
本文主要介紹了springboot3+r2dbc響應(yīng)式編程實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Java連接MYSQL數(shù)據(jù)庫(kù)的實(shí)現(xiàn)步驟
以下的文章主要描述的是java連接MYSQL數(shù)據(jù)庫(kù)的正確操作步驟,在此篇文章里我們主要是以實(shí)例列舉的方式來引出其具體介紹2013-06-06關(guān)于通過Java連接mysql對(duì)反斜杠”\“轉(zhuǎn)義的測(cè)試詳解
這篇文章主要給大家介紹了關(guān)于通過Java連接mysql對(duì)反斜杠”\“轉(zhuǎn)義的測(cè)試的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家理解反斜杠”\“轉(zhuǎn)義具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-06-06Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:插入排序 Insertion Sort
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:插入排序 Insertion Sort,本文直接給出實(shí)例代碼,代碼中包含詳細(xì)注釋,需要的朋友可以參考下2015-06-06Java實(shí)現(xiàn)將png格式圖片轉(zhuǎn)換成jpg格式圖片的方法【測(cè)試可用】
這篇文章主要介紹了Java實(shí)現(xiàn)將png格式圖片轉(zhuǎn)換成jpg格式圖片的方法,涉及java文件讀寫及圖形創(chuàng)建等相關(guān)操作技巧,需要的朋友可以參考下2018-03-03