sensitive-word:一个简单易用的敏感词过滤框架

作者:勇哥Java实战日期:2025/10/9

这篇文章,分享一个开源项目:sensitive-word

Github 地址:github.com/houbb/sensi…

sensitive-word 是一个功能强大的 Java 敏感词过滤框架,它不仅提供了基础的敏感词检测功能,还支持单词标签分类分级、繁简体互换、全角半角互换、汉字转拼音、模糊搜索等高级特性。

它的核心特性如下:

  • 🚀 高性能: 基于 DFA 算法,匹配效率极高
  • 🏷️ 标签分类: 支持敏感词分类分级管理
  • 🔄 字符处理: 支持繁简体、全角半角互换
  • 🎯 模糊搜索: 支持拼音、形似字等模糊匹配
  • 📦 开箱即用: 简单配置即可快速集成

1 基础使用

1<dependency>
2    <groupId>com.github.houbb</groupId>
3    <artifactId>sensitive-word</artifactId>
4    <version>0.29.2</version>
5</dependency>
6

SensitiveWordHelper 作为敏感词的工具类,核心方法如下:

示例代码:

1import com.github.houbb.sensitive.word.core.SensitiveWordHelper;
23public class BasicExample {
4    public static void main(String[] args) {
5          String text = "这是一个包含赌博和毒品等不良内容的测试文本";
6       // 检测是否包含敏感词
7          boolean hasSensitive = SensitiveWordHelper.contains(text);
8          System.out.println("是否包含敏感词: " + hasSensitive);
910          // 查找所有敏感词
11          List<String> sensitiveWords = SensitiveWordHelper.findAll(text);
12          System.out.println("发现的敏感词: " + sensitiveWords);
1314          // 替换敏感词
15          String cleanedText = SensitiveWordHelper.replace(text);
16          System.out.println("清洗后文本: " + cleanedText);
1718          // 使用指定字符替换
19          String customReplaced = SensitiveWordHelper.replace(text, '*');
20          System.out.println("自定义替换: " + customReplaced);
21      }
22}
23

执行结果:

2 特殊处理

sensitive-word 为了尽可能的提升敏感词命中率,针对各种各种情况做了处理。

1、忽略大小写

1final String text = "fuCK the bad words.";
23String word = SensitiveWordHelper.findFirst(text);
4Assert.assertEquals("fuCK", word);
5

2、忽略圆角半角

1final String text = "fuck the bad words.";
23String word = SensitiveWordHelper.findFirst(text);
4Assert.assertEquals("fuck", word);
5

3、忽略数字的写法

1final String text = "这个是我的微信:9⓿二肆⁹₈③⑸⒋➃㈤㊄";
23List<String> wordList = SensitiveWordBs.newInstance().enableNumCheck(true).init().findAll(text);
4Assert.assertEquals("[9⓿二肆⁹₈③⑸⒋➃㈤㊄]", wordList.toString());
5

4、忽略繁简体

1final String text = "我爱我的祖国和五星紅旗。";
23List<String> wordList = SensitiveWordHelper.findAll(text);
4Assert.assertEquals("[五星紅旗]", wordList.toString());
5

5、忽略英文的书写格式

1final String text = "Ⓕⓤc⒦ the bad words";
23List<String> wordList = SensitiveWordHelper.findAll(text);
4Assert.assertEquals("[Ⓕⓤc⒦]", wordList.toString());
5

6、忽略重复词

1final String text = "ⒻⒻⒻfⓤuⓤ⒰cⓒ⒦ the bad words";
23List<String> wordList = SensitiveWordBs.newInstance()
4        .ignoreRepeat(true)
5        .init()
6        .findAll(text);
7Assert.assertEquals("[ⒻⒻⒻfⓤuⓤ⒰cⓒ⒦]", wordList.toString());
8

3 更多检测策略

sensitive-word 支持数字、邮箱、URL 、ipv4 多种检测策略。

示例代码:

1public class SensitiveWordQuickDemo {
23    public static void main(String[] args) {
4        // 邮箱检测
5        String text1 = "楼主好人,邮箱 [email protected]";
6        List<String> emailWords = SensitiveWordBs.newInstance()
7                .enableEmailCheck(true)
8                .init()
9                .findAll(text1);
10        System.out.println("邮箱检测: " + emailWords);
1112        // 数字检测
13        String text2 = "你懂得:12345678";
14        List<String> numWords = SensitiveWordBs.newInstance()
15                .enableNumCheck(true)
16                .init()
17                .findAll(text2);
18        System.out.println("数字检测: " + numWords);
1920        // URL 检测
21        String text3 = "点击链接 https://www.baidu.com 查看答案,当然也可以是 baidu.com、www.baidu.com";
22        List<String> urlWords = SensitiveWordBs.newInstance()
23                .enableUrlCheck(true)
24                .wordCheckUrl(WordChecks.urlNoPrefix())
25                .init()
26                .findAll(text3);
27        System.out.println("URL 检测: " + urlWords);
2829        // IPv4 检测
30        String text4 = "个人网站,如果网址打不开可以访问 127.0.0.1。";
31        List<String> ipWords = SensitiveWordBs.newInstance()
32                .enableIpv4Check(true)
33                .init()
34                .findAll(text4);
35        System.out.println("IPv4 检测: " + ipWords);
36    }
3738}
39

显示结果:

4 优雅 API

为了让使用更加优雅,统一使用 fluent-api 的方式定义。

用户可以使用 SensitiveWordBs 进行如下定义:

注意:配置后,要使用我们新定义的 SensitiveWordBs 的对象,而不是以前的工具方法。工具方法配置都是默认的。

1public class AdvancedExample {
23    public static void main(String[] args) {
4        SensitiveWordBs wordBs = SensitiveWordBs.newInstance()
5                .ignoreCase(true)
6                .ignoreWidth(true)
7                .ignoreNumStyle(true)
8                .ignoreChineseStyle(true)
9                .ignoreEnglishStyle(true)
10                .ignoreRepeat(false)
11                .enableNumCheck(false)
12                .enableEmailCheck(false)
13                .enableUrlCheck(false)
14                .enableIpv4Check(false)
15                .enableWordCheck(true)
16                .wordFailFast(true)
17                .wordCheckNum(WordChecks.num())
18                .wordCheckEmail(WordChecks.email())
19                .wordCheckUrl(WordChecks.url())
20                .wordCheckIpv4(WordChecks.ipv4())
21                .wordCheckWord(WordChecks.word())
22                .numCheckLen(8)
23                .wordTag(WordTags.none())
24                .charIgnore(SensitiveWordCharIgnores.defaults())
25                .wordResultCondition(WordResultConditions.alwaysTrue())
26                .init();
2728        final String text = "五星红旗迎风飘扬,毛主席的画像屹立在天安门前。";
29        System.out.println(wordBs.contains(text));
30        System.out.println(wordBs.findFirst(text));
31    }
3233}
34

5 定义词库

01 新增删除敏感词

初始化之后,sensitive-word 支持对单个词的新增/删除。

  • addWord(word) 新增敏感词,支持单个词/集合
  • removeWord(word) 删除敏感词,支持单个词/集合

示例代码:

1final String text = "测试一下新增敏感词,验证一下删除和新增对不对";
23SensitiveWordBs sensitiveWordBs =
4SensitiveWordBs.newInstance()
5        .wordAllow(WordAllows.empty())
6        .wordDeny(WordDenys.empty())
7        .init();
89// 当前
10Assert.assertEquals("[]", sensitiveWordBs.findAll(text).toString());
1112// 新增单个
13sensitiveWordBs.addWord("测试");
14sensitiveWordBs.addWord("新增");
15Assert.assertEquals("[测试, 新增, 新增]", sensitiveWordBs.findAll(text).toString());
1617// 删除单个
18sensitiveWordBs.removeWord("新增");
19Assert.assertEquals("[测试]", sensitiveWordBs.findAll(text).toString());
20sensitiveWordBs.removeWord("测试");
21Assert.assertEquals("[]", sensitiveWordBs.findAll(text).toString());
2223// 新增集合
24sensitiveWordBs.addWord(Arrays.asList("新增", "测试"));
25Assert.assertEquals("[测试, 新增, 新增]", sensitiveWordBs.findAll(text).toString());
26// 删除集合
27sensitiveWordBs.removeWord(Arrays.asList("新增", "测试"));
28Assert.assertEquals("[]", sensitiveWordBs.findAll(text).toString());
2930// 新增数组
31sensitiveWordBs.addWord("新增", "测试");
32Assert.assertEquals("[测试, 新增, 新增]", sensitiveWordBs.findAll(text).toString());
33// 删除集合
34sensitiveWordBs.removeWord("新增", "测试");
35Assert.assertEquals("[]", sensitiveWordBs.findAll(text).toString());
36

02 自定义词库来源(数据库 / 接口)

我们可以实现接口 IWordDeny 来扩展,例如从数据库取敏感词,实现自定义词库。

12public class CustomDictionaryExample {
34    public static void main(String[] args) {
5        SensitiveWordBs wordBs = SensitiveWordBs.newInstance()
6                .wordDeny(new IWordDeny() {
7                    @Override
8                    public List<String> deny() {
9                    // 这里可以从数据库查询
10                        return Arrays.asList("勇哥", "敏感词A", "敏感词B");
11                    }
12                })
13                .init();
1415        System.out.println(wordBs.findAll("这是一个敏感词A 的测试"));
16    }
1718}
19

6 Spring 整合

当我们需要在 SpringBoot 项目中使用敏感词过滤文本时,可以定义敏感词引导类。

示例见如下代码:

1@Configuration
2public class SpringSensitiveWordConfig {
34    @Autowired
5    private MyDdWordAllow myDdWordAllow;
67    @Autowired
8    private MyDdWordDeny myDdWordDeny;
910    /**
11     * 初始化引导类
12     * @return 初始化引导类
13     * @since 1.0.0
14     */
15    @Bean
16    public SensitiveWordBs sensitiveWordBs() {
17        SensitiveWordBs sensitiveWordBs = SensitiveWordBs.newInstance()
18                .wordAllow(WordAllows.chains(WordAllows.defaults(), myDdWordAllow))
19                .wordDeny(myDdWordDeny)
20                // 各种其他配置
21                .init();
2223        return sensitiveWordBs;
24    }
2526}
27

7 敏感词控制台

sensitive-word-admin 是和 sensitive-word 配套使用的控制台。

  • 前端采用Vue、Element UI。
  • 后端采用Spring Boot、Spring Security、Redis & Jwt。
  • 权限认证使用Jwt,支持多终端认证系统。
  • 支持加载动态权限菜单,多方式轻松权限控制。
  • 高效率开发,使用代码生成器可以一键生成前后端代码。

参考文章:

cloud.tencent.com/developer/n…


sensitive-word:一个简单易用的敏感词过滤框架》 是转载文章,点击查看原文


上一篇:tcp服务器

下一篇:C# 泛型(Generic)

相关推荐


Less resolver error:‘~antd/es/style/themes/index.less‘ wasn‘t found.
北阳AI知行录2025/10/7

记录一次使用Ant Design Pro框架时出现的bug 这是我最开始的package.json版本,然后执行npm run build(max build) 打包时会报上面的错误 { "name": "ant-design-pro", "version": "6.0.0", "private": true, "description": "An out-of-box UI solution for enterprise applications", "repo


【微服务】SpringBoot + Docker 实现微服务容器多节点负载均衡详解
小码农叔叔2025/10/6

目录 一、前言 二、前置准备 2.1 基本环境 2.2 准备一个springboot工程 2.2.1 准备几个测试接口 2.3 准备Dockerfile文件 2.4 打包上传到服务器 三、制作微服务镜像与运行服务镜像 3.1 拷贝Dockerfile文件到服务器 3.2 制作服务镜像 3.3 启动镜像服务 3.4 访问一下服务接口 四、配置负载均衡 4.1 源码包方式安装nginx 4.1.1 下载nginx安装包 4.1.2 解压安装包 4.1.3 进入解


为什么 Vue 组件中的 data 必须是一个函数?(含 Vue2/3 对比)
excel2025/10/5

在 Vue 面试或日常开发中,经常会被问到这样一个问题:为什么组件中的 data 必须是一个函数,而根实例的 data 可以是对象或函数? 本文将从 实例与组件的区别、数据污染问题、源码实现原理,以及 Vue2/3 的差异 四个角度进行深入分析。 一、实例与组件定义 data 的区别 在 Vue 根实例 中,data 属性既可以是对象,也可以是函数: // 对象格式 const app = new Vue({ el: "#app", data: { foo: "foo" }


VUE3+element plus 实现表格行合并
rggrgerj2025/10/3

基础实现方法 通过给el-table传入span-method方法可以实现合并行或列,该方法的参数包含当前行row、当前列column、当前行号rowIndex和当前列号columnIndex四个属性15。该方法可以返回包含rowspan和colspan的数组或对象,例如: javascriptCopy Code const spanMethod = ({ row, column, rowIndex, columnIndex }) => { if (columnIndex === 0


数模之路获奖总结——数据分析交流(R语言)
统计学小王子2025/10/2

目录 0、引言1、主要参赛类型2、涉及领域汇总2.1、 数据科学与人工智能前沿应用2.2、 社会经济与公共政策研究2.3、 医疗卫生与生物制药2.4、 能源环境与可持续发展2.5、工程技术与运筹优化2.6、 计算与通信基础设施2.7、 其他特色领域2.8、总结 3、主要比赛获奖总结4、写在最后的话 0、引言 自2018年1月起,开始跟着学校由徐老师负责的培训老师团队了解、入门和学习数学建模并通过选拔拿到第一张国赛入场券。时至今日(2025年9月27),已经关注和参加了大大小小的建模


阿里开源 Java 诊断神器Arthas
讓丄帝愛伱2025/10/2

支持 JDK6+,零侵入,通过 Attach 机制连接 JVM,无需重启服务即可定位问题。 CLI 支持 Tab 自动补全,并提供 Web Console。 Github | 官网文档 一、核心价值 线上问题快速定位:CPU 飙升、内存泄漏、线程阻塞动态反编译验证代码:jad 命令方法级性能分析:耗时、调用频次、异常统计热更新/日志修改:无需重启即可修改代码或日志格式 优势: 零侵入全功能 CLI多环境支持(Linux/Mac/Windows + JDK6+) 二、安装与


快学快用系列:一文学会java后端WebApi开发
百锦再@新空间10/2/2025

Web API开发基础与实践摘要 Web API是基于HTTP协议的应用接口,采用RESTful架构风格,具有无状态、可缓存等特点。本文介绍了Spring Boot开发Web API的全流程: 环境搭建:使用JDK 11+、Spring Initializr创建项目,配置MySQL数据库和 status 状态字段 架构设计:采用分层架构(Controller-Service-Repository-Model),包含DTO模块化包结构 数据模型:详细设计实体类(如User)和数据传输对象DTO(UserDTO


基于PyTorch深度学习遥感影像地物分类与目标检测、分割及遥感影像问题深度学习优化实践技术应用
AAIshangyanxiu10/1/2025

我国高分辨率对地观测系统重大专项已全面启动,高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB,遥感大数据时代已然来临。随着小卫星星座的普及,对地观测已具备3次以上的全球覆盖能力,


【Vue实现跳转页面】功能 - 总结
这是个栗子9/30/2025

在 Vue.js 中实现跳转到登录页是常见的需求,通常用于用户未登录或token 失效等场景。


【腾讯拥抱开源】Youtu-Embedding:基于CoDiEmb的一个协作而独特的框架,用于信息检索与语义文本相似性中的统一表征学习
吴脑的键客2025/10/10

🎯 简介 Youtu-Embedding 是由腾讯优图实验室开发的尖端通用文本嵌入模型。该模型在信息检索(IR)、语义文本相似度(STS)、聚类、重排序和分类等各类自然语言处理任务中均展现出卓越性能。 顶尖性能表现:截至2025年9月,在权威的CMTEB(中文大规模文本嵌入基准)评测中以77.46分位列榜首,彰显其强大稳健的文本表征能力。 创新训练框架:采用协同判别式微调框架,通过统一数据格式、任务差异化损失函数及动态单任务采样机制,有效解决多任务学习中的"负迁移"问题。 注:您可

上一篇:tcp服务器

下一篇:C# 泛型(Generic)

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0