写项目时,得到一个新的需求,即实现敏感词的过滤,上网查了下,有几种实现方法,采取了DFA算法,即确定的有穷自动机算法,当初学习编译原理的时候为啥没想到DFA还能这么做,看来眼界和意识还是不够,得锻炼。

所谓的确定有限自动机算法,其实本质上是自上而下的文法分析中的一个步骤,即建立起一颗从上到下的语法树。

比如有如下敏感词:

大傻瓜,大傻瓜瓜逼,大傻子

建立起的语法树则是:

    针对该情况,可以用HashMap来存贮语法树,当然,不同的敏感词开头则需要不同的语法树,下面列出敏感词转语法树的代码:

/*** 将敏感关键词建立起多颗索引树,以HashMap存贮* @param keyWordSet* @return*/public void addKeyWordtoHashMap(Set<String> keyWordSet){keyWordMap=new HashMap<String,String>();String key = null;Map nowMap = null;Map<String, String> newWorMap = null;Iterator<String> iterator = keyWordSet.iterator();while(iterator.hasNext()) {key = iterator.next();nowMap = keyWordMap;for (int i = 0; i < key.length(); i++) {char keyChar = key.charAt(i);Object wordMap = nowMap.get(keyChar);if (wordMap != null) {nowMap = (Map) wordMap;} else {newWorMap = new HashMap<String, String>();//End为结束标志,1表示为该分支已完成,0表示该分支还未完成newWorMap.put("End", "0");nowMap.put(keyChar, newWorMap);nowMap = newWorMap;}if (i == key.length() - 1) {nowMap.put("End", "1");}}}}

敏感词可以存贮在数据库中,从中取出出来,存入集合中来建立起语法树,例如有以下敏感词:

[大傻逼, 傻子, 傻逼, 大傻子]

利用上述的代码建立起的HashMap有:

{大={End=0, 傻={子={End=1}, End=0, 逼={End=1}}}, 傻={子={End=1}, End=0, 逼={End=1}}}

接下来就是检测文本中是否含有敏感词了,检测敏感词的代码如下:

/*** 检查从开始出的敏感词检测* @param beginIndex* @param text* @return*/private int checkSensitiveWord(int beginIndex,String text){Map newWordMap=keyWordMap;int indexCount=0;//记录扫描敏感词而产生的偏移量boolean isContainSensitiveWord=false;//用来记录是否检测到敏感词char temp=0;for (int i=beginIndex;i<text.length();i++){temp=text.charAt(i);//忽略无效字符if (ignoreWord.get(temp)!=null){indexCount++;continue;}newWordMap=(Map)newWordMap.get(temp);if (newWordMap!=null){indexCount++;if ("1".equals(newWordMap.get("End"))){isContainSensitiveWord=true;}}else {break;}}//敏感词长度不能小于2if (indexCount<2 || !isContainSensitiveWord){indexCount=0;}//System.out.println(indexCount+"jjjj");return indexCount;}

ignoreWord同样是一个HashMap,里面存贮着无效的字符,比如:

public static char[] IgnoreWords={'`','~','!','@','#','$','%','^','&','*','(',')',' ','.','。','·'};

获取文本中的敏感词以及替换:

 /*** 获得文中的敏感词汇* @param text* @return*/public Set<String> getSensitiveWord(String text){Set<String> sensitiveWordList = new HashSet<String>();for(int i = 0 ; i < text.length() ; i++){int length = checkSensitiveWord(i,text);if(length > 0){//将敏感词给截取下来,存入集合中sensitiveWordList.add(text.substring(i, i+length));//text.substring(i,i+length);i = i + length - 1;}}return sensitiveWordList;}/*** 指定字符串替换掉敏感词汇* @param text* @param replaceChar* @return*/public String replaceSensitiveWord(String text,String replaceChar) throws IOException {init();String resultTxt = text;Set<String> set = getSensitiveWord(text);Iterator<String> iterator = set.iterator();String word = null;String replaceString = null;while (iterator.hasNext()) {word = iterator.next();int index=resultTxt.indexOf(word);
resultTxt=resultTxt.substring(0,index)+replaceChar+resultTxt.substring(index+word.length());}return resultTxt;}

从上述的代码可以看出DFA算法的时间复杂度是O(n2),加入有如下需验证的文本:

傻**逼**啦啦&&啦#傻子#啦啦啦大@  傻#子

运行得出的结果为:

语句中包含的敏感词汇:3。包含[#傻子#, 大@  傻#子, 傻**逼**]
[一两清风,半盏明月]啦啦&&啦[一两清风,半盏明月]啦啦啦[一两清风,半盏明月]

DFA算法实现敏感词过滤相关推荐

  1. java使用DFA算法实现敏感词过滤

    Java使用DFA算法实现敏感词过滤 DFA,全称 Deterministic Finite Automaton 即确定有穷自动机. 其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每 ...

  2. spring boot 使用DFA算法实现敏感词过滤

    spring boot 使用DFA算法实现敏感词过滤 敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的. DFA算法简介 DFA全称为:Deterministi ...

  3. 基于PHP的DFA算法(敏感词过滤)

    基于PHP的DFA算法(敏感词过滤) 看到网上很多的DFA算法,很多都有不同程度的问题,自己修改了一下,亲测没有问题,用在系统中过滤敏感词汇,比正则匹配的速度快很多. class DFA {priva ...

  4. java dfa 敏感词_java利用DFA算法实现敏感词过滤功能

    前言 敏感词过滤应该是不用给大家过多的解释吧?讲白了就是你在项目中输入某些字(比如输入xxoo相关的文字时)时要能检 测出来,很多项目中都会有一个敏感词管理模块,在敏感词管理模块中你可以加入敏感词,然 ...

  5. DFA算法进行敏感词过滤

    1.新建敏感词文本new_adress.txt,进行添加敏感词 2.代码 # -*- coding:utf-8 -*- import timetime1 = time.time() "&qu ...

  6. 一种基于DFA算法的敏感词检测JAVA程序片段

    本文章提供一种基于DFA算法的敏感词检测JAVA程序片段,如下: 1.构造多叉树数据结构 import org.jetbrains.annotations.NotNull;/*** 多叉树* @aut ...

  7. dfa算法 java_Java实现DFA算法对敏感词、广告词过滤功能示例

    一.前言 开发中经常要处理用户一些文字的提交,所以涉及到了敏感词过滤的功能,参考资料中DFA有穷状态机算法的实现,创建有向图.完成了对敏感词.广告词的过滤,而且效率较好,所以分享一下. 具体实现: 1 ...

  8. python实现dfa过滤算法_DFA 算法实现敏感词过滤(python 实现)

    敏感词过滤的经典算法DFA ,看完相关资料后,自己实现了一下,同时做了评估实验 先上代码 #!/usr/bin/python2.6 # -*- coding: utf-8 -*- import tim ...

  9. TypeScript:Aho–Corasick算法实现敏感词过滤

    敏感词过滤应该是许多后端同事经常会遇到的需求,无论是评论.弹幕.文章,都需要做敏感词过滤处理来规避风险.在前端开发中,使用replace函数来替换字符串是我们的常规操作,在这之前我思考过如果用Java ...

最新文章

  1. c++ 三角函数_高中数学:三角函数知识点总结+专项练习,速速查看!
  2. 华为2288H V5服务器 RAID操作
  3. Unresolved compilation problem: String liter
  4. 多线程编程2 - NSOperation
  5. ubuntu永久设置dns
  6. 计算机网络项目化实训教程,计算机网络项目实训教程
  7. MegaCli命令总结
  8. php refcount,php变量引用和计数_refcount_gc和is_ref_gc
  9. 实时监控Cat之旅~对请求是否正常结束做监控(分布式的消息树)
  10. Codeforces Round #493 (Div. 2):C. Convert to Ones
  11. HCIE Security PKI 备考笔记(幕布)
  12. 锐起无盘服务器内存盘,锐起及网众系列使用无盘+内存盘的新方法
  13. 知识图谱-生物信息学-医学顶刊论文(Briefings in Bioinformatics-2021):生物信息学中的图表示学习:趋势、方法和应用
  14. html5做在线课件,HTML5教程:制作移动教育课件
  15. DirectX天空球和天空盒子模型
  16. PPT文件如何解决不能编辑的问题
  17. linux下查找占空间大的文件,Linux中查找当前目录下占用空间最大的前10个文件
  18. java中ajax是什么意思,java中使用Ajax技术
  19. Mybatis中模糊查询的SQL语句应该怎么写?
  20. 【40-系统性能压力测试基本概念-相关性能指标HPSTPSQPSRT-安装Jmeter教程-JMeter测试流程-线程组-取样器-监视器-测试商城首页-JMeter Address 占用的问题】

热门文章

  1. C语言while循环中逗号表达式的用法(以及怎么读入引号中有空格的字符串!!!)
  2. Kibana(Windows版本)
  3. windows服务器远程重启又好,windows服务器远程关机或重启
  4. 【swagger关闭】生产环境关闭swagger方法
  5. 在不学成风的大学里顶风而上
  6. macOS 安装 iTerm2
  7. iTerm2 标题 Title
  8. 育苗杯亲子游行程计划
  9. 汽车无钥匙启动系统, 汽车无钥匙进入一键启动系统工作原理,无钥匙启动系统优缺点
  10. 软件测试——VMware环境安装