/**
* @author cj
* @date 2019/7/22
* 敏感詞過濾
* 詞典樹/字首樹
* 特殊字元只針對空格或者&*……之類
* 若敏感詞中間插字母或數字則無效
*/@component
public class sensitiveutil implements initializingbean
reader.close();
} catch (exception e)
}//預設敏感詞替換符
private static final string default_replacement = "敏感詞";
//節點類
private class trienode
/*** 獲取下乙個節點
** @param key
* @return
*/trienode getsubnode(character key)
/***
* @return
*/boolean iskeywordend()
/***
* @param end
*/void setkeywordend(boolean end)
/*** 獲取子節點總數
** @return
*/public int getsubnodecount()
}//根節點
private trienode rootnode = new trienode();
/*** 判斷是否是乙個特殊符號或空格
* 比如某人傳了類似這樣的字段: 想嫖@#⚪娼 嗎
* 用該方法過濾
** @param c
* @return true:特殊字元需跳過,false:正常字元
*/private boolean issymbol(char c)
/*** 過濾敏感詞
** @param text
* @return
*/public string filter(string text)
string replacement = default_replacement;
stringbuilder result = new stringbuilder();
trienode tempnode = rootnode;
int begin = 0;//回滾數 指向有效字串(除去特殊字元)的頭部
int position = 0;//當前比較的位置 遍歷字串的指標
while (position < text.length())
//出現在敏感詞中間 忽略特殊字元
position++;
continue;
}tempnode = tempnode.getsubnode(c);//查詢當前字元的子節點
if (tempnode == null) else else }}
//特殊情況: 敏感詞:abcd 傳入字串:abc begin指向a,position已遍歷完但敏感詞沒遍歷完
// 即有效 加入到sb中
return result.tostring();
}/**
* 將自定義的敏感詞構建成一顆字首樹
* 從rootnode的子節點開始構建
** @param linetxt
*/private void addword(string linetxt)
//查詢當前樹是否已存在相同的節點
trienode node = tempnode.getsubnode(c);
if (node == null) //若存在則指標移動至該節點
tempnode = node;
if (i == linetxt.length() - 1) }}
public static void main(string args)
}
Java Web 敏感詞過濾演算法
1.dfa演算法 dfa演算法的原理可以參考這裡,簡單來說就是通過map構造出一顆敏感詞樹,樹的每一條由根節點到葉子節點的路徑構成乙個敏感詞,例如下圖 簡單實現如下 public class textfilterutil 構建敏感詞庫 param keyword private static voi...
Java Web敏感詞過濾演算法
1.dfa演算法 dfa演算法的原理可以參考 這裡 簡單來說就是通過map構造出一顆敏感詞樹,樹的每一條由根節點到葉子節點的路徑構成乙個敏感詞,例如下圖 簡單實現如下 public class textfilterutil 構建敏感詞庫 param keyword private static vo...
敏感詞過濾演算法實現
說到敏感詞過濾,我也覺得這裡沒有必要寫這個文章,因為前人已經前前後後有過很多種演算法解決該問題。這裡我之所以寫這個文章,是因為我自己自創了一種演算法 真的是自創哦,因為我在寫這個演算法的時候,完全是自己想出來的方式,沒有借鑑任何 靈感來自於一篇文章中的一句話 如果能掃瞄一遍文字就能將所有的詞找出來,...