实现 该 敏感词过滤 采用的是 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. LeetCode题解002:两数相加

    两数相加 题目 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字 如果,我们将这两个数相加起来,则会返回一个新的链表 ...

  2. Android框架Volley之:ImageRequest请求实现图片加载

    首先我们在项目中导入这个框架: implementation 'com.mcxiaoke.volley:library:1.0.19' 在AndroidManifest文件当中添加网络权限: < ...

  3. IDEA下新建Vue项目

    1.首先需要安装nodeJS,并配置全局环境变量. 2.在IDEA中新建一个空的project 3.在setting中配置JavaScript的语言版本为6 在file types的html中添加.* ...

  4. 彻底解决Python3写爬虫或网站时的乱码问题

    第一次写贴子,试试水 很多玩Python3的都会遇到编码问题,如果直接去处理未知编码的网页,不是Python内部编码格式utf8会出现乱码,下面介绍一种将未知编码的字串转换为utf8来避免乱码的方法, ...

  5. Centos7安装配置----1配置网络

    1.下载镜像安装,选择的是最小安装,设置root用户密码 (此处省略其中步骤,直到安装成功) 2.安装完成后重启,输入用户名密码进入系统 由于此时未配置网络,所以网卡什么的均未获取ip联网 输入ip ...

  6. Linux:路径的概念及路径的切换

    路径分为绝对路径和相对路径 绝对路径:从/根开头的路径为绝对路径 相对路径:以当前目录为开头的为相对路径 根目录:/ 家目录:普通用户的家目录在/home下,root用户的家目录是/root 切换目录 ...

  7. 苏州市java岗位的薪资状况(1)

    8月份已经正式离职,这两个月主要在做新书校对工作.9月份陆续投了几份简历,参加了两次半面试,第一次是家做办公自动化的公司,开的薪水和招聘信息严重不符,感觉实在是在浪费时间,你说你给不了那么多为什还往上 ...

  8. python 连接oracle -- sqlalchemy及cx_Oracle的使用详解

    python连接oracle -- sqlalchemy import cx_Oracle as orcl import pandas as pd from sqlalchemy import cre ...

  9. Vue 使用lodash库减少watch对后台请求压力

    lodash需要新引入 我使用的是npm方式 使用lodash的_.debounce方法 具体代码: <!doctype html> <html lang="en" ...

  10. Linux添加组播

    sudo route add -net 224.1.1.0 netmask 255.255.255.0 dev ens33