敏感詞過濾演算法 字首樹演算法

2021-08-29 09:58:06 字數 3398 閱讀 7171

背景平時我們在逛貼吧、牛客網的時候,我們經常可以看到一些形如 「***」的符號,通過上下文,我們也可以很容易猜到這些詞原來是罵人的話,只是被系統和諧了。那麼這是如何實現的呢?作為普通人,我們最先想到的一種辦法就是把所有敏感串存入乙個列表中,然後使用者每發一條內容後台就把該內容與敏感串列表的每一項進行匹配,然後把匹配的字元進行和諧。顯然這樣的效率是很低的。非常影響效能,那麼我們有沒有其他的演算法呢?這就是我這篇博文打算介紹的。

原理講解

1.首先建立個敏感詞字首樹

根節點為空

2.準備好待處理字串:哈哈大王八子大豬蹄子哦,宣告三個指標,分別指向字首樹的根節點以及待處理字串的開始字元

3.position指向的字元與根節點的所有子節點進行匹配,不匹配,position 和 begin分別指向待處理字串的下乙個字元,tempnode依舊指向 根節點

4.依舊不匹配,position 和begin繼續向前走一位,指向「」,treenode依舊指向根節點

5.此時 根節點有乙個子節點 與 position指向的字元相等,都為『』,則tempnode 指向該節點,同時position前進一步,指向『

6.此時把position指向的『』 和 tempnode的所有子節點進行匹配,匹配失敗,說明 從begin起頭所有串是不存在敏感詞的,可以直接輸出。此時begin前進一位,position回退到begin的位置,tempnode回退到根節點

7.此時再把position指向的『王』與tempnode的所有子節點進行匹配,匹配成功,所以tempnode指向該節點,同時position前進一位,指向''

8.此時再把position指向的『』 與tempnode的所有子節點進行匹配,匹配成功,此時tempnode 指向它的子節點『』,同時position前進一位。

9.繼續把position指向的字元與tempnode的所有子節點進行匹配,匹配失敗。說明以begin起頭的不存在非法字元,可以加入到結果集中。 此時begin向前走一位,position回退到begin的位置,同時tempnode回退到根節點。

10.同理,可以發現子'子'不匹配,則直接把它加入結果集,同時position 和begin 向前走一位,tempnode指向根節點。

此時position指向 『』,與tempnode的所有 子節點進行匹配,匹配成功,則position和tempnode都走一位,迴圈執行....

直到position指向『』,tempnode指向『蹄』

11.此時把position與tempnode的所有子節點進行匹配,匹配成功,tempnode指向它的子節點『子』,此時檢查發現tempnode是敏感詞樹的葉子節點,說明從begin+1開始的位置 到 position這段是敏感詞,用和諧詞替換掉。替換之後position前進一位,begin跳到position的位置,tempnode回退到根節點

以上,就是全部流程啦,理解了之後看**就簡單多啦

**講解

1.字首樹節點結構

private class treenode

public treenode getsubnode(character key)

public boolean iskeywordsend()

public void setkeywordsend(boolean end)

}

2.構建字首樹的方法

public void addsensitiveword(string words)

treenode node = tempnode.getsubnode(c);

if (node == null)

// 指標移動

tempnode = node;

//如果到了最後乙個字元

if(i == words.length() -1)}}

3.演算法具體實現

public string filter(string text)

string sensitivewords = "***";

stringbuilder result = new stringbuilder();

treenode tempnode = rootnode;

int begin = 0;

int position = 0;

while (position < text.length())

position++;

continue;

}tempnode = tempnode.getsubnode(c);

//如果匹配失敗

if(tempnode == null)else if(tempnode.iskeywordsend())else

}return result.tostring();

}

小結

最近一直在做專案,所以有一段時間沒寫文章了,專案也快完成了,就把在專案中使用的乙個演算法做了下總結,希望能給讀者一些幫助。 

使用「字首樹」過濾敏感詞

名稱 trie 字典樹 查詢樹 特點 查詢效率高,消耗記憶體大 應用 字串檢索 詞頻統計 字串排序等 定義字首樹 根據敏感詞,初始化字首樹 編寫過濾敏感詞的方法 component public class sensitivefilter catch ioexception e 將乙個敏感詞新增到字...

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