.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> ...
随机推荐
- QTreeWidget创建
QTreeWidget.顾名思义,这个类用来展示树型结构.同前面说的QListWidget类似,这个类需要同另外一个辅助类QTreeWidgetItem一同使用.不过,既然是提供方面的封装类,即便是看 ...
- truncate有外键约束的表,报ORA-02266处理。
问题描述:当父表有子表的外键约束时,无法直接truncate父表.报ORA-02266: unique/primary keys in table referenced by enabled fore ...
- Python decode与encode
字符串在Python内部的表示是unicode编码(8-bit string),因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicod ...
- android四大组件之ContentProvider(一)
ContentProvider学习笔记 1. ContentProvider基本概念 ContentProvider向我们提供了我们在应用程序之间共享数据的一种机制,虽然采用文件和SharedPref ...
- Jquery tab 选项卡 无刷新切换
转载的 演示地址:http://www.freejs.net/demo/29/index.html 首页>>TAB标签>>jquery实现简单的Tab切换菜单(2013-09- ...
- linux -小记(1) 问题:"linux ifconfig查看网卡名称与配置文件不否" 或 启动网卡提示“ eth0 似乎不存在, 初始化操作将被延迟”。
"linux ifconfig查看网卡名称与配置文件不否" 或 启动网卡提示" eth0 似乎不存在, 初始化操作将被延迟" . 问题 1. service n ...
- Spring学习 Ioc篇(一 )
一直以来忙于项目的开发,Spring虽然不用,一直想系统地学习一下,想看看它的源码,都没有时间,这段时间比较充裕,就索性先把Spring学习下,熟悉各个功能再去探究它内部的实现.就从Ioc篇开始学习. ...
- Zookeeper全解析——Client端(转)
Zookeeper的Client直接与用户打交道,是我们使用Zookeeper的interface.了解ZK Client的结构和工作原理有利于我们合理的使用ZK,并能在使用中更早的发现问题.本文将在 ...
- 小调网 经典电影 豆瓣评分 tampermonkey脚本
// ==UserScript== // @name 小调网 // @namespace http://tampermonkey.net/ // @version 0.1 // @descriptio ...
- 怎么取消 Windows Server 2012 r2 RDP 限制每个用户只能进行一个会话(转)
在 Windows Server 2008 / 2008 R2 上,如果希望多个远程用户使用同一个账号同时访问服务器的 Remote Desktop(RDP),只需通过管理工具-远程桌面下的“远程桌面 ...