Trie树,又称字符查找树、前缀树,主要用于字符匹配(详见http://en.wikipedia.org/wiki/Trie)。适合做关键词查找,比如查找文章中的关键字然后给他们加链接。 当然对脏词的过滤应用也是样,只是把替换连接的工作换成了替换字符。

当前的代码还只是进行简单的替换,并没有做一些字符的处理,比如“昨天见到你妈,逼我要买房”,这本身不是脏词,因为有逗号,所以程序里要增加字符的范围判断。

程序中的skip就是用来过滤脏词的简单变体,比如“找*小*姐”,默认是最多跳过3个字符,这个可以随便调整了。总之是一个Trie的锻炼吧。

  1. public class TrieTree
  2. {
  3. private readonly Dictionary<char, TrieTree> Children;
  4. public bool End { get; set; }
  5. public TrieTree()
  6. {
  7. Children = new Dictionary<char, TrieTree>();
  8. }
  9. public void AddKey(string keyword)
  10. {
  11. if (String.IsNullOrEmpty(keyword))
  12. {
  13. return;
  14. }
  15. var cNode = this;
  16. foreach (var key in keyword)
  17. {
  18. if (cNode.Children.ContainsKey(key))
  19. {
  20. cNode = cNode.Children[key];
  21. }
  22. else
  23. {
  24. var node = new TrieTree();
  25. cNode.Children.Add(key, node);
  26. cNode = node;
  27. }
  28. }
  29. cNode.End = true;
  30. }
  31. public void Replace(ref string text)
  32. {
  33. for (var i = 0; i < text.Length; i++)
  34. {
  35. var cNode = this;
  36. var key = text[i];
  37. //碰到脏词的第一个词
  38. if (cNode.Children.ContainsKey(key))
  39. {
  40. cNode = cNode.Children[key];
  41. //查找是否包含脏词后面的词
  42. var skip = 0;
  43. for (var j = i + 1; j < text.Length; j++)
  44. {
  45. if (cNode.Children.ContainsKey(text[j]))
  46. {
  47. cNode = cNode.Children[text[j]];
  48. skip = 0;
  49. }
  50. else
  51. {
  52. //允许略过过几个字符
  53. skip++;
  54. if (skip > 3)
  55. {
  56. break;
  57. }
  58. }
  59. if (cNode.End)
  60. {
  61. var len = j + 1 - i;
  62. text = text.Replace(text.Substring(i, len), string.Empty.PadLeft(len, '*'));
  63. i += len;
  64. break;
  65. }
  66. }
  67. }
  68. }
  69. }
  70. }

使用方法如下:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. var trie = new TrieTree();
  6. var keywords = "我操,妓女,fuck".Split(',');
  7. foreach (var key in keywords)
  8. {
  9. trie.AddKey(key);
  10. }
  11. var text = @"我擦啊,尼玛,,fuck you,你这个妓女,贱人。";
  12. trie.Replace(ref text);
  13. Console.WriteLine(text);
  14. Console.Read();
  15. }
  16. }

执行的结果:

转自http://blog.csdn.net/maddemon/article/details/7011699

Trie树-脏词过滤应用的更多相关文章

  1. 转,敏感词过滤,PHP实现的Trie树

    原文地址:http://blog.11034.org/2012-07/trie_in_php.html 项目需求,要做敏感词过滤,对于敏感词本身就是一个CRUD的模块很简单,比较麻烦的就是对各种输入的 ...

  2. [转载]敏感词过滤,PHP实现的Trie树

    原文地址:http://blog.11034.org/2012-07/trie_in_php.html 项目需求,要做敏感词过滤,对于敏感词本身就是一个CRUD的模块很简单,比较麻烦的就是对各种输入的 ...

  3. [原创] Trie树 php 实现敏感词过滤

    目录 背景 简介 存储结构 PHP 其他语言 字符串分割 示例代码 php 优化 缓存字典树 常驻服务 参考文章 背景 项目中需要过滤用户发送的聊天文本, 由于敏感词有将近2W条, 如果用 str_r ...

  4. DFA和trie特里实现敏感词过滤(python和c语言)

    今天的项目是与完成python开展,需要使用做关键词检查,筛选分类,使用前c语言做这种事情.有了线索,非常高效,内存小了,检查快. 到达python在,第一个想法是pip基于外观的c语言python特 ...

  5. web系统安全运营之基础- 基于DFA算法的高性能的敏感词,脏词的检测过滤算法类(c#).

    [概述]做好一个web系统的安全运维,除了常规的防注入,防入侵等,还有一个检测并过滤敏感词,脏词..  这件事做得不好,轻则导致一场投诉或纠纷,重则导致产品被勒令关闭停运. 废话少说,先看下代码,可以 ...

  6. 字典树Trie--实现敏感词过滤

    序言 Trie树 资料 https://blog.csdn.net/m0_37907797/article/details/103272967?utm_source=apphttps://blog.c ...

  7. 转:鏖战双十一-阿里直播平台面临的技术挑战(webSocket, 敏感词过滤等很不错)

    转自:http://www.infoq.com/cn/articles/alibaba-broadcast-platform-technology-challenges 鏖战双十一-阿里直播平台面临的 ...

  8. 用php实现一个敏感词过滤功能

    周末空余时间撸了一个敏感词过滤功能,下边记录下实现过程. 敏感词,一方面是你懂的,另一方面是我们自己可能也要过滤一些人身攻击或者广告信息等,具体词库可以google下,有很多. 过滤敏感词,使用简单的 ...

  9. 浅析敏感词过滤算法(C++)

    为了提高查找效率,这里将敏感词用树形结构存储,每个节点有一个map成员,其映射关系为一个string对应一个TreeNode. STL::map是按照operator<比较判断元素是否相同,以及 ...

随机推荐

  1. Linux中查看是否是固态硬盘(SSD)

       最近在准备测试,需要看看哪些机器挂载的是ssd硬盘,Google了一圈看到了许多方法,但都云里雾里的,不知道怎么确定.ssd硬盘貌似使用的也是scsi接口,所以根据盘符的名称也是判断不出来的.最 ...

  2. asp数组的使用

    定义简单数组 有两种方法在asp中定义和初始化数组,让我们看看每种的例子: 方法一:MyArray = Array("Jan","Feb","Mar& ...

  3. [置顶] Android开发实战记录(三)---HelloWorld

    1.新建Android项目,选择Android Project,然后Next 2.填写项目名称HelloWorld然后next,这里注意下,Java开发的命名规范 3.选择Android SDK版本, ...

  4. 理解Servlet及其对象

    一.ServeltConfig对象 在Servlet的配置文件中,可以使用一个或多个<init-param>标签为Servlet配置一些初始化参数.而不当Servlet配置了初始化参数后, ...

  5. indesign 注意事项

    画册 42 * 28.5加出血 42.6 * 29.1用纸 889 * 1194 注意事项:indd文件打印需转曲线 快捷键:ctrl+shift+O ctrl+shift+G (2)应用图片需单独创 ...

  6. Carmack在QUAKE3中使用的计算平方根的函数

    // // Carmack在QUAKE3中使用的计算平方根的函数 // float CarmSqrt(float x){ union{ int intPart; float floatPart; } ...

  7. Linux下重要日志文件及查看方式

    http://os.51cto.com/art/201108/282184_all.htm   1.Linux下重要日志文件介绍 /var/log/boot.log 该文件记录了系统在引导过程中发生的 ...

  8. 自写AES加密解密工具类

    此类主要用于加密与解密,采用128位ECB模式,PKCS5Padding填充补位. 可使用方法为加密返回二进制encryptBin(content, key).加密返回十六进制encryptHex(c ...

  9. struts1:(Struts重构)构建一个简单的基于MVC模式的JavaWeb

    在构建一个简单的基于MVC模式的JavaWeb 中,我们使用了JSP+Servlet+JavaBean构建了一个基于MVC模式的简单登录系统,但在其小结中已经指出,这种模式下的Controller 和 ...

  10. 菜单之二:使用xml文件定义菜单

    参考<疯狂android讲义>2.10节 P174,参见归档project:XmlMenuDemo.zip 一般推荐使用XML文件定义菜单. 基本步骤如下: 1.定义布局文件 为简单显示原 ...