一、小談過濾算法
敏感詞過濾功能在很多地方都會用到,理論上在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解析等多個算法組成。
