新人小白过滤敏感词方案
一、小談過濾算法
敏感詞過濾功能在很多地方都會用到,理論上在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解析等多個算法組成。
總結
以上是生活随笔為你收集整理的新人小白过滤敏感词方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: delphi 金额大小写转换函数
- 下一篇: teatime、