C# 实现敏感词过滤
实现 该 敏感词过滤 采用的是 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# 实现敏感词过滤的更多相关文章
- java实现敏感词过滤(DFA算法)
小Alan在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和大家分享一下自己的理解. 敏感词过滤应该是不用给大家过多的解释吧?讲白了就是你在项目中输入某些字(比如输入xxo ...
- 用php实现一个敏感词过滤功能
周末空余时间撸了一个敏感词过滤功能,下边记录下实现过程. 敏感词,一方面是你懂的,另一方面是我们自己可能也要过滤一些人身攻击或者广告信息等,具体词库可以google下,有很多. 过滤敏感词,使用简单的 ...
- 浅析敏感词过滤算法(C++)
为了提高查找效率,这里将敏感词用树形结构存储,每个节点有一个map成员,其映射关系为一个string对应一个TreeNode. STL::map是按照operator<比较判断元素是否相同,以及 ...
- Java实现敏感词过滤
敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...
- php敏感词过滤
在项目开发中发现有个同事在做敏感词过滤的时候用循环在判断,其实是不用这样做的,用php的数组函数和字符串函数即可实现 function filterNGWords($string) { $badwor ...
- 转:鏖战双十一-阿里直播平台面临的技术挑战(webSocket, 敏感词过滤等很不错)
转自:http://www.infoq.com/cn/articles/alibaba-broadcast-platform-technology-challenges 鏖战双十一-阿里直播平台面临的 ...
- java敏感词过滤
敏感词过滤在网站开发必不可少.一般用DFA,这种比较好的算法实现的. 参考链接:http://cmsblogs.com/?p=1031 一个比较好的代码实现: import java.io.IOExc ...
- Java实现敏感词过滤(转)
敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...
- DFA和trie特里实现敏感词过滤(python和c语言)
今天的项目是与完成python开展,需要使用做关键词检查,筛选分类,使用前c语言做这种事情.有了线索,非常高效,内存小了,检查快. 到达python在,第一个想法是pip基于外观的c语言python特 ...
- Jsp敏感词过滤
Jsp敏感词过滤 大部分论坛.网站等,为了方便管理,都进行了关于敏感词的设定. 在多数网站,敏感词一般是指带有敏感政治倾向(或反执政党倾向).暴力倾向.不健康色彩的词或不文明语,也有一些网站根据自身实 ...
随机推荐
- MySQL学习——数据类型
MySQL学习——数据类型 摘要:本文主要学习了MySQL数据库的数据类型. 整数类型 MySQL主要提供的整数类型有tinyint.smallint.mediumint.int.bigint,其属性 ...
- 高强度学习训练第十三天总结:使用Netty实现一个http服务器
Netty入门 Netty的重要性不言而喻.那么今天就来学习一下Netty. 整个项目基于Gradle搭建. Build如下所示: plugins { id 'java' } group 'cn.ba ...
- JS基础语法---do-while循环 + 总结while循环和do-while循环
1. 总结:while循环和do-while循环 while循环特点:先判断,后循环,有可能一次循环体都不执行 do-while循环特点:先循环,后判断,至少执行一次循环体 对比体会: 1. ...
- Linux常见目录说明
常见目录说明 目录 应放置档案内容 /bin/ 存放二进制可执行文件,系统的命令(ls,cat,mkdir等),是/usr/bin/目录的软链接. /sbin/ 存放系统命令,超级用户可以执行.是/u ...
- 爬虫---Beautiful Soup 初始
我们在工作中,都会听说过爬虫,那么什么是爬虫呢? 什么是网络爬虫 爬虫基本原理 所谓网络爬虫就是一个自动化数据采集工具,你只要告诉它要采集哪些数据,丢给它一个 URL,就能自动地抓取数据了.其背后的基 ...
- 1.Python网络编程_UDP(简略版)
# -*- coding: utf-8 -*- #2019-11-24 import socket def recv(): udp_socket=socket.socket(socket.AF_INE ...
- DRF视图功能介绍(2)
本帖最后由 杰哥,我就服你 于 2018-12-20 13:22 编辑 Django rest framework(DRF) D:是一个用于构建Web API强大又灵活的框架,基于Django框架二次 ...
- leetcode 树类问题
208. Implement Trie (Prefix Tree) 子节点个数对应的是数组
- MongoDB概念认识(四)
1. database 一个mongodb中可以建立多个数据库. MongoDB的默认数据库为"db",该数据库存储在data目录中. MongoDB的单个实例可以容纳多个独立的数 ...
- 《从HBase offheap到Netty的内存管理》
JVM中的堆外内存(off-heap memory)与堆内内存(on-heap memory) 1. 堆内内存(on-heap memory) 1.1 什么是堆内内存 Java 虚拟机在执行Jav ...