基于 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/945961.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker-开源nocodb,使用已有数据库

使用已有数据库 创建本地数据库 数据库&#xff1a;nocodb 用户&#xff1a;nocodb 密码&#xff1a;xxxxxx修改docker-compose.yml 默认网关的 IP 地址是 172.17.0.1&#xff08;适用于 bridge 网络模式&#xff09;version: "2.1" services:nocodb:environment:…

BetterBench的2024年终总结

回忆录 去年的年末定的2024目标是阅读300篇文献&#xff0c;发表一篇小论文&#xff0c;阅读20本的目标&#xff0c;都没有如期完成。只读了130篇论文&#xff0c;小论文还只写了初稿&#xff0c;还没有投出去&#xff0c;只读了6本书&#xff0c;上半年很浮躁&#xff0c;都没…

编辑音频的基本属性

导入音频 “文件-导入-选择音频”拖到音频轨道创建序列。选择音频&#xff0c;在效果空间可以看到音频的基本属性。 音量的设置 “效果工作区-效果控件-音量”在这里可以控制所有引导的混合音量 静音 静止所有声音 音频仪表 一般位于时间轴的后面&#xff0c;找不到可以…

SQL 基础教程 - SQL SELECT 语句

SQL SELECT DISTINCT 语句 SELECT DISTINCT 语句用于返回唯一不同的值。 在表中&#xff0c;一个列可能会包含多个重复值&#xff0c;有时您也许希望仅仅列出不同&#xff08;distinct&#xff09;的值。 DISTINCT 关键词用于返回唯一不同的值。 SQL SELECT DISTINCT 语法 …

Oracle 回归分析函数使用

Oracle 回归分析函数使用 文章目录 Oracle 回归分析函数使用什么是 回归分析函数回归分析函数示例1. 分析 SAL 和 COMM 之间的回归关系2. 按部门分析 SAL 和 COMM 的关系3. 根据 SAL 预测 COMM4. 分析员工薪资与工作年限的关5. 按部门分析工作年限与薪资的关系6. 计算 REGR_AVG…

idea项目导入gitee 码云

1、安装gitee插件 IDEA 码云插件已由 gitosc 更名为 gitee。 1 在码云平台帮助文档http://git.mydoc.io/?t153739上介绍的很清楚&#xff0c;推荐前两种方法&#xff0c; 搜索码云插件的时候记得名字是gitee&#xff0c;gitosc已经搜不到了。 2、使用码云托管项目 如果之…

Cesium 实战 27 - 三维视频融合(视频投影)

Cesium 实战 27 - 三维视频融合(视频投影) 核心代码完整代码在线示例在 Cesium 中有几种展示视频的方式,比如墙体使用视频材质,还有地面多边形使用视频材质,都可以实现视频功能。 但是随着摄像头和无人机的流行,需要视频和场景深度融合,简单的实现方式则不能满足需求。…

spring boot的各个版本介绍

Spring Boot 是一个用于创建独立、生产级别的基于 Spring 的应用程序的框架。自2014年首次发布以来&#xff0c;Spring Boot 经历了多个版本的迭代&#xff0c;每个版本都带来了新特性、性能改进和错误修复。下面是对Spring Boot一些主要版本的简要介绍&#xff1a; Spring Boo…

基于zynq在linux下的HDMI实战

ZYNQ系列文章目录 第一章&#xff1a;基于zynq在linux下的phy调试记录 第二章&#xff1a;qemu制作ubuntu文件系统 第三章&#xff1a;基于zynq在linux下的AXI-CAN实战 第四章&#xff1a;基于zynq在linux下的HDMI实战 文章目录 ZYNQ系列文章目录前言一、vivado中HDMI的配置1.…

LabVIEW 实现自动对焦的开发

自动对焦&#xff08;Autofocus, AF&#xff09;技术是通过分析图像或传感器信号&#xff0c;动态调整焦点位置以实现清晰成像或高精度定位的过程。在LabVIEW中&#xff0c;可以通过集成信号采集、数据处理、控制算法和硬件接口模块&#xff0c;实现多种自动对焦方法&#xff0…

机器人C++开源库The Robotics Library (RL)使用手册(四)

建立自己的机器人3D模型和运动学模型 这里以国产机器人天机TR8为例,使用最普遍的DH运动学模型,结合RL所需的描述文件,进行生成。 最终,需要的有两个文件,一个是.wrl三维模型描述文件;一个是.xml运动学模型描述文件。 1、通过STEP/STP三维文件生成wrl三维文件 机器人的…

直播电商系统源码搭建实战:快速开发多商户带货APP的指南

今天&#xff0c;笔者将从源码选择、功能设计、开发流程等方面&#xff0c;带你了解如何快速开发一个高效实用的直播电商系统。 一、明确需求&#xff1a;功能设计是基础 以下是一个多商户直播电商系统的核心功能模块&#xff1a; -商户管理模块 -直播带货模块 -商品管理模…

风力涡轮机缺陷检测数据集,86.6%准确识别率,11921张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注

风力涡轮机缺陷检测数据集&#xff0c;86.6&#xff05;准确识别率&#xff0c;11921张图片&#xff0c;支持yolo&#xff0c;PASICAL VOC XML&#xff0c;COCO JSON格式的标注 数据集下载 yolov11&#xff1a; https://download.csdn.net/download/pbymw8iwm/90206849 yolov…

委外加工业务如何调整原材料的消耗-MIGO A11-后续调整

业务背景&#xff1a;用户反馈委外加工业务回收后&#xff0c;产品已经销售&#xff0c;但委外加工结算时要对原材料消耗时行调整。如果没有销售&#xff0c;准备采用收货冲销后重新收货&#xff0c;但现在已经是2024年最后一天了。。。销售业务已经做完。不可能再冲销。其实这…

ultralytics库RT-DETR代码解析

最近读了maskformer以及maskdino的分割头设计&#xff0c;于是想在RT-DETR上做一个分割的改动&#xff0c;所以选择在ultralytics库中对RTDETR进行改进。 本文内容简介&#xff1a; 1.ultralytics库中RT-DETR模型解析 2. 对ultralytics库中的RT-DETR模型增加分割头做实例分割 …

25. C++继承 1 (继承的概念与基础使用, 继承的复制兼容规则,继承的作用域)

⭐上篇模板文章&#xff1a;24. C模板 2 (非类型模板参数&#xff0c;模板的特化与模板的分离编译)-CSDN博客 ⭐本篇代码&#xff1a;c学习 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) ⭐标⭐是比较重要的部分 目录 一. 继承的基础使用 1.1 继承的格式 1.2 …

宽带、光猫、路由器、WiFi、光纤之间的关系

1、宽带&#xff08;Broadband&#xff09; 1.1 宽带的定义宽带指的是一种高速互联网接入技术&#xff0c;通常包括ADSL、光纤、4G/5G等不同类型的接入方式。宽带的关键特点是能够提供较高的数据传输速率&#xff0c;使得用户可以享受到稳定的上网体验。 1.2 宽带的作用宽带是…

【AndroidAPP】权限被拒绝:[android.permission.READ_EXTERNAL_STORAGE],USB设备访问权限系统报错

一、问题原因 1.安卓安全性变更 Android 12 的安全性变更&#xff0c;Google 引入了更严格的 PendingIntent 安全管理&#xff0c;强制要求开发者明确指定 PendingIntent 的可变性&#xff08;Mutable&#xff09;或不可变性&#xff08;Immutable&#xff09;。 但是&#xf…

Inno Setup生成exe安装包

Inno Setup生成exe安装包 第一步&#xff1a;创建一个带向导的脚本文件 第二步&#xff1a;直接 Next&#xff0c;不要创建空的脚本文件 第三步&#xff1a;填写相关的应用程序信息 第四步&#xff1a;指定应用程序的安装目录相关的信息 第五步&#xff1a;选择可执行程序和相…

数据库MHA

MHA 什么是MHA -------- MASTER HIGH AVAILABILITY 建立在主从复制基础之上的故障切换到软件系统 主从复制的单点问题&#xff1a; 当主从复制当中&#xff0c;主服务器发生故障&#xff0c;会自动切换到一台从服务器&#xff0c;然后把从服务器升格为主&#xff0c;继续主…