基于 SensitiveWordBs 实现敏感词过滤功能

在现代的互联网应用中,敏感词过滤已成为一个必不可少的功能,尤其是在社交媒体、评论审核等需要保证内容健康的场景下。本文将基于开源库https://github.com/houbb/sensitive-word,详细讲解如何通过自定义敏感词库和工具类实现高效的敏感词过滤功能。

1. 项目依赖

首先需要引入 sensitive-word 相关的 Maven 依赖:

xml 复制代码
<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>sensitive-word</artifactId>
    <version>1.4.1</version>
</dependency>

2. 配置敏感词过滤组件

下面是核心的敏感词过滤配置代码,通过 SensitiveWordBs 构建过滤器,并加载自定义敏感词和允许词。
配置类代码

java 复制代码
package cn.yujky.study.sensitive.config;

import cn.yujky.study.sensitive.service.impl.MyWordAllowImpl;
import cn.yujky.study.sensitive.service.impl.MyWordDenyImpl;
import com.github.houbb.sensitive.word.bs.SensitiveWordBs;
import com.github.houbb.sensitive.word.support.allow.WordAllows;
import com.github.houbb.sensitive.word.support.deny.WordDenys;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;gframework.context.annotation.Configuration;

/**
 * 敏感词配置
 */
@Slf4j
@Configuration
public class SensitiveWordConfig {

    @Autowired
    private MyWordDenyImpl myWordDeny;

    @Autowired
    private MyWordAllowImpl myWordAllow;

    /**
     * 初始化敏感词过滤器
     *
     * @return 配置好的敏感词过滤引导类
     */
    @Bean
    public SensitiveWordBs sensitiveWordBs() {
        log.info("本地敏感词库初始化中...");
        SensitiveWordBs init = SensitiveWordBs.newInstance()
                .wordDeny(WordDenys.chains(WordDenys.defaults(), myWordDeny))
                .wordAllow(WordAllows.chains(WordAllows.defaults(), myWordAllow))
                .init();
        log.info("本地敏感词库初始化完成");
        return init;
    }
}

3 自定义敏感词库

通过实现 WordDeny 和 WordAllow 接口,可以分别配置屏蔽词和允许词。以下是示例代码:

3.1 自定义屏蔽词(MyWordDenyImpl)

java 复制代码
package cn.yujky.study.sensitive.service.impl;

import com.github.houbb.sensitive.word.api.IWordDeny;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;

/**
 * @name: MyWordDeny
 * @description: <p></p>
 * @author: yujky
 * @date: 2024/12/27 11:18
 */
@Slf4j
@Service
@AllArgsConstructor
public class MyWordDenyImpl implements IWordDeny {
    private final ResourceLoader resourceLoader;

    @Override
    public List<String> deny() {
        // 加载resource目录下的sensiticeWord.txt文本中的敏感词
        Resource resource = resourceLoader.getResource("classpath:sensiticeWord.txt");
        // 将文件内容读取为字符串
        try {
            String content = null;
            content = new String(Files.readAllBytes(Paths.get(resource.getURI())));
            log.info("敏感词库加载完成,敏感词数量为:{}", content.split("\\n").length);
            log.info("敏感词库加载完成,敏感词:\\n {}", content);
            // 按换行分割
            return Arrays.stream(content.split("\\n")).distinct().toList();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

这里的敏感词库我是直接放在resource目录下的sensiticeWord.txt文本中,你也可以改为从数据库或者其他存储工具中读取

3.2 自定义允许词(MyWordAllowImpl)

java 复制代码
package cn.yujky.study.sensitive.service.impl;

import com.github.houbb.sensitive.word.api.IWordAllow;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;

/**
 * @name: MyWordAllowImpl
 * @description: <p></p>
 * @author: yujky
 * @date: 2024/12/27 11:20
 */
@Service
public class MyWordAllowImpl implements IWordAllow {
    @Override
    public List<String> allow() {
        return Arrays.asList("五星红旗");
    }
}

4. 清洗文本工具类

在敏感词检测前,通常需要对文本进行预处理,例如移除特殊字符、表情符号等。以下是清洗文本的工具类示例代码:

java 复制代码
package cn.yujky.study.sensitive;

@Slf4j
public class SensitiveTextCleaner {

    /**
     * 移除 Emoji 表情
     *
     * @param text 输入文本
     * @return 清洗后的文本
     */
    public static String removeEmojis(String text) {
        String emojiRegex = "[\\x{1F600}-\\x{1F64F}\\x{1F300}-\\x{1F5FF}\\x{1F680}-\\x{1F6FF}\\x{1F700}-\\x{1F77F}\\x{1F780}-\\x{1F7FF}\\x{1F800}-\\x{1F8FF}\\x{1F900}-\\x{1F9FF}\\x{1FA00}-\\x{1FA6F}\\x{1FA70}-\\x{1FAFF}\\x{2600}-\\x{26FF}\\x{2700}-\\x{27BF}]";
        return text.replaceAll(emojiRegex, "");
    }

    /**
     * 移除特殊字符
     *
     * @param text 输入文本
     * @return 清洗后的文本
     */
    public static String removeSpecialCharacters(String text) {
        return text.replaceAll("[^a-zA-Z0-9\u4e00-\u9fa5]", "");
    }

    /**
     * 综合清洗文本(移除表情与特殊字符)
     *
     * @param text 输入文本
     * @return 清洗后的文本
     */
    public static String cleanText(String text) {
        text = removeEmojis(text); // 移除 Emoji
        text = removeSpecialCharacters(text); // 移除特殊字符
        return text.trim().toLowerCase(); // 转小写并去除多余空格
    }
}

5. 敏感词过滤测试

在 Spring Boot 项目中通过单元测试验证过滤功能,以下为完整的测试代码:

java 复制代码
package cn.yujky.study.sensitive;

import com.github.houbb.sensitive.word.bs.SensitiveWordBs;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@Slf4j
@SpringBootTest
class YujkySensitiveApplicationTests {

    @Autowired
    private SensitiveWordBs sensitiveWordBs;

    @Test
    void contextLoads() {
        String text = "操&他🐎";
        String cleanText = SensitiveTextCleaner.cleanText(text);
        log.info("原文本: {}, 清洗后文本: {}", text, cleanText);

        // 检查是否包含敏感词
        boolean containsOriginal = sensitiveWordBs.contains(text);
        boolean containsCleaned = sensitiveWordBs.contains(cleanText);
        log.info("是否包含敏感词(原文本): {}", containsOriginal);
        log.info("是否包含敏感词(清洗后文本): {}", containsCleaned);

        // 控制台输出
        System.out.println("原文本检测结果: " + containsOriginal);
        System.out.println("清洗后文本检测结果: " + containsCleaned);
    }
}

5.1 测试结果示例

假设敏感词库中包含 "操" 和 "他":

bash 复制代码
原文本: 操&他🐎, 清洗后文本: 操他
是否包含敏感词(原文本): false
是否包含敏感词(清洗后文本): true

这里建议对原文本以及清洗后的文本都进行一次检测,增加敏感词的检测力度

如果你在开发过程中有其他需求或问题,欢迎交流!
https://web.yujky.cn/

用户名:cxks

密码: cxks123

相关推荐
Java知识日历1 小时前
【内含例子代码】Spring框架的设计模式应用(第二集)
java·开发语言·后端·spring·设计模式
尘浮生3 小时前
Java项目实战II基于微信小程序的家庭大厨(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven
Java知识技术分享4 小时前
spring boot通过文件配置yaml里面的属性
java·spring boot·后端
一休哥助手4 小时前
深入解析Spring Boot项目的类加载与启动流程
java·spring boot·后端
丁总学Java4 小时前
定义一个名为 MyCache 的 Spring 配置类
java·spring
m0_634601664 小时前
2025.1.2
java·服务器·数据库
闲人一枚(学习中)7 小时前
springboot整合Quartz实现定时任务
java·spring boot·后端
毕业设计-017 小时前
0032.基于SpringBoot的CSGO赛事管理系统+论文
java·spring boot·后端