C# 屏蔽词过滤
参考:https://www.cnblogs.com/kubidemanong/p/10834993.html
public class TreeNode
{
public char Char;
public bool IsEnd;
public int WordEndAt;
private Dictionary<char, TreeNode> NodeDict;
public TreeNode(char c)
{
Char = c;
IsEnd = false;
NodeDict = new Dictionary<char, TreeNode>();
} public bool ContainChar(char ch)
{
return NodeDict.ContainsKey(ch);
} public TreeNode GetChild(char c)
{
TreeNode Child = null;
NodeDict.TryGetValue(c, out Child);
return Child;
} public TreeNode AddNode(char ch)
{
TreeNode insertNode = null;
if (!NodeDict.TryGetValue(ch, out insertNode))
{
insertNode = new TreeNode(ch);
NodeDict.Add(ch, insertNode);
}
return insertNode;
}
}
public class Trie
{ public TreeNode Root { get; }
private HashSet<char> SkipCharSet; //忽略字符
private HashSet<char> SeparateCharSet; //常见分隔符
private string skipCharList = " `-=[]\\',.·/~!@#$%^&*()_+{}|:\"<>?*\r\n";
private TreeNode checkNode;
private TreeNode backupNode;
private char duplicateChar;
public Trie()
{
Root = new TreeNode(' ');
SkipCharSet = new HashSet<char>();
SeparateCharSet = new HashSet<char>();
foreach (char c in skipCharList)
{
SkipCharSet.Add(c);
SeparateCharSet.Add(c);
}
} public void AddNode(TreeNode node, string word)
{
if (word.Length > 0)
{
char ch = word[0];
TreeNode insertNode = node.AddNode(ch);
if (word.Length == 1)
{
insertNode.IsEnd = true;
}
word = word.Remove(0,1);
AddNode(insertNode, word);
}
} private bool IsSkipChar(char c)
{
return SkipCharSet.Contains(c);
} //是否是英文
private bool IsEnglishChar(char ch)
{
string str = new string(ch, 1);
Regex regEnglish = new Regex("^[a-zA-Z]");
return regEnglish.IsMatch(str);
} //是否是分割符
private bool Separator(char ch)
{
return SeparateCharSet.Contains(ch);
} //是否是单词的开头
private bool IsWordBegin(string word,int pos)
{
if (pos == 0)
return true;
if (pos < word.Length)
{
char c1 = word[pos - 1];
char c2 = word[pos];
return (Separator(c1) && !Separator(c2)) || (!IsEnglishChar(c1) && IsEnglishChar(c2));
}
return false;
} //是否是单词的结尾
private bool IsWordEnd(string word,int pos)
{
if (pos == word.Length - 1)
return true;
if(pos < word.Length)
{
char c1 = word[pos];
char c2 = word[pos + 1];
return (!Separator(c1) && Separator(c2)) || (IsEnglishChar(c1) && !IsEnglishChar(c2));
}
return false;
} private void CheckWord(string checkWord,int begin)
{
int index = begin;
while(index + 1 < checkWord.Length)
{
++index;
char ch = checkWord[index];
if (IsSkipChar(ch))
{
if (checkNode.ContainChar(ch))
checkNode = checkNode.GetChild(ch);
}
else
{
if(checkNode.ContainChar(ch))
{
checkNode = checkNode.GetChild(ch);
if(checkNode.IsEnd)
{
checkNode.WordEndAt = index;
backupNode = checkNode;
duplicateChar = ch;
CheckWord(checkWord,index); //继续匹配
break;
}
}
else
{
if (duplicateChar == ch) //屏蔽fuccccccck例如这样的
backupNode.WordEndAt = index;
else
break;
}
}
duplicateChar = ch;
}
} public string Filter(string filterWord)
{
int begin = 0;
checkNode = null;
backupNode = null;
duplicateChar = ' ';
string word = filterWord.ToLower();
StringBuilder result = new StringBuilder(filterWord);
while(begin < word.Length)
{
checkNode = Root;
backupNode = Root;
char ch = word[begin];
duplicateChar = ch;
//设置是否严格匹配, 即逐个字符检测是否有可能是敏感词,否则像英语一样只检测单词,
//严格匹配: [av]是敏感词,那么[avoid]被替换成[**oid]
bool isStrict = !IsEnglishChar(ch);
bool isWordBegin = isStrict || IsWordBegin(word, begin);
if(isWordBegin && checkNode.ContainChar(ch))
{
checkNode = checkNode.GetChild(ch);
if(!IsSkipChar(ch))
{
CheckWord(word, begin);
if(backupNode.IsEnd && backupNode.WordEndAt > 0)
{
bool isWordEnd = isStrict || IsWordEnd(word, backupNode.WordEndAt); //到单词末尾才行 have 中有av 但是不是末尾 所以不是屏蔽词
if(isWordEnd)
{
for(int i = begin; i <= backupNode.WordEndAt;++i)
{
result[i] = '*';
}
begin = backupNode.WordEndAt;
}
}
}
}
++begin;
} return result.ToString();
}
}
测试用例:
class Program
{
static void Main(string[] args)
{
Trie trie = new Trie();
trie.AddNode(trie.Root, "fuc");
trie.AddNode(trie.Root, "fuc bitch");
trie.AddNode(trie.Root, "fuck");
trie.AddNode(trie.Root, "bitch");
trie.AddNode(trie.Root, "屠杀");
Console.WriteLine(trie.Filter("是哦fuckkkkkk山大的撒bi\tch"));
Console.WriteLine(trie.Filter("have world fuc bitch"));
Console.WriteLine(trie.Filter("1218fuck1")); Console.ReadKey();
}
}
结果:

C# 屏蔽词过滤的更多相关文章
- Java实现敏感词过滤 - IKAnalyzer中文分词工具
IKAnalyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包. 官网: https://code.google.com/archive/p/ik-analyzer/ 本用例借助 I ...
- Java实现敏感词过滤 - DFA算法
Java实现DFA算法进行敏感词过滤 封装工具类如下: 使用前需对敏感词库进行初始化: SensitiveWordUtil.init(sensitiveWordSet); package cn.swf ...
- [原创] Trie树 php 实现敏感词过滤
目录 背景 简介 存储结构 PHP 其他语言 字符串分割 示例代码 php 优化 缓存字典树 常驻服务 参考文章 背景 项目中需要过滤用户发送的聊天文本, 由于敏感词有将近2W条, 如果用 str_r ...
- [python每日一练]--0012:敏感词过滤 type2
题目链接:https://github.com/Show-Me-the-Code/show-me-the-code代码github链接:https://github.com/wjsaya/python ...
- 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 鏖战双十一-阿里直播平台面临的 ...
随机推荐
- 函数记录CAM
UF_PARAM_generate 生成刀轨 UF_PARAM_duplicate 此函数创建与"old_obj_tag"类型相同的新对象.它使用'old_obj_tag'数据初 ...
- Micro-OA系统
Micro-OA简单描述 MicroOA是一款不需要专业的开发知识或开发经验,通过页面交互式即可实现动态搭建表单的微型办公自动化系统.在日常工作当中,我们面临着各种各样的表单,在开发系统时,若我们采用 ...
- 把excel表中的数据导入到mysql数据库中
1.把excel表结构转化为csv,在把csv后缀改为txt文件,把txt文件另存为,把字符集编码转化成utf-8,在把txt文件转化为csv文件 注意:需要导入的数据表格头的名字要和数据库的字段名一 ...
- 前台主页功能-前台轮播图功能完成-git介绍和安装-git使用流程-git常用命令-git忽略文件
目录 前台主页功能-前台轮播图功能完成-git介绍和安装-git使用流程-git常用命令-git忽略文件 昨日内容回顾 今日内容概要 今日内容详细 0 导出项目依赖 0 学长问题解析 1 前台主页功能 ...
- 哲讯科技SAP医疗器械行业ERP解决方案
哲讯科技SAP医疗器械行业ERP解决方案主要体现在以预测为指导,计划为执行的管理理念,完全做到实时的全过程的质量管理和质量跟踪.并且通过灵活的质量管理模块大大降低因实施GMP管理给企业带来的成本压力. ...
- js处理url插件库query-string
http://www.wjhsh.net/smile-fanyin-p-15016684.html
- js实现数字每三位加逗号
需求: 一个数字,比如 1234,23456.23 实现每三位加逗号 改成如下形式: 1234 => 1,234 23456.23 => 23,456.23 方法一 function fo ...
- CentOS8安装pycharm报错【Can't connect to X11 window server using ':0' as the value of the DISPLAY variable. 】
在CentOS8 安装pycharm报出如下错误,原来是自己画蛇添足的用sudo执行pycharm.sh,没有按照Install说明里边的直接执行 ./pycharm.sh. 原因见这里:https: ...
- 阿里云centos7安装图形界面gnome
这应该是很无聊很蛇精的操作吧. 首先命令行远程登陆阿里云,然后root身份更新系统,安装gnome这些操作(菜如我以前都没有操作过),参照网上虚拟机的教程. # yum update -y # yum ...
- python34
Python成员运算符 除了以上的一些运算符之外,Python还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组. 运算符 描述 实例 in 如果在指定的序列中找到值返回 True ...