DFA算法实现 敏感词过滤
SensitiveWordInit
初始化敏感词库,将敏感词加入到HashMap中,构建DFA算法模型
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;public class SensitiveWordInit {private String ENCODING = "GBK"; // 字符编码@SuppressWarnings("rawtypes")public HashMap sensitiveWordMap;public SensitiveWordInit() {super();}/*** @author chenming* @date 2014年4月20日 下午2:28:32* @version 1.0*/@SuppressWarnings("rawtypes")public Map initKeyWord() {try {// 读取敏感词库Set<String> keyWordSet = readSensitiveWordFile();// 将敏感词库加入到HashMap中addSensitiveWordToHashMap(keyWordSet);// spring获取application,然后application.setAttribute("sensitiveWordMap",sensitiveWordMap);} catch (Exception e) {e.printStackTrace();}return sensitiveWordMap;}/*** 读取敏感词库,将敏感词放入HashSet中,构建一个DFA算法模型:<br>* 中 = { isEnd = 0 国 = {<br>* isEnd = 1 人 = {isEnd = 0 民 = {isEnd = 1} } 男 = { isEnd = 0 人 = { isEnd = 1 }* } } } 五 = { isEnd = 0 星 = { isEnd = 0 红 = { isEnd = 0 旗 = { isEnd = 1 } } } }* * @author chenming* @date 2014年4月20日 下午3:04:20* @param keyWordSet 敏感词库* @version 1.0*/@SuppressWarnings({ "rawtypes", "unchecked" })private void addSensitiveWordToHashMap(Set<String> keyWordSet) {sensitiveWordMap = new HashMap(keyWordSet.size()); // 初始化敏感词容器,减少扩容操作String key = null;Map nowMap = null;Map<String, String> newWorMap = null;// 迭代keyWordSetIterator<String> iterator = keyWordSet.iterator();while (iterator.hasNext()) {key = iterator.next(); // 关键字nowMap = sensitiveWordMap;for (int i = 0; i < key.length(); i++) {char keyChar = key.charAt(i); // 转换成char型Object wordMap = nowMap.get(keyChar); // 获取if (wordMap != null) { // 如果存在该key,直接赋值nowMap = (Map) wordMap;} else { // 不存在则,则构建一个map,同时将isEnd设置为0,因为他不是最后一个newWorMap = new HashMap<String, String>();newWorMap.put("isEnd", "0"); // 不是最后一个nowMap.put(keyChar, newWorMap);nowMap = newWorMap;}if (i == key.length() - 1) {nowMap.put("isEnd", "1"); // 最后一个}}}}/*** 读取敏感词库中的内容,将内容添加到set集合中* * @author chenming* @date 2014年4月20日 下午2:31:18* @return* @version 1.0* @throws Exception*/@SuppressWarnings("resource")private Set<String> readSensitiveWordFile() throws Exception {Set<String> set = null;File file = new File("D:/TEST/SensitiveWord.txt"); // 读取文件InputStreamReader read = new InputStreamReader(new FileInputStream(file), ENCODING);try {if (file.isFile() && file.exists()) { // 文件流是否存在set = new HashSet<String>();BufferedReader bufferedReader = new BufferedReader(read);String txt = null;while ((txt = bufferedReader.readLine()) != null) { // 读取文件,将文件内容放入到set中set.add(txt);}} else { // 不存在抛出异常信息throw new Exception("敏感词库文件不存在");}} catch (Exception e) {throw e;} finally {read.close(); // 关闭文件流}return set;}
}
敏感词过滤
检查文字中是否包含敏感字符
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;public class SensitivewordFilter {@SuppressWarnings("rawtypes")public Map sensitiveWordMap = null;public static int minMatchTYpe = 1; //最小匹配规则public static int maxMatchType = 2; //最大匹配规则/*** 构造函数,初始化敏感词库*/public SensitivewordFilter(){sensitiveWordMap = new SensitiveWordInit().initKeyWord();}/*** 判断文字是否包含敏感字符* @author chenming * @date 2014年4月20日 下午4:28:30* @param txt 文字* @param matchType 匹配规则 1:最小匹配规则,2:最大匹配规则* @return 若包含返回true,否则返回false* @version 1.0*/public boolean isContaintSensitiveWord(String txt,int matchType){boolean flag = false;for(int i = 0 ; i < txt.length() ; i++){int matchFlag = this.CheckSensitiveWord(txt, i, matchType); //判断是否包含敏感字符if(matchFlag > 0){ //大于0存在,返回trueflag = true;}}return flag;}/*** 获取文字中的敏感词* @author chenming * @date 2014年4月20日 下午5:10:52* @param txt 文字* @param matchType 匹配规则 1:最小匹配规则,2:最大匹配规则* @return* @version 1.0*/public Set<String> getSensitiveWord(String txt , int matchType){Set<String> sensitiveWordList = new HashSet<String>();for(int i = 0 ; i < txt.length() ; i++){int length = CheckSensitiveWord(txt, i, matchType); //判断是否包含敏感字符if(length > 0){ //存在,加入list中sensitiveWordList.add(txt.substring(i, i+length));i = i + length - 1; //减1的原因,是因为for会自增}}return sensitiveWordList;}/*** 替换敏感字字符* @author chenming * @date 2014年4月20日 下午5:12:07* @param txt* @param matchType* @param replaceChar 替换字符,默认** @version 1.0*/public String replaceSensitiveWord(String txt,int matchType,String replaceChar){String resultTxt = txt;Set<String> set = getSensitiveWord(txt, matchType); //获取所有的敏感词Iterator<String> iterator = set.iterator();String word = null;String replaceString = null;while (iterator.hasNext()) {word = iterator.next();replaceString = getReplaceChars(replaceChar, word.length());resultTxt = resultTxt.replaceAll(word, replaceString);}return resultTxt;}/*** 获取替换字符串* @author chenming * @date 2014年4月20日 下午5:21:19* @param replaceChar* @param length* @return* @version 1.0*/private String getReplaceChars(String replaceChar,int length){String resultReplace = replaceChar;for(int i = 1 ; i < length ; i++){resultReplace += replaceChar;}return resultReplace;}/*** 检查文字中是否包含敏感字符,检查规则如下:<br>* @author chenming * @date 2014年4月20日 下午4:31:03* @param txt* @param beginIndex* @param matchType* @return,如果存在,则返回敏感词字符的长度,不存在返回0* @version 1.0*/@SuppressWarnings({ "rawtypes"})public int CheckSensitiveWord(String txt,int beginIndex,int matchType){boolean flag = false; //敏感词结束标识位:用于敏感词只有1位的情况int matchFlag = 0; //匹配标识数默认为0char word = 0;Map nowMap = sensitiveWordMap;for(int i = beginIndex; i < txt.length() ; i++){word = txt.charAt(i);nowMap = (Map) nowMap.get(word); //获取指定keyif(nowMap != null){ //存在,则判断是否为最后一个matchFlag++; //找到相应key,匹配标识+1 if("1".equals(nowMap.get("isEnd"))){ //如果为最后一个匹配规则,结束循环,返回匹配标识数flag = true; //结束标志位为true if(SensitivewordFilter.minMatchTYpe == matchType){ //最小规则,直接返回,最大规则还需继续查找break;}}}else{ //不存在,直接返回break;}}if(matchFlag < 2 || !flag){ //长度必须大于等于1,为词 matchFlag = 0;}return matchFlag;}public static void main(String[] args) {SensitivewordFilter filter = new SensitivewordFilter();System.err.println(filter.sensitiveWordMap);System.out.println("敏感词的数量:" + filter.sensitiveWordMap.size());String string = "太多的伤感情怀也许只局限于饲养基地 荧幕中的情节,主人公尝试着去用某种方式渐渐的很潇洒地释自杀指南怀那些自己经历的伤感。"+ "然后法轮功 我们的扮演的角色就是跟随着主人公的喜红客联盟 怒哀乐而过于牵强的把自己的情感也附加于银幕情节中,然后感动就流泪,"+ "难过就躺在某一个人的怀里尽情的阐述心扉或者手机卡复制器一个人一杯红酒一部电影在夜三级片 深人静的晚上,关上电话静静的发呆着。";System.out.println("待检测语句字数:" + string.length());long beginTime = System.currentTimeMillis();Set<String> set = filter.getSensitiveWord(string, 1);long endTime = System.currentTimeMillis();System.out.println("语句中包含敏感词的个数为:" + set.size() + "。包含:" + set);System.out.println("总共消耗时间为:" + (endTime - beginTime));}
}
DFA实现模型
通过 CheckSensitiveWord 比较, 获取值得长度, 更具原始的位置, 可以定位值的坐标
转载与网络
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算法实现敏感词过滤
写项目时,得到一个新的需求,即实现敏感词的过滤,上网查了下,有几种实现方法,采取了DFA算法,即确定的有穷自动机算法,当初学习编译原理的时候为啥没想到DFA还能这么做,看来眼界和意识还是不够,得锻炼. ...
- 一种基于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 ...
最新文章
- 1476. Lunar Code
- iOS开发UI中懒加载的使用方法
- c# partial class 的用法
- Java Web 开发必须掌握的三个技术:Token、Cookie、Session
- 5G时代 我国在通信技术领域弯道超车指日可待
- 纠缠不清的C语言位域(位段)详解
- 【Flink】Pending record count must be zero at this point : 1
- 【每日算法Day 75】字节跳动面试题:手撕困难题,看过我Day 71的人都会做了!...
- Python安装jieba库
- VS中读取NMEA数据进行定位精度分析
- [good]使用Arduino操控RF 433Mhz射频发送器和接收器
- 【C语言】函数番外篇——递归
- Oracle 中的各种读
- 数据结构也不是那么没意思之中序二叉树+二叉树转伪双向循环链表
- opencv程序十一:鼠标绘图
- 跨浏览器书签同步(Floccus + WebDav)
- allegro Shape has connect lines attached 问题解决办法
- android编程高级教程 pdf,Android多媒体开发高级编程
- 如何重置ClearType设置?
- el-select 展示 2*2、1*1、3*3、4*4 视频 分屏展示
热门文章
- 【赶紧收藏】平面设计必备字体,广告设计常用字体
- 专题导读:基于大数据的知识图谱及其应用
- linux基础期末考试免费,linux基础期末考试试题.doc
- 解决vm安装过程显示无人参与应答文件包含的产品密钥无效
- nginx强制下载txt等文件
- sql-插入当前时间
- 台达A2/B2伺服电机编码器改功率软件 台达A2/B2伺服电机编码修改, 用于更换编码器写匹配电机参数
- 视频教程-网络安全技术(CCNA-HCNA)-网络技术
- 【Python】基于VB、Python、PythonGUI的BMI计算器小程序
- linux执行.sql文件,Linux下执行Oracle的sql脚本