共计 1991 个字符,预计需要花费 5 分钟才能阅读完成。
导读 | DFA 即 Deterministic Finite Automaton,也就是确定有穷自动机,它是是通过 event 和当前的 state 得到下一个 state,即 event+state=nextstate。在实现敏感词过滤的算法中,我们必须要减少运算,而 DFA 在 DFA 算法中几乎没有什么计算,有的只是状态的转换。 |
敏感词、文字过滤是一个网站必不可少的功能,如何设计一个好的、高效的过滤算法是非常有必要的。
在实现文字过滤的算法中,DFA 是唯一比较好的实现算法。DFA 即 Deterministic Finite Automaton,也就是确定有穷自动机,它是是通过 event 和当前的 state 得到下一个 state,即 event+state=nextstate。在实现敏感词过滤的算法中,我们必须要减少运算,而 DFA 在 DFA 算法中几乎没有什么计算,有的只是状态的转换。
下面看下在 c# 方法下实现方式
1、构建敏感词库类
private bool LoadDictionary() | |
{var wordList = new List(); | |
if (_memoryLexicon == null) | |
{_memoryLexicon = new WordGroup[char.MaxValue]; | |
var words = new SensitiveWordBll().GetAllWords(); | |
if (words == null) | |
return false; | |
foreach (string word in words) | |
{wordList.Add(word); | |
var chineseWord = Microsoft.VisualBasic.Strings.StrConv(word, | |
Microsoft.VisualBasic.VbStrConv.TraditionalChinese, 0); | |
if (word != chineseWord) | |
wordList.Add(chineseWord); | |
} | |
foreach (var word in wordList) | |
{if (word.Length > 0) | |
{var group = _memoryLexicon[word[0]]; | |
if (group == null) | |
{group = new WordGroup(); | |
_memoryLexicon[word[0]] = group; | |
} | |
group.Add(word.Substring(1)); | |
} | |
} | |
} | |
return true; | |
} |
2、构建敏感词检测类
private bool Check(string blackWord) | |
{ | |
_wordlenght = 0; | |
// 检测源下一位游标 | |
_nextCursor = _cursor + 1; | |
var found = false; | |
var continueCheck = 0; | |
// 遍历词的每一位做匹配 | |
for (var i = 0; i = _sourceText.Length) | |
{ | |
if (i - 1 = 字符串长度 跳出 | |
if (_nextCursor + offset >= _sourceText.Length) | |
break; | |
_wordlenght++; | |
} | |
else break; | |
} | |
if (_nextCursor + offset >= _sourceText.Length) | |
{ | |
found = false; | |
break; | |
} | |
if (blackWord[i] == _sourceText[_nextCursor + offset]) | |
{ | |
found = true; | |
continueCheck = 0; | |
} | |
else | |
{ | |
// 匹配不到时尝试继续匹配 4 个字符 | |
if (continueCheck | |
3、测试与使用方法 | |
_illegalWords = new List(); | |
if (string.IsNullOrEmpty(sourceText) && string.IsNullOrEmpty(_sourceText)) | |
{return sourceText;} | |
if (!string.IsNullOrEmpty(sourceText)) | |
_sourceText = sourceText; | |
_cursor = 0; | |
if (!LoadDictionary()) | |
{return _sourceText;} | |
var tempString = _sourceText.ToCharArray(); | |
var sourceTextDbc = ToDBC(SourceText); | |
for (var i = 0; i 0) | |
ssx = ssx.Replace(word, "*".PadLeft(word.Length, '*')); | |
} | |
var datetime2x = DateTime.Now; | |
var millisecondx = (datetime2x - datetimex).TotalMilliseconds; | |
Console.WriteLine(millisecondx); | |
Console.WriteLine(ssx); | |
阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配 | |
腾讯云新客低至 82 元 / 年,老客户 99 元 / 年 | |
代金券:在阿里云专用满减优惠券 | |
正文完
星哥玩云-微信公众号
