.NET实现高效过滤敏感查找树算法(分词算法):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace YY.SmsPlatform.Common
{
[Serializable]
public class TrieNode
{
public bool m_end;
public Dictionary<Char, TrieNode> m_values;
public TrieNode()
{
m_values = new Dictionary<Char, TrieNode>();
} /// <summary>
/// 添加词库
/// </summary>
/// <param name="key"></param>
public void AddKey(string key)
{
if (string.IsNullOrEmpty(key))
{
return;
}
TrieNode node = this;
for (int i = ; i < key.Length; i++)
{
char c = key[i];
TrieNode subnode;
if (!node.m_values.TryGetValue(c, out subnode))
{
subnode = new TrieNode();
node.m_values.Add(c, subnode);
}
node = subnode;
}
node.m_end = true;
}
} /// <summary>
///
/// </summary>
[Serializable]//注解部分可不加,和本算法没有关系
public class TrieFilter
{ /// <summary>
/// 检查是否包含非法字符
/// </summary>
/// <param name="text">输入文本</param>
/// <returns>找到返回true.没有则返回false</returns>
//public bool HasBadWord(string text)
//{
// for (int i = 0; i < text.Length; i++)
// {
// TrieNode node;
// if (m_values.TryGetValue(text[i], out node))
// {
// for (int j = i + 1; j < text.Length; j++)
// {
// if (node.m_values.TryGetValue(text[j], out node))
// {
// if (node.m_end)
// {
// return true;
// }
// }
// else
// {
// break;
// }
// }
// }
// }
// return false;
//}
/// <summary>
/// 检查是否包含非法字符
/// </summary>
/// <param name="text">输入文本</param>
/// <returns>找到的第1个非法字符.没有则返回string.Empty</returns>
public static bool HasBadWord(string text,TrieNode rootNode)
{
for (int i = ; i < text.Length; i++)
{
TrieNode node;
if (rootNode.m_values.TryGetValue(text[i], out node))
{
for (int j = i + ; j < text.Length; j++)
{
if (node.m_values.TryGetValue(text[j], out node))
{
if (node.m_end)
{
return true;
}
}
else
{
break;
}
}
}
}
return false;
} /// <summary>
/// 检查是否包含非法字符
/// </summary>
/// <param name="text">输入文本</param>
/// <returns>找到的第1个非法字符.没有则返回string.Empty</returns>
public static string FindOne(string text,TrieNode rootNode)
{
for (int i = ; i < text.Length; i++)
{
char c = text[i];
TrieNode node;
if (rootNode.m_values.TryGetValue(c, out node))
{
for (int j = i + ; j < text.Length; j++)
{
if (node.m_values.TryGetValue(text[j], out node))
{
if (node.m_end)
{
return text.Substring(i, j + - i);
}
}
else
{
break;
}
}
}
}
return string.Empty;
} //查找所有非法字符
public static IEnumerable<string> FindAll(string text,TrieNode rootNode)
{
for (int i = ; i < text.Length; i++)
{
TrieNode node;
if (rootNode.m_values.TryGetValue(text[i], out node))
{
for (int j = i + ; j < text.Length; j++)
{
if (node.m_values.TryGetValue(text[j], out node))
{
if (node.m_end)
{
yield return text.Substring(i, (j + - i));
}
}
else
{
break;
}
}
}
}
} /// <summary>
/// 替换非法字符
/// </summary>
/// <param name="text"></param>
/// <param name="c">用于代替非法字符</param>
/// <returns>替换后的字符串</returns>
public string Replace(string text,TrieNode rootNode)
//public string Replace(string text, char c = '*')
{
char[] chars = null;
string str = "";
for (int i = ; i < text.Length; i++)
{
TrieNode subnode;
if (rootNode.m_values.TryGetValue(text[i], out subnode))
{
for (int j = i + ; j < text.Length; j++)
{
if (subnode.m_values.TryGetValue(text[j], out subnode))
{
if (subnode.m_end)
{
if (chars == null) chars = text.ToArray();
for (int t = i; t <= j; t++)
{
str+= chars[t];
}
i = j;
}
}
else
{
break;
}
}
}
}
return chars == null ? text : str;
}
}
}
*注意事项:如果词库中有如:“我们”,“我们的”这样的重复词语,在查找内容中有“我们的”这样的语句则会重复出现“我们”,“我们的”(使用FindAll()方法)
.NET实现高效过滤敏感查找树算法(分词算法):的更多相关文章
- (转)两种高效过滤敏感词算法--DFA算法和AC自动机算法
原文:https://blog.csdn.net/u013421629/article/details/83178970 一道bat面试题:快速替换10亿条标题中的5万个敏感词,有哪些解决思路? 有十 ...
- Java过滤敏感词语/词汇---DFA算法
最近网站需要在评论.投稿等地方过滤敏感词汇,于是在网上查找了相关教程,特此整理分享. 关于DFA算法,详细的可以去http://blog.csdn.net/u013378306/article/det ...
- java过滤敏感词汇
前言 现在几乎所有的网站再发布带有文字信息的内容时都会要求过滤掉发动的.不健康的.影响社会安定的等敏感词汇,这里为大家提供了可以是现在这种功能的解决方案 第一种方式 创建敏感词汇文件:首先需要准备一个 ...
- 协议栈处理中的conntrack HASH查找/Bloom过滤/CACHE查找/大包与小包/分层处理风格
1.路由CACHE的优势与劣势 分级存储体系已经存在好多年了.其精髓在于"将最快的存储器最小化.将最慢的存储器最大化",这样的结果就使资源利用率的最大化.既提高了訪问效率,又节省了 ...
- 【SpringBoot】前缀树 Trie 过滤敏感词
1.过滤敏感词 Spring Boot实践,开发社区核心功能 完成过滤敏感词 Trie 名称:Trie也叫做字典树.前缀树(Prefix Tree).单词查找树 特点:查找效率高,消耗内存大 应用:字 ...
- 过滤敏感词工具类SensitiveFilter
网上过滤敏感词工具类有的存在挺多bug,这是我自己改用的过滤敏感词工具类,目前来说没啥bug,如果有bug欢迎在评论指出 使用前缀树 Trie 实现的过滤敏感词,树节点用静态内部类表示了,都写在一个 ...
- web前端js过滤敏感词
web前端js过滤敏感词 这里是用文本输入框还有文本域绑定了失去焦点事件,然后再遍历敏感词数组进行匹配和替换. var keywords=["阿扁","呵呵", ...
- php 过滤敏感关键词
php 过滤敏感关键词 function badwords($content){ $keywords=M("config")->where("name='badwo ...
- JavaScript - 过滤敏感字符
目录 before 源码示例 before 本篇博客展示了如何是在前端对铭感字符及一些特殊的命令做过滤. 好处是,少发一次请求,减少服器校验压力. 源码示例 <!DOCTYPE html> ...
随机推荐
- 论文笔记之:Co-saliency Detection via A Self-paced Multiple-instance Learning Framework
Co-saliency Detection via A Self-paced Multiple-instance Learning Framework T-PAMI 2016 摘要:Co-sal ...
- centos7+nginx 1.9.0+php-fpm+phpstorm+xdebug+vmware开发环境搭建
1.php-fpm yum install php-fpm 默认配置在本地9000端口监听 service php-fpm restart启动 2.nginx 1.9.0 需先安装gcc zlib o ...
- javascript 中的 true 或 false
JavaScript中奇葩的假值 通常在以下语句结构中需要判断真假 if分支语句 while循环语句 for里的第二个语句 如 1 2 3 4 5 6 7 if (boo) { // do somet ...
- unity, 播放循环背景音乐注意事项
循环背景音乐用wav格式,不要用mp3. 参考:http://answers.unity3d.com/questions/343057/how-do-i-make-unity-seamlessly-l ...
- ASP.NET MVC路由配置(转载自http://www.cnblogs.com/zeusro/p/RouteConfig.html )
把apress.pro.asp.net.mvc.4.framework里的CHAPTER 13翻译过来罢了. XD 首先说URL的构造. 其实这个也谈不上构造,只是语法特性吧. 命名参数规范+匿名对象 ...
- python(23)re函数:compile、match、search、findall
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re 模块使 Python ...
- c#获取枚举
在实际开发项目中,我们定义了一个枚举,往往我们需要在下拉框或其它地方展示枚举.为了加深印象,也为了帮到有需要的人,我写了一个DEMO. 第一步,我们定义一个枚举: /// <summary> ...
- Android Gradle 技巧之一: Build Variant 相关
Build Variant android gradle 插件,允许对最终的包以多个维度进行组合. BuildVariant = ProductFlavor x BuildType 两个维度 最常见的 ...
- FW: Chef集中管理工具实践之 (1) 环境部署
本文转载:http://heylinux.com/archives/2208.html Chef集中管理工具实践之 (1) 环境部署 目录结构Chef集中管理工具实践之 (0) 什么是ChefChef ...
- 【Robot Framework】robot framework 学习以及selenium、appnium、requests实践(一)
话说之前自己写了个selenium的自动化框架,然后又研究了下RF,觉得RF这种基于关键字驱动的框架更为容易上手,当然在做一些比较繁琐的验证时,似乎还不是太灵活,不如自己写几行python来的实惠(也 ...