敏感词过滤优化的解决方案

介绍

敏感词字库匹配其实是关键字的一种匹配。最简单想到的额方法就是,如果要匹配某个字符串,去遍历敏感字库,这是最简单粗暴的方式。但是很明显当字库很大时,比如有六十万条数据,那么这样一个字库去遍历是非常耗时的。那么就需要我们去通过数据结构去优化匹配的方式。

暴力法和利用字典优化的方式

暴力法

直接对敏感词库进行遍历,意义对比,去全字匹配。

        static void DirectFilter(string word){for (int i = 0; i < sensitiveArr.Length; i++)  //遍历铭感词数组{if (word == sensitiveArr[i])      //测试查找"粉丝"敏感词{Console.WriteLine("匹配到敏感字: "+ word);break;                            //匹配到之后,退出循环}}     }

利用字典优化的方式

核心思想,就是利用关键字去搜索。定义字典或者hashtable,kye是铭感词的首字符例如“粉”,val是所有以“粉”为首字符的敏感词组成的一个链表。这样处理之后,我们去搜索一个敏感词的时候,首先判断字典里有没有这个key,没有就直接结束,有就去遍历这个key对应的value,这样处理之后,每个敏感词可能只需要搜索几次,就能比对完,非常快。

//初始化字典
static void SensitiveDicInit(){for (int i = 0; i < sensitiveArr.Length; i++)       //遍历数组{char key = sensitiveArr[i][0];      //首字符作为Key,首字符相同的铭感词组成的链表作为valuif (worldsTab.ContainsKey(key))     //有key就直接add{worldsTab[key].Add(sensitiveArr[i]);}else                                //没有就新建一个list再add{List<string> tmpList = new List<string>();tmpList.Add(sensitiveArr[i]);worldsTab.Add(key, tmpList);}}}static void QuickFilter(string word) {char key = word[0];if (worldsTab.ContainsKey(key))    //查找首字符是否在字典,在就去遍历value对应的List,不在就说明不是铭感词{for (int i = 0; i < worldsTab[key].Count; i++)          //遍历value对应的List{if (word == worldsTab[key][i]){Console.WriteLine("找到了对应的关键词: " + word);return;}}Console.WriteLine("没找到对应的关键词: " + word);}else {Console.WriteLine("没找到首关键字  key: " + word[0]);}}

效果

我们在入口函数里面跑一下,测试一下匹配效率。

static void Main(string[] args){sensitiveStr = File.ReadAllText(@"d:\temp.txt");        //从文件中读取出敏感字符串sensitiveArr = sensitiveStr.Split(',');                 //处理成敏感词数组Stopwatch watch = new Stopwatch();      //时间监测类,用来检测代码执行时间mswatch.Start();DirectFilter("粉丝");watch.Stop();                           //结束检测Console.WriteLine("暴力方式匹配执行时长: " + watch.Elapsed.TotalMilliseconds);  //输出暴力法执行时间mswatch.Restart();SensitiveDicInit();watch.Stop();Console.WriteLine("字典初始化执行时长: " + watch.Elapsed.TotalMilliseconds);watch.Restart();QuickFilter("粉丝");watch.Stop();Console.WriteLine("字典方式匹配执行时长: " + watch.Elapsed.TotalMilliseconds);Console.ReadLine();}

这里是效果图

可以看到暴力法匹配需要9.3796ms,优化过后的方法需要15.7792ms+0.3141ms,明显是优化后的方式慢了。但是,我们可以发现只是初始化比较耗时,真正的匹配只消耗了0.3ms。所以不难发现,但敏感词库足够大时,或则说需要进行多次匹配时,后者的优势就会体现出来了。

总结

这里只是一个小小的demo,只做了全字匹配,大家如果有兴趣,其实可以加上正则表达式,去完成真正意义上的过滤敏感词。欢迎评论探讨技术,我是程序员小虎。

敏感词过滤优化的解决方案相关推荐

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

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

  2. 字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法

    文章目录 1. 算法背景 2. AC自动机实现原理 2.1 构建失败指针 2.2 依赖失败指针过滤敏感词 3. 复杂度及完整代码 1. 算法背景 之前介绍过单模式串匹配的高效算法:BM和KMP 以及 ...

  3. AC自动机:多模式串匹配实现敏感词过滤

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1 敏感词过滤场景 在很多支持用户发表内容的网站,都有敏感词过滤替换的功能.例如将一些淫秽.反动内容过滤 ...

  4. Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类

    Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类 =========================== ©Copyright 蕃薯耀 2017年9月22日 http://fansh ...

  5. vue 敏感词过滤 前端

    vue 敏感词过滤 前端 根据正则来进行过滤 敏感词是一个数组 词比较多 专门存放在js文件里面 vue用 export 导出 再引入到需要用的组件里 judgeBadWord(obj) {let w ...

  6. php 对全角字符的过滤,php在做敏感词过滤时怎么解决用特殊符号分割、简繁体、半角全角,来绕开过滤的问题?...

    彻底地过滤敏感词 回复内容: 彻底地过滤敏感词 过滤和谐词其实并不是一个好策略,有一万种说出敏感词的方法,就一定会有第一万零一种,如果你反复设置程序去和谐这些词,最后会发现,你的会员连最基本的一些话都 ...

  7. 基于ik分词器和布隆过滤器实现敏感词过滤

    文章目录 准备阶段 为何选用IK Analyzer 什么是布隆过滤器 开发过程 整合Ik 总结 <基于ik分词器和布隆过滤器实现敏感词过滤>首发 牧马人博客转发请加此提示 最近公司业务有个 ...

  8. Trie树实现前缀自动补全 + AC自动机实现敏感词过滤

    文章目录 背景 扩展 AC自动机 背景 最近参与了某业务系统的开发, 需要根据城市的名字简称,找到其官方的完整名称.比如云南的大理,其实其完整的名称是大理白族自治州.可以参考官方的行政区划,点这里. ...

  9. .NET 6 实现敏感词过滤

    一.什么是敏感词过滤? 敏感词过滤是一种处理网络内容的技术,可以检测和过滤出网络中的敏感/违禁词汇.它通过给定的关键字或字符串,判断网络内容是否包含某些敏感信息,从而防止违反法律法规的信息流通. 通常 ...

最新文章

  1. C语言二维数组的指针写法
  2. Android 5.1 Settings源码简要分析
  3. 偈颂一首《静心莲》【心静如止水,雷打无波澜。佛前忏一刹,万千罪消融。】
  4. Codeforces Beta Round #51 D. Beautiful numbers 数位dp + 状态优化
  5. 迷宫游戏 堆栈实现
  6. php代理请求失败,http请求失败有哪些原因
  7. 你值得拥有的 11 个前端开发利器
  8. springboot分页展示功能_基于SpringBoot从零构建博客网站 - 分页显示文章列表功能...
  9. pcb板可挖孔吗_PCB板上的过孔的种类及打孔注意事项
  10. 华为工作法--读后感
  11. 如何使用Pip卸载软件包?
  12. 80386 CPU资源
  13. html网页怎么弄背景 图片,在html网页中如何设置背景图片?网页背景怎么设置?...
  14. 在线板涂鸦,微信小程序,绘画板,签字版,实现在线涂鸦画板小程序源码
  15. Mac下tomcat启动报错Cannot run program。。。 Permission denied解决办法
  16. 心灵捕手~ 鸡汤悄悄话
  17. Android 模拟器(window/Mac)
  18. 【解决方案】windows系统部分软件变日文
  19. 微服务架构-实现技术之六大基础组件:服务通信+事件驱动+负载均衡+服务路由+API网关+配置管理
  20. Scrum立会报告+燃尽图(十月十七日总第八次)

热门文章

  1. 初见Manjaro:Manjaro 安装配置流程
  2. 应用在智能触摸遥控器中的触摸芯片
  3. 物研究所做一位科研人员
  4. WinRAR 去广告的姿势
  5. deepdive案例实验中的所遇问题即解决
  6. 超神学院暗质计算机,超神学院之黑白守护者
  7. php 小程序即时聊天,网易云IM小程序聊天室集成。PHP版SDK API使用示例
  8. Measurement Studio函数ReadMultiSampleAsync
  9. pt100热电阻c语言的程序,单片机+ADC0832热电阻PT100测温程序
  10. METIS安装和使用