敏感詞過濾

2021-07-05 06:03:39 字數 904 閱讀 9355

最近需要實現對聊天裡的敏感詞過濾,要求比較簡單,只需要對字型檔中存在的關鍵字進行匹配,所以不需要非常複雜的實現,但是需要能夠快速地對乙個關鍵字集合進行匹配。

搜了一下相關的資料,比較簡單的乙個演算法是使用aho-corasick演算法,以下簡稱ac演算法。該演算法的基本思想中包含了kmp演算法,即利用模式串中已匹配的子串的最長字尾(同時是字首)來跳過一些不可能的匹配位置,進而達到快速匹配的目的。

不過ac演算法在匹配乙個關鍵字集合時,比kmp要快。因為如果使用kmp在乙個輸入查詢關鍵字集合中的元素,若關鍵字集合大小為m,那麼我們需要進行m次匹配,而ac演算法僅需對輸入串遍歷一次即可搜尋出所有匹配的關鍵字,也就是說,演算法的複雜度與關鍵字集合大小關係不大。

在實現了簡單的ac演算法後,簡單的測試後發現較*****演算法效率提高不少,從原來的50ms到1ms。

當然這裡的過濾,只是最基本的過濾,只是根據字型檔進行過濾,而敏感詞變化較多,要達到較高的過濾,需要比較複雜的實現。可以想到的問題是:

對於乙個關鍵字,如果其中包含了空格等其他字元,對於我們來說,可能還是應該被過濾,但是由於不在字型檔中,所以不會進行過濾。可以考慮使用正規表示式,但是如果簡單使用正規表示式,那麼跟*****演算法就一樣了,有方法是將正規表示式轉換為自動機,不過為了簡單,可能只是實現正規表示式的乙個子集。

關鍵字為輸入字串的乙個子串,這個時候如果不做處理,可能就會誤判。在上面那個簡單實現中,我只是判斷一下字元邊界(只對英文本元起作用)來防止匹配子串的情況。

stackexchange上的乙個回答提到了使用phonic algorithm來做過濾,不過似乎不能應用於中文。

由於ac的資料結構是trie,所以可以考慮使用double-array trie來提高查詢的效率。

我是根據ac的*****實現的,裡面有詳細的偽**以及演算法的說明。

敏感詞過濾

敏感詞過濾 防沉迷,基本所有上線系統都會用的基礎功能吧,網上挺多 的,也很多種方式,看的有點繞寫了個自己感覺比較乾淨清楚的,結構也比較簡單,記錄一下insert 和 審查 檢查 都是遞迴,效率還好,win release版本5700的樣本,length 1000的 str 大概0.2ms支援比如敏感...

敏感詞過濾

分享乙個敏感詞過濾方法 1 public class wordfiltercontroller basecontroller 225 result str result 2627 if s filters null 28 3132 bool check false 33 foreach string...

敏感詞過濾

function function buildtree words 子節點指標 val null,當前節點的字元,null表示根節點 back null,跳躍指標,也稱失敗指標 parent null,父節點指標,accept false 是否形成了乙個完整的詞彙,中間節點也可能為true make...