JAVA敏感词快速检测、过滤

简介: 本文章参考借鉴于https://blog.csdn.net/weixin_45444807/article/details/132249763?ops_request_misc=&request_id=&biz_id=102&utm_term=%E6%95%8F%E6%84%9F%E8%AF%8D%E6%A3%80%E6%B5%8B&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-2-132249763.nonecase&spm=1018.2226.3001.4187

敏感词检测的实现方式可以分为以下几种:

  1. 基于关键词列表的检测: 这是最常见的敏感词检测方式。首先,建立一个敏感词库,包含各种敏感词汇。然后,遍历待检测的文本,查找是否包含敏感词库中的任何词汇。一旦匹配到敏感词,可以将其过滤、替换或标记为敏感内容。
  2. 基于正则表达式的检测: 使用正则表达式可以更灵活地匹配敏感词。将敏感词转化为适当的正则表达式,然后在文本中进行匹配。这种方法允许处理模糊匹配和变体。
  3. 基于机器学习的检测: 使用机器学习技术,可以训练模型来检测敏感内容。需要大量已知的敏感和非敏感文本样本来训练模型。一旦训练完成,模型可以自动识别新的文本中的敏感内容。常见的机器学习算法包括朴素贝叶斯、支持向量机(SVM)和深度学习模型等。

本次我采用的是基于关键词列表检测上升级的方法:

将敏感词库做成 前缀树 :

  1. 比如现在有几个敏感词:吊毛吃猪肉、吊毛很帅、你很帅、你很笨、ctm…我们可以将其按照树形结构,构造成这样:

在检测时,循环检测字符串,只要遇到有结束标识(图中绿色的部分),就表明存在敏感词,这样一来,不仅能够节省内存空间,还能够减少判断次数。

(前缀树段来源于摘要的连接,csdn的一篇敏感词文章~如有侵权请联系)


我具体的敏感词检测工具类代码实现如下

/**
 * 敏感词工具类
 */
public class TrieUtils {
    //通过map保存子树
    private Map<Character, TrieUtils> children;
    private boolean isEnd;
    public TrieUtils() {
        children = new HashMap<>();
        isEnd = false;
    }
    //将敏感词插入到前缀树中
    public void insert(String word) {
        TrieUtils node = this;
        for (int i = 0; i < word.length(); i++) {
            char ch = word.charAt(i);
            TrieUtils childrenNode = node.children.get(ch);
            if (childrenNode == null) {
                node.children.put(ch, new TrieUtils());
            }
            node = node.children.get(ch);
        }
        node.isEnd = true;
    }
    // 检测文本中是否包含敏感词,并返回第一个匹配到的敏感词
    public String detectSensitiveWord(String word, int start) {
        TrieUtils node = this;
        StringBuilder detectedWord = new StringBuilder();
        for (int i = start; i < word.length(); i++) {
            char ch = word.charAt(i);
            TrieUtils childrenNode = node.children.get(ch);
            if (childrenNode == null) {
                // 说明后面没有匹配的了
                break;
            } else {
                detectedWord.append(ch);
                node = childrenNode;
                if (node.isEnd) {
                    return detectedWord.toString(); // 返回检测到的敏感词
                }
            }
        }
        return null; // 没有匹配到敏感词
    }
    //检查一个单词是否存在敏感词
    public String sensitiveWord(String word) {
        //不断向前移动检查
        for (int i = 0; i < word.length(); i++) {
            if (!Objects.isNull(detectSensitiveWord(word, i))) {
                return detectSensitiveWord(word, i);
            }
        }
        return null;
    }
}


使用方法也很简单:

        TrieUtils trie = new TrieUtils();//new敏感词前缀树对象
        for (String s : SensitiveList) {
            trie.insert(s);//便利敏感词集合(敏感词可以存放在数据库中,需要的时候查询出来),把敏感词添加到前缀树中
        }
        if (!Objects.isNull(trie.sensitiveWord(entity))) {//调用sensitiveWord方法,传入你需要检测的文章内容
            return AjaxResult.error("包含敏感字符:" + trie.sensitiveWord(entity) + ",请修改");//如果有敏感词就会把检测到的第一个敏感词返回给前端
        }

谢谢浏览~

目录
相关文章
|
28天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
45 6
|
5月前
|
存储 算法 Java
Java面试题:深入探究Java内存模型与垃圾回收机制,解释JVM中堆内存和栈内存的主要区别,谈谈对Java垃圾回收机制的理解,Java中的内存泄漏及其产生原因,如何检测和解决内存泄漏问题
Java面试题:深入探究Java内存模型与垃圾回收机制,解释JVM中堆内存和栈内存的主要区别,谈谈对Java垃圾回收机制的理解,Java中的内存泄漏及其产生原因,如何检测和解决内存泄漏问题
68 0
|
2月前
|
安全 Java Python
基于python-django的Java网站全站漏洞检测系统
基于python-django的Java网站全站漏洞检测系统
35 0
|
4月前
|
监控 算法 安全
Java并发编程案例分析:死锁的检测与解决
Java并发编程案例分析:死锁的检测与解决
40 2
|
4月前
|
网络协议 Java
JAVA实现心跳检测【长连接】
这篇文章介绍了Java中实现心跳检测机制的方法,包括心跳机制的简介、实现方式、客户端和服务端的代码实现,以及具体的测试结果。文中详细阐述了如何通过自定义心跳包和超时检测来维持长连接,并提供了完整的客户端和服务端示例代码。
JAVA实现心跳检测【长连接】
|
5月前
|
SQL 安全 JavaScript
Java中的代码审计与漏洞检测
Java中的代码审计与漏洞检测
|
6月前
|
Java API Apache
探讨Java中检测字符串是否包含数字和字母的技术
探讨Java中检测字符串是否包含数字和字母的技术
93 2
|
5月前
|
SQL 安全 Java
Java中的代码审计与漏洞检测实践指南
Java中的代码审计与漏洞检测实践指南
|
6月前
|
监控 Java API
使用Java检测当前CPU负载状态的技术博客
使用Java检测当前CPU负载状态的技术博客
108 0
|
7月前
|
JavaScript Java 测试技术
Java项目基于ssm+vue.js的农产品质量安全检测网站附带文章和源代码设计说明文档ppt
Java项目基于ssm+vue.js的农产品质量安全检测网站附带文章和源代码设计说明文档ppt
29 0