DFA算法实现敏感词过滤
写项目时,得到一个新的需求,即实现敏感词的过滤,上网查了下,有几种实现方法,采取了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算法实现敏感词过滤相关推荐
- java使用DFA算法实现敏感词过滤
Java使用DFA算法实现敏感词过滤 DFA,全称 Deterministic Finite Automaton 即确定有穷自动机. 其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每 ...
- spring boot 使用DFA算法实现敏感词过滤
spring boot 使用DFA算法实现敏感词过滤 敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的. DFA算法简介 DFA全称为:Deterministi ...
- 基于PHP的DFA算法(敏感词过滤)
基于PHP的DFA算法(敏感词过滤) 看到网上很多的DFA算法,很多都有不同程度的问题,自己修改了一下,亲测没有问题,用在系统中过滤敏感词汇,比正则匹配的速度快很多. class DFA {priva ...
- java dfa 敏感词_java利用DFA算法实现敏感词过滤功能
前言 敏感词过滤应该是不用给大家过多的解释吧?讲白了就是你在项目中输入某些字(比如输入xxoo相关的文字时)时要能检 测出来,很多项目中都会有一个敏感词管理模块,在敏感词管理模块中你可以加入敏感词,然 ...
- DFA算法进行敏感词过滤
1.新建敏感词文本new_adress.txt,进行添加敏感词 2.代码 # -*- coding:utf-8 -*- import timetime1 = time.time() "&qu ...
- 一种基于DFA算法的敏感词检测JAVA程序片段
本文章提供一种基于DFA算法的敏感词检测JAVA程序片段,如下: 1.构造多叉树数据结构 import org.jetbrains.annotations.NotNull;/*** 多叉树* @aut ...
- dfa算法 java_Java实现DFA算法对敏感词、广告词过滤功能示例
一.前言 开发中经常要处理用户一些文字的提交,所以涉及到了敏感词过滤的功能,参考资料中DFA有穷状态机算法的实现,创建有向图.完成了对敏感词.广告词的过滤,而且效率较好,所以分享一下. 具体实现: 1 ...
- python实现dfa过滤算法_DFA 算法实现敏感词过滤(python 实现)
敏感词过滤的经典算法DFA ,看完相关资料后,自己实现了一下,同时做了评估实验 先上代码 #!/usr/bin/python2.6 # -*- coding: utf-8 -*- import tim ...
- TypeScript:Aho–Corasick算法实现敏感词过滤
敏感词过滤应该是许多后端同事经常会遇到的需求,无论是评论.弹幕.文章,都需要做敏感词过滤处理来规避风险.在前端开发中,使用replace函数来替换字符串是我们的常规操作,在这之前我思考过如果用Java ...
最新文章
- c++ 三角函数_高中数学:三角函数知识点总结+专项练习,速速查看!
- 华为2288H V5服务器 RAID操作
- Unresolved compilation problem: String liter
- 多线程编程2 - NSOperation
- ubuntu永久设置dns
- 计算机网络项目化实训教程,计算机网络项目实训教程
- MegaCli命令总结
- php refcount,php变量引用和计数_refcount_gc和is_ref_gc
- 实时监控Cat之旅~对请求是否正常结束做监控(分布式的消息树)
- Codeforces Round #493 (Div. 2):C. Convert to Ones
- HCIE Security PKI 备考笔记(幕布)
- 锐起无盘服务器内存盘,锐起及网众系列使用无盘+内存盘的新方法
- 知识图谱-生物信息学-医学顶刊论文(Briefings in Bioinformatics-2021):生物信息学中的图表示学习:趋势、方法和应用
- html5做在线课件,HTML5教程:制作移动教育课件
- DirectX天空球和天空盒子模型
- PPT文件如何解决不能编辑的问题
- linux下查找占空间大的文件,Linux中查找当前目录下占用空间最大的前10个文件
- java中ajax是什么意思,java中使用Ajax技术
- Mybatis中模糊查询的SQL语句应该怎么写?
- 【40-系统性能压力测试基本概念-相关性能指标HPSTPSQPSRT-安装Jmeter教程-JMeter测试流程-线程组-取样器-监视器-测试商城首页-JMeter Address 占用的问题】