java过滤敏感词汇_Java过滤敏感词语/词汇---DFA算法

本文介绍了一个Java实现的敏感词过滤工具,使用DFA算法,通过读取敏感词库文件构建敏感词数据结构,并提供方法检查文本中是否包含敏感字符,支持最小匹配和最大匹配规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

packagecom.test.util;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStreamReader;importjava.util.HashMap;importjava.util.HashSet;importjava.util.Iterator;importjava.util.Map;importjava.util.Set;importorg.springframework.stereotype.Component;/*** Utils - 敏感词

*

*@authortest

*@version3.0*/@Componentpublic classDirtyStringUtil {private static String ENCODING = "UTF-8"; //字符编码

private static String PATH = "/resources/shop/dirtyString/DirtyString.txt"; //你的敏感词汇的文件 我会给大家分享一个我们用的

public static int minMatchTYpe = 1; //最小匹配规则

public static int maxMatchType = 2; //最大匹配规则

@SuppressWarnings("rawtypes")public staticHashMap sensitiveWordMap;static{try{

sensitiveWordMap= addSensitiveWordToHashMap(StringUtils.sourFolder+PATH);

}catch(Exception e) {

}

}/*** 读取敏感词库,将敏感词放入HashSet中,构建一个DFA算法模型:

* 中 = {

* isEnd = 0

* 国 = {

* isEnd = 1

* 人 = {isEnd = 0

* 民 = {isEnd = 1}

* }

* 男 = {

* isEnd = 0

* 人 = {

* isEnd = 1

* }

* }

* }

* }

* 五 = {

* isEnd = 0

* 星 = {

* isEnd = 0

* 红 = {

* isEnd = 0

* 旗 = {

* isEnd = 1

* }

* }

* }

* }

* @date 2014年4月20日 下午3:04:20

*@paramkeyWordSet 敏感词库

*@version1.0*/@SuppressWarnings({"rawtypes", "unchecked"})private staticHashMap addSensitiveWordToHashMap(String path) {

Set keyWordSet = null;

File file= new File(path); //读取文件

InputStreamReader read = null;try{

read= new InputStreamReader(newFileInputStream(file),ENCODING);if(file.isFile() && file.exists()){ //文件流是否存在

keyWordSet = new HashSet();

@SuppressWarnings("resource")

BufferedReader bufferedReader= newBufferedReader(read);

String txt= null;while((txt = bufferedReader.readLine()) != null){ //读取文件,将文件内容放入到set中

keyWordSet.add(txt);

}

}else{ //不存在抛出异常信息

throw new Exception("敏感词库文件不存在");

}

}catch(Exception e) {

e.printStackTrace();

}finally{try { //关闭文件流

if (read != null) {

read.close();

}

}catch(IOException e) {

e.printStackTrace();

}

}

HashMap sensitiveWordMap= new HashMap(keyWordSet.size()); //初始化敏感词容器,减少扩容操作

String key = null;

Map nowMap= null;

Map newWorMap = null;//迭代keyWordSet

Iterator 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();

newWorMap.put("isEnd", "0"); //不是最后一个

nowMap.put(keyChar, newWorMap);

nowMap=newWorMap;

}if(i == key.length() - 1){

nowMap.put("isEnd", "1"); //最后一个

}

}

}returnsensitiveWordMap;

}/*** 检查文字中是否包含敏感字符,检查规则如下:

* @date 2014年4月20日 下午4:31:03

*@paramtxt

*@parambeginIndex

*@parammatchType

*@return,如果存在,则返回敏感词字符的长度,不存在返回0

*@version1.0*/@SuppressWarnings({"rawtypes"})public static int CheckSensitiveWord(String txt, Map nowMap, int beginIndex,intmatchType){boolean flag = false; //敏感词结束标识位:用于敏感词只有1位的情况

int matchFlag = 0; //匹配标识数默认为0

char word = 0;for(int i = beginIndex; i < txt.length() ; i++){

word=txt.charAt(i);

nowMap= (Map) nowMap.get(word); //获取指定key

if(nowMap != null){ //存在,则判断是否为最后一个

matchFlag++; //找到相应key,匹配标识+1

if("1".equals(nowMap.get("isEnd"))){ //如果为最后一个匹配规则,结束循环,返回匹配标识数

flag = true; //结束标志位为true

if(minMatchTYpe == matchType){ //最小规则,直接返回,最大规则还需继续查找

break;

}

}

}else{ //不存在,直接返回

break;

}

}if(matchFlag < 2 || !flag){ //长度必须大于等于1,为词

matchFlag = 0;

}returnmatchFlag;

}/*** 判断文字是否包含敏感字符

* @date 2014年4月20日 下午4:28:30

*@parampath 敏感词库文件路径

*@paramtxt 文字

*@parammatchType 匹配规则 1:最小匹配规则,2:最大匹配规则

*@return若包含返回true,否则返回false

*@version1.0*/

public static boolean isContaintSensitiveWord(String txt, intmatchType){boolean flag = false;for(int i = 0 ; i < txt.length() ; i++){int matchFlag = CheckSensitiveWord(txt, sensitiveWordMap, i, matchType); //判断是否包含敏感字符

if(matchFlag > 0){ //大于0存在,返回true

flag = true;

}

}returnflag;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值