敏感詞演算法 優化

2021-09-25 12:22:31 字數 2004 閱讀 4574

/**

* @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...

敏感詞過濾演算法實現

說到敏感詞過濾,我也覺得這裡沒有必要寫這個文章,因為前人已經前前後後有過很多種演算法解決該問題。這裡我之所以寫這個文章,是因為我自己自創了一種演算法 真的是自創哦,因為我在寫這個演算法的時候,完全是自己想出來的方式,沒有借鑑任何 靈感來自於一篇文章中的一句話 如果能掃瞄一遍文字就能將所有的詞找出來,...