新人小白過濾敏感詞方案


 

一、小談過濾算法

       敏感詞過濾功能在很多地方都會用到,理論上在Web應用中,只要涉及用戶輸入的地方,都需要進行文本校驗,如:XSS校驗、SQL注入檢驗、敏感詞過濾等。

 

       每一種過濾算法會都它的適用的地方。簡單的循環遍歷也有它的使用場景,如在SQL注入檢驗,使用List<string>集合,遍歷所有敏感詞,逐個檢測輸入的文本中是否含有指定的敏感SQL關鍵詞。

 

       在我知曉的過濾算法,檢驗速度越快,它的初始構造成本越大,如:

    循環遍歷 < Tried Tree < AC自動機 < ToolGood.Words < ToolGood.TextFilter

      

       防止初始構造過長,一般有兩種方案解決:1)單例模式,2)將構造后結構序列化后保存本地,第二次加載時直接讀取文件。

 

二、使用List<string>遍歷所有敏感詞

 1         public static bool Find(string test)
 2         {
 3             var txts = File.ReadAllLines("sensitiveWords.txt");
 4             foreach (var txt in txts) {
 5                 if (test.Contains(txt)) {
 6                     return true;
 7                 }
 8             }
 9             return false;
10         }

 

三、使用正則方式查尋敏感詞

 1         public static bool Find2(string test)
 2         {
 3             var txts = File.ReadAllLines("sensitiveWords.txt");
 4             StringBuilder stringBuilder = new StringBuilder();
 5             for (int i = 0; i < txts.Length; i++) {
 6                 if (stringBuilder.Length > 0) {
 7                     stringBuilder.Append("|");
 8                 }
 9                 var txt = txts[i].Replace(@"\", @"\").Replace(@"?", @"\?").Replace(@".", @"\.")
10                       .Replace(@"^", @"\^").Replace(@"$", @"\$")
11                       .Replace(@"*", @"\*").Replace(@"+", @"\+")
12                       .Replace(@"[", @"\[").Replace(@"]", @"\]")
13                       .Replace(@"(", @"\(").Replace(@")", @"\)")
14                       .Replace(@"{", @"\{").Replace(@"}", @"\}");
15                 stringBuilder.Append(txt);
16             }
17             txts = File.ReadAllLines("sensitiveWords_regex.txt");
18             for (int i = 0; i < txts.Length; i++) {
19                 if (stringBuilder.Length > 0) {
20                     stringBuilder.Append("|");
21                 }
22                 stringBuilder.Append(txts[i]);
23             }
24             return Regex.IsMatch(test, stringBuilder.ToString());
25         }

 

 

四、敏感詞過濾算法比較

       1)循環遍歷過濾算法,代碼十分簡單,能夠滿足要求小量敏感詞檢測。這個方案有一個很大的問題是,隨着敏感詞數量的增多,敏感詞檢測的時間會呈線性增長。如果項目中有成千上萬個敏感詞,使用這種方案就會很耗CPU了。

       2)正則表達式過濾算法,一個非常取巧的方法。熟練掌握正則,能在各種場景玩出花來,變體、重復詞、跳詞統統不在話下。但綜合速度比Tried Tree低很多。

       3)Tried Tree 網上最常見的算法。在敏感詞檢測方面效率很高。缺點不支持跳詞、不支持重復詞、不支持變種,想支持變種就得增加敏感詞匯。

       4)AC自動機是Tried Tree算法在文本匹配方面的優化算法。敏感詞檢測比Tried Tree算法更快,缺點繼承了Tried Tree,不支持跳詞、不支持重復詞、不支持變種。

       5)ToolGood.Words是一個算法合集,核心算法是在AC自動機基礎上優化。

    其中IllegalWordsSearch類更符合敏感詞過濾這種場景,支持全角轉半角,忽略大小寫,跳詞,重復詞。

    而WordsMatch類更像是AC自動機向正則表達式方面試探。

 

 

后記:

       下次介紹 Tried Tree 及 AC自動機。

 

ToolGood.Words 為開源項目,地址:https://github.com/toolgood/ToolGood.Words

ToolGood.TextFilter 為商業項目《ToolGood 內容審核系統》的核心算法,是一個綜合算法,由敏感詞檢測、NLP分詞排錯、多組敏感詞檢測,Html解析、Json解析等多個算法組成。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM