当前位置: 首页 > article >正文

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

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

1. 项目依赖

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

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>sensitive-word</artifactId>
    <version>1.4.1</version>
</dependency>

2. 配置敏感词过滤组件

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

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)

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)

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. 清洗文本工具类

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

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 项目中通过单元测试验证过滤功能,以下为完整的测试代码:

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 测试结果示例

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

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

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

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


http://www.kler.cn/a/459112.html

相关文章:

  • 前端编码技巧与规范
  • AWS S3文件存储工具类
  • 解决chatgpt(mac app登陆)出现报错:获取您的 SSO 信息时出错
  • 嵌入式入门Day35
  • Redis Stream:实时数据处理的高效解决方案
  • WebRTC的三大线程
  • 微信小程序:正确输出<小于,大于>符号
  • !倒序数 !
  • 算法每日双题精讲 —— 滑动窗口(水果成篮,找到字符串中所有字母异位词)
  • 旧衣回收小程序开发,绿色生活,便捷回收
  • PyQt的介绍
  • jvm-基础篇
  • docker中使用nginx
  • uniapp通过v-if进行判断时,会出现闪屏?【已解决】
  • 在docker中对MySQL快速部署与初始数据
  • 游戏引擎学习第67天
  • Claude 官方发布《构建高效的 Agents 指南》全文翻译版,附中英文 PDF 下载
  • 一个最简单的ios程序(object_c)的编写
  • 2024年中国新能源汽车用车发展怎么样 PaperGPT(二)
  • 基于Oauth2的SSO单点登录---后端
  • C++ 设计模式:原型模式(Prototype Pattern)
  • Slate文档编辑器-Decorator装饰器渲染调度
  • uniapp:编译微信、h5都正常的,编译钉钉小程序无法找到页面
  • Flutter富文本实现学习
  • --gdb
  • QWEN2 模型架构配置;GGUF的概念:实现量化存储