实现 该 敏感词过滤 采用的是 DFA算法,参考文章:https://blog.csdn.net/chenssy/article/details/26961957

  具体 实现 步骤 如下:

  第一步,构建 敏感词库(WordsLibrary)  类:

using System.Collections.Generic;
using System.Linq;
using System; namespace ContentSafe.SensitiveWord
{
/// <summary>
/// 敏感词库
/// </summary>
public class WordsLibrary
{
/// <summary>
/// 词库树结构类
/// </summary>
public class ItemTree
{
public char Item { get; set; }
public bool IsEnd { get; set; }
public List<ItemTree> Child { get; set; }
} /// <summary>
/// 词库树
/// </summary>
public ItemTree Library { get; private set; } /// <summary>
/// 敏感词组
/// </summary>
public string[] Words { get; protected set; } /// <summary>
/// 敏感词库
/// </summary>
public WordsLibrary()
{
LoadWords();
Init();
} /// <summary>
/// 敏感词库
/// </summary>
/// <param name="words">敏感词组</param>
public WordsLibrary(string[] words) : this()
{
Words = words;
} /// <summary>
/// 加载 敏感词组,可被重写以自定义 如何加载 敏感词组
/// </summary>
public virtual void LoadWords()
{
} /// <summary>
/// 词库初始化
/// </summary>
private void Init()
{
if (Words == null)
Words = new[] { "" }; Library = new ItemTree() { Item = 'R', IsEnd = false, Child = CreateTree(Words) };
} /// <summary>
/// 创建词库树
/// </summary>
/// <param name="words">敏感词组</param>
/// <returns></returns>
private List<ItemTree> CreateTree(string[] words)
{
List<ItemTree> tree = null; if (words != null && words.Length > )
{
tree = new List<ItemTree>(); foreach (var item in words)
if (!string.IsNullOrEmpty(item))
{
char cha = item[]; ItemTree node = tree.Find(e => e.Item == cha);
if (node != null)
AddChildTree(node, item);
else
tree.Add(CreateSingleTree(item));
}
} return tree;
} /// <summary>
/// 创建单个完整树
/// </summary>
/// <param name="word">单个敏感词</param>
/// <returns></returns>
private ItemTree CreateSingleTree(string word)
{
//根节点,此节点 值为空
ItemTree root = new ItemTree();
//移动 游标
ItemTree p = root; for (int i = ; i < word.Length; i++)
{
ItemTree child = new ItemTree() { Item = word[i], IsEnd = false, Child = null };
p.Child = new List<ItemTree>() { child };
p = child;
}
p.IsEnd = true; return root.Child.First();
} /// <summary>
/// 附加分支子树
/// </summary>
/// <param name="childTree">子树</param>
/// <param name="word">单个敏感词</param>
private void AddChildTree(ItemTree childTree, string word)
{
//移动 游标
ItemTree p = childTree; for (int i = ; i < word.Length; i++)
{
char cha = word[i];
List<ItemTree> child = p.Child; if (child == null)
{
ItemTree node = new ItemTree() { Item = cha, IsEnd = false, Child = null };
p.Child = new List<ItemTree>() { node };
p = node;
}
else
{
ItemTree node = child.Find(e => e.Item == cha);
if (node == null)
{
node = new ItemTree() { Item = cha, IsEnd = false, Child = null };
child.Add(node);
p = node;
}
else
p = node;
}
}
p.IsEnd = true;
}
}
}

  第二步,构建 敏感词检测(ContentCheck) 类:

using System.Collections.Generic;
using System.Linq;
using System; namespace ContentSafe.SensitiveWord
{
/// <summary>
/// 敏感词检测
/// </summary>
public class ContentCheck
{
/// <summary>
/// 检测文本
/// </summary>
public string Text { private get; set; } /// <summary>
/// 敏感词库 词树
/// </summary>
public WordsLibrary.ItemTree Library { private get; set; } /// <summary>
/// 敏感词检测
/// </summary>
public ContentCheck() { } /// <summary>
/// 敏感词检测
/// </summary>
/// <param name="library">敏感词库</param>
public ContentCheck(WordsLibrary library)
{
if (library.Library == null)
throw new Exception("敏感词库未初始化"); Library = library.Library;
} /// <summary>
/// 敏感词检测
/// </summary>
/// <param name="library">敏感词库</param>
/// <param name="text">检测文本</param>
public ContentCheck(WordsLibrary library, string text) : this(library)
{
if (text == null)
throw new Exception("检测文本不能为null"); Text = text;
} /// <summary>
/// 检测敏感词
/// </summary>
/// <param name="text">检测文本</param>
/// <returns></returns>
private Dictionary<int, char> WordsCheck(string text)
{
if (Library == null)
throw new Exception("未设置敏感词库 词树"); Dictionary<int, char> dic = new Dictionary<int, char>();
WordsLibrary.ItemTree p = Library;
List<int> indexs = new List<int>(); for (int i = , j = ; j < text.Length; j++)
{
char cha = text[j];
var child = p.Child; var node = child.Find(e => e.Item == cha);
if (node != null)
{
indexs.Add(j);
if (node.IsEnd || node.Child == null)
{
if (node.Child != null)
{
int k = j + ;
if (k < text.Length && node.Child.Exists(e => e.Item == text[k]))
{
p = node;
continue;
}
} foreach (var item in indexs)
dic.Add(item, text[item]); indexs.Clear();
p = Library;
i = j;
++i;
}
else
p = node;
}
else
{
indexs.Clear();
if (p.GetHashCode() != Library.GetHashCode())
{
++i;
j = i;
p = Library;
}
else
i = j;
}
} return dic;
} /// <summary>
/// 替换敏感词
/// </summary>
/// <param name="library">敏感词库</param>
/// <param name="text">检测文本</param>
/// <param name="newChar">替换字符</param>
/// <returns></returns>
public static string SensitiveWordsReplace(WordsLibrary library, string text, char newChar = '*')
{
Dictionary<int, char> dic = new ContentCheck(library).WordsCheck(text);
if (dic != null && dic.Keys.Count > )
{
char[] chars = text.ToCharArray();
foreach (var item in dic)
chars[item.Key] = newChar; text = new string(chars);
} return text;
} /// <summary>
/// 替换敏感词
/// </summary>
/// <param name="text">检测文本</param>
/// <param name="newChar">替换字符</param>
/// <returns></returns>
public string SensitiveWordsReplace(string text, char newChar = '*')
{
Dictionary<int, char> dic = WordsCheck(text);
if (dic != null && dic.Keys.Count > )
{
char[] chars = text.ToCharArray();
foreach (var item in dic)
chars[item.Key] = newChar; text = new string(chars);
} return text;
} /// <summary>
/// 替换敏感词
/// </summary>
/// <param name="newChar">替换字符</param>
/// <returns></returns>
public string SensitiveWordsReplace(char newChar = '*')
{
if (Text == null)
throw new Exception("未设置检测文本"); return SensitiveWordsReplace(Text, newChar);
} /// <summary>
/// 查找敏感词
/// </summary>
/// <param name="library">敏感词库</param>
/// <param name="text">检测文本</param>
/// <returns></returns>
public static List<string> FindSensitiveWords(WordsLibrary library, string text)
{
ContentCheck check = new ContentCheck(library, text);
return check.FindSensitiveWords();
} /// <summary>
/// 查找敏感词
/// </summary>
/// <param name="text">检测文本</param>
/// <returns></returns>
public List<string> FindSensitiveWords(string text)
{
Dictionary<int, char> dic = WordsCheck(text);
if (dic != null && dic.Keys.Count > )
{
int i = -;
string str = "";
List<string> list = new List<string>();
foreach(var item in dic)
{
if (i == - || i + == item.Key)
str += item.Value;
else
{
list.Add(str);
str = "" + item.Value;
} i = item.Key;
}
list.Add(str); return list.Distinct().ToList();
}
else
return null;
} /// <summary>
/// 查找敏感词
/// </summary>
/// <returns></returns>
public List<string> FindSensitiveWords()
{
if (Text == null)
throw new Exception("未设置检测文本"); return FindSensitiveWords(Text);
}
}
}

  第三步,测试与使用方法:

string[] words = new[] { "敏感词1", "敏感词2", "含有", "垃圾" }; //敏感词组 可自行在网上 搜索下载

//敏感词库 类可被继承,如果想实现自定义 敏感词导入方法 可以 对 LoadWords 方法进行 重写
var library = new WordsLibrary(words); //实例化 敏感词库 string text = "在任意一个文本中都可能包含敏感词1、2、3等等,只要含有敏感词都会被找出来,比如:垃圾";
ContentCheck check = new ContentCheck(library, text); //实例化 内容检测类
var list = check.FindSensitiveWords(); //调用 查找敏感词方法 返回敏感词列表
var str = check.SensitiveWordsReplace(); //调用 敏感词替换方法 返回处理过的字符串

  该 实现方案 不止 这个 使用方法,更多使用方法 可自行 研究

C# 实现敏感词过滤的更多相关文章

  1. java实现敏感词过滤(DFA算法)

    小Alan在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和大家分享一下自己的理解. 敏感词过滤应该是不用给大家过多的解释吧?讲白了就是你在项目中输入某些字(比如输入xxo ...

  2. 用php实现一个敏感词过滤功能

    周末空余时间撸了一个敏感词过滤功能,下边记录下实现过程. 敏感词,一方面是你懂的,另一方面是我们自己可能也要过滤一些人身攻击或者广告信息等,具体词库可以google下,有很多. 过滤敏感词,使用简单的 ...

  3. 浅析敏感词过滤算法(C++)

    为了提高查找效率,这里将敏感词用树形结构存储,每个节点有一个map成员,其映射关系为一个string对应一个TreeNode. STL::map是按照operator<比较判断元素是否相同,以及 ...

  4. Java实现敏感词过滤

    敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...

  5. php敏感词过滤

    在项目开发中发现有个同事在做敏感词过滤的时候用循环在判断,其实是不用这样做的,用php的数组函数和字符串函数即可实现 function filterNGWords($string) { $badwor ...

  6. 转:鏖战双十一-阿里直播平台面临的技术挑战(webSocket, 敏感词过滤等很不错)

    转自:http://www.infoq.com/cn/articles/alibaba-broadcast-platform-technology-challenges 鏖战双十一-阿里直播平台面临的 ...

  7. java敏感词过滤

    敏感词过滤在网站开发必不可少.一般用DFA,这种比较好的算法实现的. 参考链接:http://cmsblogs.com/?p=1031 一个比较好的代码实现: import java.io.IOExc ...

  8. Java实现敏感词过滤(转)

    敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...

  9. DFA和trie特里实现敏感词过滤(python和c语言)

    今天的项目是与完成python开展,需要使用做关键词检查,筛选分类,使用前c语言做这种事情.有了线索,非常高效,内存小了,检查快. 到达python在,第一个想法是pip基于外观的c语言python特 ...

  10. Jsp敏感词过滤

    Jsp敏感词过滤 大部分论坛.网站等,为了方便管理,都进行了关于敏感词的设定. 在多数网站,敏感词一般是指带有敏感政治倾向(或反执政党倾向).暴力倾向.不健康色彩的词或不文明语,也有一些网站根据自身实 ...

随机推荐

  1. The method newInstance() from the type Class is deprecated since version 9

    newInstance()在 java9中已被弃用 JAVA9之前用法 Class.forName("类的全限定名").newInstance(); JAVA9之后用法 Class ...

  2. 高强度学习训练第十一天总结:Class文件结构(二)

    常量池 可以理解为Class文件之中的资源仓库,他是Class文件结构中与其他项目关联最多的数据类型,也是占用Class文件空间最大的数据项目之一 访问标志 在常量池结束后,紧接着的俩个字节代表访问标 ...

  3. CarTool 使用,获取图片资源

    程序:gitHub: 项目地址 使用方法: 1.拿到资源包 在itunes里找到喜欢的应用,然后下载,直接将app拖到桌面.得到一个一个ipa资源包,如图 2.将资源包改成zip格式 3.解压zip资 ...

  4. BayaiM__MySQL 常用函数

    BayaiM__MySQL 常用函数 原创 作者:bayaim 时间:2016-06-16 09:11:13 122 0删除编辑  MySQL 常用函数 阅读(883430) | 评论(44543) ...

  5. Python—实现ssh客户端(连接远程服务器)

    paramiko是一个基于SSH用于连接远程服务器并执行相关操作(SSHClient和SFTPClinet,即一个是远程连接,一个是上传下载服务),使用该模块可以对远程服务器进行命令或文件操作,值得一 ...

  6. apicloud如何实现优雅的下拉刷新与加载更多

    apicloud中提供下拉刷新监听事件api,也提供滚动到底部事件的监听,能够实现下拉刷新和滚动到底部加载更多功能,但是我们真的就满足实现功能了吗?将两个代码拼凑起来运行看看发现了什么?是的,在滚动到 ...

  7. [PHP] PDO对象与mysql的连接超时

    在php中每一个new的PDO对象,都会去连接mysql,都会创建一条tcp连接.当pdo对象赋予的变量是一个的时候,那么他只会保持一个tcp连接,没有被引用的对象连接会直接断掉.如果不对这个对象进行 ...

  8. JDK、JVM、JRE关系

    开始第一个Java程序 *保证计算机当中已经安装了文本编辑器EditPlus *安装JDK[JDK一般需要从oracle的官网下载],我们这里先用的JDK7 *在安装JDK的时候有jre JDK开发需 ...

  9. 无法添加符号: 归档没有索引;运行 ranlib 以添加一个

    这将告诉您对象文件的格式.如果对象文件是针对不同的平台编译的,则会导致无法为存档创建索引.要纠正这种情况,您需要重新编译这些文件.

  10. 3、zabbix组件之间的关系

    我们在安装zabbix的时候安装了四个软件:zabbix-server.zabbix-server-mysql.zabbix-web-mysql.zabbix-agent,那么这个四个软件之间有什么关 ...