使用DFA算法,实现敏感词过滤
生活随笔
收集整理的這篇文章主要介紹了
使用DFA算法,实现敏感词过滤
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
使用DFA算法實現(xiàn)敏感詞過濾
DFA,全稱 Deterministic Finite Automaton 即確定有窮自動機(jī):從一個狀態(tài)通過一系列的事件轉(zhuǎn)換到另一個狀態(tài),即 state -> event -> state。
存儲結(jié)構(gòu):
設(shè)置敏感詞:
private static List<String> DFAContent = new ArrayList<>();public void addFilterWords(){DFAContent.add("你不是人");DFAContent.add("王八羔子");}添加敏感詞
public Map<String, Object> addDFAStr() {Map<String, Object> newWordMap = null;Map<String, Object> nowMap = null;Map map = new HashMap(DFAContent.size());for (String str : DFAContent) {nowMap = map;char[] chars = str.toCharArray();for (int i = 0; i < chars.length; i++) {String s = String.valueOf(chars[i]);newWordMap = new HashMap<String, Object>();Map wordMap = (Map) nowMap.get(s);if (wordMap != null) {nowMap = wordMap;} else {nowMap.put(s, newWordMap);nowMap = newWordMap;if (i == chars.length - 1) {nowMap.put("isEnd", true);//說明下面沒有詞語了} else {nowMap.put("isEnd", false);//說明下面有詞語}}}}return map;}有些情況在敏感詞的中間可能會出現(xiàn)一些特殊字符,比如#¥%$等這些符號,來欺騙程序,從而通過敏感詞的過濾和審核。這時候就需要進(jìn)行特殊處理
/*** 過濾特殊字符* @param content* @return*/private static String filterWords = "!@#$%^&*()_+1234567890-=<>?,./:''\"`~,。、?》《“:;‘~·!¥";public boolean filterChar(char content){char[] chars = filterWords.toCharArray();for (char c : chars) {if (c == content){return true;}}return false;}使用dfa查找敏感詞匯:
/*** 使用dfa查找敏感詞匯** @param content* @return*/public List<String> findStr(String content) {List<String> keyWord = new ArrayList<>();Map<String, Object> map = this.addDFAStr();Boolean isEnd = true; // 標(biāo)記上一個詞的狀態(tài)char[] chars = content.toCharArray();try {String wordStr = "";//記住過濾詞for (char c : chars) {if (this.filterChar(c)){continue;}String str = String.valueOf(c);Map<String, Object> word = (Map<String, Object>) map.get(str);//不為空說明這個詞存在if (word != null) {if (!(Boolean) word.get("isEnd")) {map = word;} else {map = this.addDFAStr();}wordStr += str;isEnd = (Boolean) word.get("isEnd"); //isEnd為false 說明下面還有詞匯if (isEnd && !"".equals(wordStr)){//說明有詞 并且是個完整的詞keyWord.add(wordStr);wordStr = "";}} else {if (!isEnd) {wordStr = "";//置空map = this.addDFAStr();isEnd = true;}}}if (isEnd && !"".equals(wordStr)){//說明有詞keyWord.add(wordStr);wordStr = "";}} catch (Exception e) {e.printStackTrace();}return keyWord;}測試
@Testpublic void dfaTest() {this.addFilterWords();//添加敏感詞List<String> stringList = this.findStr("Java 是由 Sun Microsystems 公司" +"于 1995 年 5 月你不是人推出的高級程序設(shè)計語言。\n" +"Java 可運(yùn)行于多個平臺,你不是人,你是#王¥八%羔%子");System.out.println(stringList);}在實際開發(fā)過程中,可以將敏感詞匯存儲到數(shù)據(jù)庫中,在程序初始化的時候來查詢數(shù)據(jù)庫中的敏感詞庫數(shù)據(jù),加載到內(nèi)存當(dāng)中。
總結(jié)
以上是生活随笔為你收集整理的使用DFA算法,实现敏感词过滤的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 入市
- 下一篇: 三十岁以前不必在乎的29件事