DFA在C#中的实现:过滤敏感词
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 < blackWord.Length; i++) { //特殊字符偏移游标 var offset = 0; if (_nextCursor >= _sourceText.Length) { if (i - 1 < blackWord.Length - 1) found = false; break; } else { //检测下位字符如果不是汉字 数字 字符 偏移量加1 for (var y = _nextCursor; y < _sourceText.Length; y++) { if (!IsChs(_sourceText[y]) && !IsNum(_sourceText[y]) && !IsAlphabet(_sourceText[y])) { offset++; //避让特殊字符,下位游标如果>=字符串长度 跳出 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 < 4 && _nextCursor < _sourceText.Length - 1) { continueCheck++; i--; } else { found = false; break; } } } _nextCursor = _nextCursor + 1 + offset; _wordlenght++; } return found; } }
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 < SourceText.Length; i++) { //查询以该字为首字符的词组 var group = _memoryLexicon[sourceTextDbc[i]]; if (group != null) { for (var z = 0; z < group.Count(); z++) { string word = group.GetWord(z); if (word.Length == 0 || Check(word)) { if (isFirstCheckedReturn) { return null; } var blackword = string.Empty; for (var pos = 0; pos < _wordlenght + 1; pos++) { blackword += tempString[pos + _cursor].ToString(); tempString[pos + _cursor] = ReplaceChar; } _illegalWords.Add(blackword); _cursor = _cursor + _wordlenght; i = i + _wordlenght; break; } } } _cursor++; } return new string(tempString); var filter = new SensitiveWordFilter(); filter.SourceText = "dddddd"; var sourctText = filter.SourceText; filter.ResetMemoryLexicon(); var datetime = DateTime.Now; var ss = filter.Filter(); var datetime2 = DateTime.Now; var millisecond = (datetime2 - datetime).TotalMilliseconds; Console.WriteLine(millisecond); Console.WriteLine(ss); var words = System.IO.File.ReadAllLines(@"D:\Recv\敏感词库大全.txt", System.Text.Encoding.UTF8); var ssx = sourctText; var datetimex = DateTime.Now; foreach (var word in words) { if (word.Length > 0) ssx = ssx.Replace(word, "*".PadLeft(word.Length, '*')); } var datetime2x = DateTime.Now; var millisecondx = (datetime2x - datetimex).TotalMilliseconds; Console.WriteLine(millisecondx); Console.WriteLine(ssx);
DFA在C#中的实现:过滤敏感词相关推荐
- C#过滤敏感词DFA算法
今天游戏正好用到需要过滤敏感词将出现的敏感词替换成*,在网上找了许久找了一片可用的java版本的DFA算法,最后费了一番功夫将其思路用C#实现,里面的注释甚至都没改动的,这里直接上代码,这里不借助任何 ...
- python过滤敏感词记录
简述: 关于敏感词过滤可以看成是一种文本反垃圾算法,例如 题目:敏感词文本文件 filtered_words.txt,当用户输入敏感词语,则用 星号 * 替换,例如当用户输入「北京是个好城市」,则变成 ...
- php过滤敏感词实例代码
php过滤敏感词实例代码 <?php /** * Created by JetBrains PhpStorm. * User: lsl * Date: 13-8-28 ...
- flex java 全局拦截_flex + java 过滤敏感词
过滤敏感词这个相对比较容易做到,网上也很多方法,看得比较多的一个方法就是:把所有的敏感词写入到一个properties文件中,程序启动时拼成一个正则表达式.这个也只是比较基础的敏感词过滤器,比较强大的 ...
- python过滤敏感词汇_利用Python正则表达式过滤敏感词的方法
利用Python正则表达式过滤敏感词的方法 问题描述:很多网站会对用户发帖内容进行一定的检查,并自动把敏感词修改为特定的字符. 技术要点: 1)Python正则表达式模块re的sub()函数: 2)在 ...
- ios 弹幕过滤敏感词方案对比和性能测试
在看视频的过程中, 很多用户会发弹幕, 当前用户可以设置过滤敏感词和敏感用户, 设置后, 命中敏感词和敏感用户的弹幕就不会显示. 敏感词和敏感用户的设置上限为各100. 由客户端进行过滤, 不区分大 ...
- php敏感字符串过滤_PHP的一个过滤敏感词或脏话的方法
PHP的一个过滤敏感词或脏话的方法 主要使用了 int substr_count ( string haystack, string needle [, int offset [, int leng ...
- 第三章:过滤敏感词、帖子管理
过滤敏感词 根节点没有字符,到最末节点拼起来才是敏感字符,做一个标记在最后. 过滤符号 /* * 过滤敏感词 * 参数:待过滤的文本, 返回过滤后的文本 * */ public String filt ...
- SpringBoot使用前缀树过滤敏感词
前缀树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利 ...
- 使用数据结构过滤敏感词算法
前缀树 名称:Tire.字典树.查找树 特点:查找效率高,消耗内存大 应用:字符串检索.词频统计.字符串排序等 敏感词过滤器 定义前缀树 package com.nowcoder.community. ...
最新文章
- HDU 4708 Rotation Lock Puzzle(模拟)
- Leetcode1712. 将数组分成三个子数组的方案数[C++题解]:双指针和前缀和
- 3_4 IteratorMode 迭代器模式
- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations
- Minidao_1.6.1版本发布,超轻量Java持久化框架
- java数学系统总结与展望_总结与展望
- babel import语法 js_webstorm配置babel自动转译es6的两种方法
- python 移动文件 覆盖_Python操作文件(删除、复制、移动...)
- python-网络编程-tcp/ip认识(一)
- 51单片机c语言实训报告总结,单片机实训心得体会
- SQL Server添加Northwind数据库
- QQ互联官网使用跳坑
- Android-组件化开发
- R语言面积图 area chart
- 密码键盘介绍二:主密钥和工作密钥的导入
- 桂林理工大学 程序设计实践课程 实习报告
- Parallels Desktop v17.1.1 网络初始化失败
- 【分享】pushplus入驻集简云平台,实现无代码集成数百款应用
- 编译原理 —— 逆波兰式
- Android 停车地图及停车导航,停车场蓝牙定位导航方案
热门文章
- python高阶函数(abs()、round()、map()、reduce()、filter())
- ACMNO.14一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 保留两位小数 输入 M N 输出 它在第N次落地时反弹多高?共经过多少米
- 什么是 Canny 边缘检测算法?
- 基于OpenCV实战:车牌检测
- 【新手必看】17个常见的Python运行时错误
- 用于半监督语义分割的基于掩码的数据增强
- 栈与队列9——最大值减去最小值小于或等于num的子数组的数量
- 4K P60 444 相关的事
- Linux 内核源代码分析 chap 2 存储管理 (5)
- python面向对象编程 -- 封装、继承