我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java怎么使用DFA算法实现敏感词过滤

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java怎么使用DFA算法实现敏感词过滤

本篇内容主要讲解“Java怎么使用DFA算法实现敏感词过滤”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么使用DFA算法实现敏感词过滤”吧!

1 前言

敏感词过滤就是你在项目中输入某些字(比如输入xxoo相关的文字时)时要能检测出来,很多项目中都会有一个敏感词管理模块,在敏感词管理模块中你可以加入敏感词,然后根据加入的敏感词去过滤输入内容中的敏感词并进行相应的处理,要么提示,要么高亮显示,要么直接替换成其它的文字或者符号代替。

敏感词过滤的做法有很多,其中有比较常用的如下几种:

查询数据库当中的敏感词,循环每一个敏感词,然后去输入的文本中从头到尾搜索一遍,看是否存在此敏感词,有则做相应的处理,这种方式讲白了就是找到一个处理一个。

优点:so easy。用java代码实现基本没什么难度。

缺点:这效率是非常低的,如果是英文时你会发现一个很无语的事情,比如英文a是敏感词,那我如果是一篇英文文档,那程序它得处理多少次敏感词?谁能告诉我?

传说中的DFA算法(有限状态机),也正是我要给大家分享的,毕竟感觉比较通用,算法的原理希望大家能够自己去网上查查

资料,这里就不详细说明了。

优点:至少比上面那sb效率高点。

缺点:对于学过算法的应该不难,对于没学过算法的用起来也不难,就是理解起来有点gg疼,匹配效率也不高,比较耗费内存,

敏感词越多,内存占用的就越大。

2 代码实现

2.1 敏感词库初始化

在项目启动前读取数据,将敏感词加载到Map中,具体实现如下:

建表语句:

CREATE TABLE `sensitive_word` (  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',  `content` varchar(50) NOT NULL COMMENT '关键词',  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4; INSERT INTO `fuying`.`sensitive_word` (`id`, `content`, `create_time`, `update_time`) VALUES (1, '吴名氏', '2023-03-02 14:21:36', '2023-03-02 14:21:36');

实体类SensitiveWord.java:

package com.wkf.workrecord.tools.dfa.entity; import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.annotation.TableId;import com.baomidou.mybatisplus.annotation.TableName;import lombok.Data; import java.io.Serializable;import java.util.Date; @Data@TableName("sensitive_word")public class SensitiveWord implements Serializable {     private static final long serialVersionUID = 1L;     @TableId(value = "id", type = IdType.AUTO)    private Integer id;     private String content;     private Date createTime;     private Date updateTime; }

数据库持久类SensitiveWordMapper.java:

package com.wkf.workrecord.tools.dfa.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.wkf.workrecord.tools.dfa.entity.SensitiveWord; public interface SensitiveWordMapper extends BaseMapper<SensitiveWord> {}

service类SensitiveWordService.java和SensitiveWordServiceImpl.java:

package com.wkf.workrecord.tools.dfa.service; import com.baomidou.mybatisplus.extension.service.IService;import com.wkf.workrecord.tools.dfa.entity.SensitiveWord; import java.util.Set; public interface SensitiveWordService extends IService<SensitiveWord> {     Set<String> sensitiveWordFiltering(String text); }
package com.wkf.workrecord.tools.dfa.service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import com.wkf.workrecord.tools.dfa.mapper.SensitiveWordMapper;import com.wkf.workrecord.tools.dfa.SensitiveWordUtils;import com.wkf.workrecord.tools.dfa.entity.SensitiveWord;import org.springframework.stereotype.Service;import java.util.Set; @Servicepublic class SensitiveWordServiceImpl extends ServiceImpl<SensitiveWordMapper, SensitiveWord> implements SensitiveWordService{     @Override    public Set<String> sensitiveWordFiltering(String text) {        // 得到敏感词有哪些,传入2表示获取所有敏感词        return SensitiveWordUtils.getSensitiveWord(text, 2);    }}

敏感词过滤工具类SensitiveWordUtils:

package com.wkf.workrecord.tools.dfa; import com.wkf.workrecord.tools.dfa.entity.SensitiveWord;import lombok.extern.slf4j.Slf4j; import java.util.*; @Slf4j@SuppressWarnings("unused")public class SensitiveWordUtils {         public static final Map<Object, Object> sensitiveWordMap = new HashMap<>();         public static int minMatchTYpe = 1;         public static int maxMatchType = 2;         public static void initKeyWord(List<SensitiveWord> sensitiveWords) {        try {            // 从敏感词集合对象中取出敏感词并封装到Set集合中            Set<String> keyWordSet = new HashSet<>();            for (SensitiveWord s : sensitiveWords) {                keyWordSet.add(s.getContent().trim());            }            // 将敏感词库加入到HashMap中            addSensitiveWordToHashMap(keyWordSet);        }        catch (Exception e) {            log.error("初始化敏感词出错,", e);        }    }         private static void addSensitiveWordToHashMap(Set<String> keyWordSet) {        // 敏感词        String key;        // 用来按照相应的格式保存敏感词库数据        Map<Object, Object> nowMap;        // 用来辅助构建敏感词库        Map<Object, Object> newWorMap;        // 使用一个迭代器来循环敏感词集合        for (String s : keyWordSet) {            key = s;            // 等于敏感词库,HashMap对象在内存中占用的是同一个地址,所以此nowMap对象的变化,sensitiveWordMap对象也会跟着改变            nowMap = sensitiveWordMap;            for (int i = 0; i < key.length(); i++) {                // 截取敏感词当中的字,在敏感词库中字为HashMap对象的Key键值                char keyChar = key.charAt(i);                 // 判断这个字是否存在于敏感词库中                Object wordMap = nowMap.get(keyChar);                if (wordMap != null) {                    nowMap = (Map<Object, Object>) wordMap;                } else {                    newWorMap = new HashMap<>();                    newWorMap.put("isEnd", "0");                    nowMap.put(keyChar, newWorMap);                    nowMap = newWorMap;                }                 // 如果该字是当前敏感词的最后一个字,则标识为结尾字                if (i == key.length() - 1) {                    nowMap.put("isEnd", "1");                }                log.info("封装敏感词库过程:" + sensitiveWordMap);            }            log.info("查看敏感词库数据:" + sensitiveWordMap);        }    }         public static int getWordSize() {        return SensitiveWordUtils.sensitiveWordMap.size();    }         public static boolean isContainSensitiveWord(String txt, int matchType) {        boolean flag = false;        for (int i = 0; i < txt.length(); i++) {            int matchFlag = checkSensitiveWord(txt, i, matchType);            if (matchFlag > 0) {                flag = true;            }        }        return flag;    }         public static Set<String> getSensitiveWord(String txt, int matchType) {        Set<String> sensitiveWordList = new HashSet<>();         for (int i = 0; i < txt.length(); i++) {            int length = checkSensitiveWord(txt, i, matchType);            if (length > 0) {                // 将检测出的敏感词保存到集合中                sensitiveWordList.add(txt.substring(i, i + length));                i = i + length - 1;            }        }        return sensitiveWordList;    }         public static String replaceSensitiveWord(String txt, int matchType, String replaceChar) {        String resultTxt = txt;        Set<String> set = getSensitiveWord(txt, matchType);        Iterator<String> iterator = set.iterator();        String word;        String replaceString;        while (iterator.hasNext()) {            word = iterator.next();            replaceString = getReplaceChars(replaceChar, word.length());            resultTxt = resultTxt.replaceAll(word, replaceString);        }         return resultTxt;    }         private static String getReplaceChars(String replaceChar, int length) {        StringBuilder resultReplace = new StringBuilder(replaceChar);        for (int i = 1; i < length; i++) {            resultReplace.append(replaceChar);        }        return resultReplace.toString();    }         public static int checkSensitiveWord(String txt, int beginIndex, int matchType) {        boolean flag = false;        // 记录敏感词数量        int matchFlag = 0;        char word;        Map<Object, Object> nowMap = SensitiveWordUtils.sensitiveWordMap;        for (int i = beginIndex; i < txt.length(); i++) {            word = txt.charAt(i);            // 判断该字是否存在于敏感词库中            nowMap = (Map<Object, Object>) nowMap.get(word);            if (nowMap != null) {                matchFlag++;                // 判断是否是敏感词的结尾字,如果是结尾字则判断是否继续检测                if ("1".equals(nowMap.get("isEnd"))) {                    flag = true;                    // 判断过滤类型,如果是小过滤则跳出循环,否则继续循环                    if (SensitiveWordUtils.minMatchTYpe == matchType) {                        break;                    }                }            }            else {                break;            }        }        if (!flag) {            matchFlag = 0;        }        return matchFlag;    } }

项目启动完成后执行初始化敏感关键字StartInit.java:

package com.wkf.workrecord.tools.dfa; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.wkf.workrecord.tools.dfa.entity.SensitiveWord;import com.wkf.workrecord.tools.dfa.mapper.SensitiveWordMapper;import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;import javax.annotation.Resource;import java.util.List; @Componentpublic class StartInit {     @Resource    private SensitiveWordMapper sensitiveWordMapper;     @PostConstruct    public void init() {        // 从数据库中获取敏感词对象集合(调用的方法来自Dao层,此方法是service层的实现类)        List<SensitiveWord> sensitiveWords = sensitiveWordMapper.selectList(new QueryWrapper<>());        // 构建敏感词库        SensitiveWordUtils.initKeyWord(sensitiveWords);    } }

2.2 编写测试类

编写测试脚本测试效果.代码如下:

    @Test    public void sensitiveWordTest() {        Set<String> set = sensitiveWordService.sensitiveWordFiltering("吴名氏到此一游");        for (String string : set) {            System.out.println(string);        }    }

执行结果如下:

Java怎么使用DFA算法实现敏感词过滤

到此,相信大家对“Java怎么使用DFA算法实现敏感词过滤”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java怎么使用DFA算法实现敏感词过滤

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java怎么使用DFA算法实现敏感词过滤

本篇内容主要讲解“Java怎么使用DFA算法实现敏感词过滤”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么使用DFA算法实现敏感词过滤”吧!1 前言敏感词过滤就是你在项目中输入某些字(
2023-07-05

怎么在Java中使用DFA算法过滤敏感词

怎么在Java中使用DFA算法过滤敏感词?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。具体实现: 1、匹配大小写过滤 2、匹配全角半角过滤 3、匹配过滤停顿词过滤。 4、敏
2023-05-30

Java使用DFA算法实现敏感词过滤的示例代码

很多项目中都会有一个敏感词管理模块,本文主要介绍了Java使用DFA算法实现敏感词过滤的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-24

如何在java中使用DFA算法过滤敏感词

如何在java中使用DFA算法过滤敏感词?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。敏感词过滤的做法有很多,我简单描述我现在理解的几种:①查询数据库当中的敏感词,循环每一
2023-05-31

Python基于DFA算法怎么实现内容敏感词过滤

这篇文章主要讲解了“Python基于DFA算法怎么实现内容敏感词过滤”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python基于DFA算法怎么实现内容敏感词过滤”吧!DFA 算法是通过提前
2023-06-30

C# 敏感词过滤算法实现

DFA即Deterministic Finite Automaton,也就是确定有穷自动机,它是是通过event和当前的state得到下一个state,即event+state=nextstate。在实现敏感词过滤的算法中,我们必须要减少运
C#过滤算法2024-12-02

SpringBoot使用SensitiveWord实现敏感词过滤

这篇文章主要为大家详细介绍了SpringBoot如何使用SensitiveWord实现敏感词过滤功能,文中示例代码讲解详细,感兴趣的小伙伴可以了解一下
2023-01-14

如何在Java项目中利用DFA算法实现一个过滤敏感字功能

这期内容当中小编将会给大家带来有关如何在Java项目中利用DFA算法实现一个过滤敏感字功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。模式图直接上代码public class KeywordFilter
2023-05-31

JAVA使用前缀树(Tire树)实现敏感词过滤、词典搜索

本文主要介绍了JAVA使用前缀树(Tire树)实现敏感词过滤、词典搜索,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-01-03

SpringBoot使用前缀树过滤敏感词的方法是什么

这篇文章跟大家分析一下“SpringBoot使用前缀树过滤敏感词的方法是什么”。内容详细易懂,对“SpringBoot使用前缀树过滤敏感词的方法是什么”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着
2023-06-26

PHP中怎么使用Ajax判断是否有敏感词汇并过滤

这篇文章给大家介绍PHP中怎么使用Ajax判断是否有敏感词汇并过滤,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。敏感词汇数组sensitive.phpreturn array ( 0 => 111111,
2023-06-04

如何实现 Java 协同过滤算法?(java协同过滤算法怎么实现)

在Java开发中,协同过滤算法是一种常用的推荐系统算法,它通过分析用户的行为和偏好来推荐相关的物品或内容。以下是实现Java协同过滤算法的一般步骤:一、数据收集与预处理收集用户行为数据,如用户的浏览记录、购买
如何实现 Java 协同过滤算法?(java协同过滤算法怎么实现)
Java2024-12-20

怎么在java中使用Filter实现过滤

今天就跟大家聊聊有关怎么在java中使用Filter实现过滤,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应
2023-06-14

怎么使用Java实现常见的负载均衡算法

负载均衡算法在Java中的实现负载均衡算法平衡服务器请求,提高性能和可用性。以下是Java实现的常见算法:轮询:顺序分配请求。随机:随机分配请求。加权轮询:根据服务器容量分配请求。最小连接:分配给连接数最少的服务器。哈希:基于请求键分配请求。基于权重的哈希:考虑服务器权重分配请求。代码示例提供了每个算法的Java实现。根据应用程序需求选择合适的算法,如简单应用程序使用轮询,并发请求使用加权轮询或哈希。
怎么使用Java实现常见的负载均衡算法
2024-04-13

怎么使用Java实现常见的负载均衡算法

在Java中实现常见的负载均衡算法,可以使用以下几种方法:轮询算法(Round Robin):实现一个列表来存储服务器节点,并使用一个计数器来记录当前选取的节点位置。每次请求到来时,通过计数器选择下一个节点,并更新计数器位置。这样可以实现简
怎么使用Java实现常见的负载均衡算法
2024-04-09

使用Java怎么实现一个猴子吃桃问题算法

使用Java怎么实现一个猴子吃桃问题算法?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。猴子吃桃问题概述:猴子第一天摘下N个桃子,当时就吃了一半,还不过瘾,就又吃了一个;第二天又
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录