本文参考博客:https://blog.csdn.net/henshuia/article/details/111498753?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-0.pc_relevant_default&spm=1001.2101.3001.4242.1&utm_relevant_index=3
再次感谢作者分享!

实现敏感词过滤,一般都是遍历敏感词库然后一个一个的用敏感词进行匹配,但是这样效率不高并且如果敏感词中间掺杂特殊符号或者空格就匹配不到了,其次高级点使用正则匹配,但是正则匹配效率低,所有就使用DFA算法解决。

DFA简介
在实现文字过滤的算法中,DFA是唯一比较好的实现算法。DFA即Deterministic Finite Automaton,也就是确定有穷自动机,它是是通过event和当前的state得到下一个state,即event+state=nextstate。下图展示了其状态的转换

如果我们敏感词是:黄色、黄赌毒、黄色丝袜、丝袜,则数据结构如下所示

每次过滤文章的时候先从整片文章从第一个字开始往后过滤,如果当前这个字存在根节点下则用这个字后面字个这个节点下一个节点匹配,如果存在并且end=1则是敏感词。
首先创建对敏感词处理,按格式写入

    private SoftReference<Map<String, Map>> sensitiveWordReference=null;private void setWordMap(List<String> result){Map<String, Map> sensitiveWordMap=new HashMap<>(result.size());Iterator<String> iterator = result.iterator();String key = null;Map nowMap = null;while(iterator.hasNext()){nowMap=sensitiveWordMap;key = iterator.next();for(int i=0;i< key.length();i++){char keyChar = key.charAt(i);if(nowMap.containsKey(keyChar)){nowMap=(Map)nowMap.get(keyChar);}else{Map<String,String>newWorMap = new HashMap();newWorMap.put("end", "0");nowMap.put(keyChar, newWorMap);nowMap = newWorMap;}if(i==(key.length()-1)){nowMap.put("end","1");}}}log.info("敏感词组合{}", JSONObject.toJSONString(sensitiveWordMap));sensitiveWordReference=new SoftReference<Map<String, Map>>(sensitiveWordMap);}

敏感词是:毒品,黑色,黄色丝袜,色情,丝袜,黄色,黄赌毒

敏感词组合 {"黑": {"色": {"end": "1"},"end": "0"},"毒": {"品": {"end": "1"},"end": "0"},"色": {"情": {"end": "1"},"end": "0"},"黄": {"色": {"end": "1","丝": {"end": "0","袜": {"end": "1"}}},"end": "0","赌": {"毒": {"end": "1"},"end": "0"}},"丝": {"end": "0","袜": {"end": "1"}}
}

检查并返回匹配到的第一个敏感词

private String checkWords(String sensitiveWords){if(StringUtils.isEmpty(sensitiveWords)){return StringUtils.EMPTY;}Map<String, Map> sensitiveWordMap=sensitiveWordReference.get();Map nowMap = null;StringBuffer sb=new StringBuffer();for(int i =0; i < sensitiveWords.length(); i++){if(!Character.toString(sensitiveWords.charAt(i)).matches("[\\u4E00-\\u9FA5]+")) {continue;}if(!sensitiveWordMap.containsKey(sensitiveWords.charAt(i))){continue;}sb=new StringBuffer().append(sensitiveWords.charAt(i));nowMap=sensitiveWordMap.get(sensitiveWords.charAt(i));int sensitiveWordLength=i;while (sensitiveWordLength<MAX_MAP_LENGTH){sensitiveWordLength++;if(!Character.toString(sensitiveWords.charAt(sensitiveWordLength)).matches("[\\u4E00-\\u9FA5]+")) {sb.append(sensitiveWords.charAt(sensitiveWordLength));continue;}nowMap=(Map)nowMap.get(sensitiveWords.charAt(sensitiveWordLength));if(CollectionUtils.isEmpty(nowMap)){break;}sb.append(sensitiveWords.charAt(sensitiveWordLength));if(nowMap.get("end").equals("1")){return sb.toString();}}}return sb.toString();}

本文增加了对特殊字符的处理,匹配敏感词的时候会忽略特殊字符只匹配汉字。
执行输入检查的文章:发 丝 0 袜送的发达色法士大夫黄 的色是打发士大 夫是
返回结果敏感词是:丝 0 袜

java敏感词过滤算法相关推荐

  1. 敏感词过滤算法 为内容保驾护航 Java/.Net/C++/c/Python等语言是如何进行敏感词打码限制的 高效防范违规内容

    有人的地方,就有江湖,有输入框的地方,就有注入风险!有输入框的地方,就有敏感词!敏感词就像一个平台杀手,可能直接导致平台被封锁! 敏感词是一个APP.一个网站.一个内容平台的"杀手" ...

  2. trie树之敏感词过滤算法

    之前写过一篇关于Trie树的介绍:Trie树--在一个字符串集合中快速查找某个字符串.今天就用Trie树来实现敏感词过滤算法. 首先简单介绍一下Trie树的数据结构: 1.根节点不存储字符. 2.Tr ...

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

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

  4. Java 敏感词过滤(DFA有穷自动机)

    Java 敏感词过滤 DFA有穷自动机 初始化敏感词 构建树 查询 完整代码如下 后记 初始化敏感词 使用set集合,可以查询数据库. /*** 初始化值* @return*/private stat ...

  5. 【C++】实现敏感词过滤算法(含源码)

    敏感词过滤算法(聚合词树查询法) 1.构建词树 2.敏感词判断 3.遍历文本 关于敏感词过滤算法,数不胜数,在参考众多算法后,选取了比较实用的算法,进行总结与改进.大家可以参考一下链接: 敏感词过滤算 ...

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

    本文转自浅析敏感词过滤算法(C++),自己也在其基础上根据自己的情况做了一点修改. 为了提高查找效率,这里将敏感词用树形结构存储,每个节点有一个map成员,其映射关系为一个string对应一个Word ...

  7. DFA算法:简易Java敏感词过滤(含源文件和上万敏感词列表)

    敏感词过滤说白了就是简单的字符串替换,Java本身已经提供了相关函数,但是一旦遇到长文本,或者敏感词数量庞大,效率下降就会非常明显.本文将介绍利用多叉树进行敏感词存储和过滤的方法. 多叉树 多叉树是一 ...

  8. java实现敏感词过滤算法DFA并忽略敏感词中的特殊字符

    参考文章:https://blog.csdn.net/chenssy/article/details/26961957 补充说明: 1.具体的DFA介绍参考原文章,此处只是补充了文章中没有介绍的点以及 ...

  9. 记录一次敏感词过滤算法DFA的应用案例

    目录 0. DFA是什么? 1.为什么要用DFA 2.DFA工具类实现 3.性能对比效果 3.1 普通关键字过滤 3.2 DFA关键字过滤 0. DFA是什么? 参考文档:敏感词过滤的算法原理之DFA ...

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

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

最新文章

  1. Docker镜像加速器配置
  2. 【精选】Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解
  3. Java系列(1) JavaEE架构
  4. html为什么未响应,Word2010总是未响应怎么办?
  5. php cli和fastcgi,php的几种运行模式CLI、CGI、FastCGI、mod_php
  6. C#23种设计模式WebCast讲解笔记大全(25讲)
  7. php生成静态html分页实现方法
  8. 利用PowerDesigner15在win7系统下对MySQL 进行反向project(二)
  9. sql操作mysql数据库_一些常用的操作MySQL数据库的sql语句
  10. 4.13_chain_of_responsibility_行为型模式:责任链模式
  11. activex控件方法和事件
  12. java 各组件单击总数_java 获取面板上有多少个组件
  13. 格符\b的使用示例:每隔1秒消去1个字符
  14. Aiml中文包含英文(字母,特殊符号)识别问题的解决
  15. 微信公众号敏感词检测工具
  16. pip常用方法与升级到18.0升级报错问题
  17. flutter11 - 调试程序
  18. 漫威系列-《复联4》
  19. 河北工程大学计算机考试题型,2019上半年河北工程大学计算机等级考试报名通知...
  20. MySQL——读写分离 理论+实操!!!

热门文章

  1. windows——运行命令大全(让你的电脑掌控在自己手中)
  2. 谭浩强版本C语言课后习题第二章
  3. 测试计划和测试方案有什么区别?
  4. 数据库(员工信息表)
  5. 架构之美-读书笔记之一
  6. 单片机音乐倒数计时器c语言,基于单片机音乐倒数计时器设计.doc
  7. DeepL与有道翻译对比
  8. (22) 基于动态时空图卷积神经网络的交通流预测
  9. Linux系统,Hadoop,R语言,RHadoop的安装
  10. tomcat内存溢出:PermGen space解决方法