.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> ...
随机推荐
- 【mysql】一维数据TopN的趋势图
创建数据表语句 数据表数据 对上述数据进行TopN排名 select severity,sum(count) as sum from widgt_23 where insertTstamp>=' ...
- 【uTenux实验】邮箱
邮箱是一个通过在系统(共享)内存空间传递消息来实现同步和通信的对象.uTenux中每个邮箱都包含一个用来发送消息的消息队列和一个用于等待接收消息的任务队列,其使用邮箱功能的消息内容放置在发送方和接收方 ...
- xml与json 介绍
一.JSON数据格式 1)概念:json是一种网络数据传输格式,有值/对象:{“A”:1,”B”:”2”…}词典:对象的序列:[,,,,,]数组两种数据类型 2)URLWithString 将字符串网 ...
- mysql 安装日志
善于使用 mysqld.exe --console 来得到提示
- int和NSInteger区别
NSInteger会自动根据操作系统的位数(32或者64位)返回最大的类型 查到c语言中,int和long的字节数是和操作系统指针所占位数相等. 但c语言中说,long的长度永远大于或等于int ob ...
- Android 日常开发总结的技术经验 60 条
1. 全部Activity可继承自BaseActivity,便于统一风格与处理公共事件,构建对话框统一构建器的建立,万一需要整体变动,一处修改到处有效. 2. 数据库表段字段常量和SQL逻辑分离,更清 ...
- http://www.iis.net/downloads/microsoft/url-rewrite
http://www.iis.net/downloads/microsoft/url-rewrite iis url重写模块.官方下载
- OpenJudge解题经验交流
1.1编程基础之输入输出01:Hello, World! 02:输出第二个整数PS:a,b需用longint类型接收 03:对齐输出 04:输出保留3位小数的浮点数 05:输出保留12位小数的浮点数 ...
- 10. Max Points on a Line
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...
- Django views 中的 shortcut function
shortcut function都在django.shortcuts这个包中,主要包含有:render(), render_to_response(), redirect(), get_object ...