敏感词汇工具类sensitive word的使用及详解

article/2025/8/22 17:10:07

简述:

1.平时工作中,只要涉及到用户可以自由发言(博客、文档、论坛),就要考虑内容的敏感性处理,sensitive word工具是一个快速的敏感词过滤工具,基于 DFA 算法实现的高性能敏感词工具(mirrors / houbb / sensitive-word · GitCode),主要优点如下:

1.1、 6W+ 词库,且不断优化更新
1.2、 基于 DFA 算法,性能较好
1.3、 基于 fluent-api 实现,使用优雅简洁
1.4、支持敏感词的判断、返回、脱敏等常见操作
1.5 、支持全角半角互换
1.6、 支持英文大小写互换

核心API 概览:

以上就是敏感词的工具类SensitiveWordHelper ,它可以对可以对敏感词的结果进行处理,允许用户自定义 ,内置实现见 WordResultHandlers 工具类:WordResultHandlers.word(),只保留敏感词单词本身:WordResultHandlers.raw(),保留敏感词相关信息,包含敏感词,开始和结束下标

Maven引入:

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

使用实例:

1、测试方法:

public class Test {public static void main(String[] args) {//是否有敏感词存在String text = "五星红旗迎风飘扬,画像屹立在天安门前。";boolean isFalse = SensitiveWordHelper.contains(text);System.out.println("是否有敏感词存在====>>>>"+isFalse);//返回所有敏感词List<String> wordList = SensitiveWordHelper.findAll(text);System.out.println("返回所有敏感词====>>>>"+wordList);//返回所有敏感词 等价于SensitiveWordHelper.findAll(text)wordList = SensitiveWordHelper.findAll(text,WordResultHandlers.word());System.out.println("返回所有敏感词====>>>>"+wordList);//返回字符串中第一个敏感词String first = SensitiveWordHelper.findFirst(text);System.out.println("返回字符串中第一个敏感词====>>>>"+first);//返回字符串中第一个敏感词 等价于SensitiveWordHelper.findFirst(text)first = SensitiveWordHelper.findFirst(text,WordResultHandlers.word());System.out.println("返回字符串中第一个敏感词====>>>>"+first);//默认的替换策略String result = SensitiveWordHelper.replace(text);System.out.println("默认的替换策略====>>>>"+result);//指定替换的内容 这里可以自定义替换内容result = SensitiveWordHelper.replace(text, '0');System.out.println("指定替换的内容====>>>>"+result);//自定义替换内容MySensitiveWordReplaceUtils mySensitiveWordReplaceUtils = new MySensitiveWordReplaceUtils();result = SensitiveWordHelper.replace(text, mySensitiveWordReplaceUtils);System.out.println("自定义替换内容====>>>>"+result);}
}

2.自定义的替换策略工具类MySensitiveWordReplaceUtils

public class MySensitiveWordReplaceUtils implements ISensitiveWordReplace {@Overridepublic String replace(ISensitiveWordReplaceContext context) {String sensitiveWord = context.sensitiveWord();// 自定义不同的敏感词替换策略,可以从数据库等地方读取if("五星红旗".equals(sensitiveWord)) {return "国家旗帜";}if("毛主席".equals(sensitiveWord)) {return "教员";}// 其他默认使用 * 代替int wordLength = context.wordLength();return CharUtil.repeat('*', wordLength);}}

自定义配置方法

1.针对各种针对各种情况的处理,如:忽略大小写、忽略半角圆角、忽略数字的写法、忽略繁简体、忽略英文的书写格式、忽略重复词、邮箱检测等一些特性默认都是开启的,有时业务需要灵活定义相关的配置特性 为了让使用更加优雅,统一使用 fluent-api 的方式定义:

SensitiveWordBs wordBs = SensitiveWordBs.newInstance().ignoreCase(true).ignoreWidth(true).ignoreNumStyle(true).ignoreChineseStyle(true).ignoreEnglishStyle(true).ignoreRepeat(true).enableNumCheck(true).enableEmailCheck(true).enableUrlCheck(true).init();

以上各项配置的说明如下:

在在一般情况下在开发中会遇到一些关于敏感词范围过大或这敏感词范围不全这种情况,这个时候就会用到敏感词的白名单与黑名单,一般可存入数据库里进行维护

白名单:

@Component
public class MyDdWordAllow implements IWordAllow {@Overridepublic List<String> allow() {List<String> list = new ArrayList<>();list.add("五星红旗");list.add("天安门");return list;}}

黑名单:

@Component
public class MyDdWordDeny implements IWordDeny {@Overridepublic List<String> deny() {List<String> list = new ArrayList<>();list.add("你好");return list;}}

接口自定义之后,当然需要指定才能生效,为了让使用更加优雅,我们设计了引导类 SensitiveWordBs,可以通过 wordDeny() 指定敏感词,wordAllow() 指定非敏感词,通过 init() 初始化敏感词字典 系统的默认配置如下:

SensitiveWordBs wordBs = SensitiveWordBs.newInstance().wordDeny(WordDenys.system()).wordAllow(WordAllows.system()).init();

备注:init() 对于敏感词 DFA 的构建是比较耗时的,一般建议在应用初始化的时候只初始化一次。而不是重复初始化!

配置多个筛选:

@Configuration
public class SpringSensitiveWordConfig {@Autowiredprivate MyDdWordAllow myDdWordAllow;@Autowiredprivate MyDdWordDeny myDdWordDeny;/*** 初始化引导类* @return 初始化引导类* @since 1.0.0*/@Beanpublic SensitiveWordBs sensitiveWordBs() {SensitiveWordBs init = SensitiveWordBs.newInstance().wordAllow(WordAllows.chains(WordAllows.system(), myDdWordAllow)).wordDeny(WordDenys.chains(WordDenys.system(), myDdWordDeny)).ignoreRepeat(false)// 各种其他配置.init();return init;}
}

以上代码中多个敏感词:WordDenys.chains() 方法,将多个实现合并为同一个 IWordDeny

多个白名单:WordAllows.chains() 方法,将多个实现合并为同一个 IWordAllow

最后测试:

写一个测试的controller层 如下:

package net.longjin.controller;import com.alibaba.fastjson.JSONObject;
import com.github.houbb.sensitive.word.bs.SensitiveWordBs;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;/*** @Author:何志鹏* @Package:net.longjin.controller* @Project:mybatis_plus* @Date:2022/12/12 17:29* @Filename:ApiSensitiveWordController*/
@RestController
@RequestMapping("/sensitiveWord")
public class ApiSensitiveWordController {@Autowiredprivate SensitiveWordBs sensitiveWordBs;/*** 获取所有的敏感词* @param jsonObject 文本* @return 结果*/@PostMapping("/findAll")public JSONObject findAll(@RequestBody JSONObject jsonObject) {String text = jsonObject.getString("text");List<String> all = sensitiveWordBs.findAll(text);JSONObject json = new JSONObject();json.put("all",all);return json;}}

测试结果:

 以上配置白名单和黑名单为了测试我是写的死数据  实际开发中,一般白名单和黑名单是在数据库中进行维护的 ,为了保证敏感词修改可以实时生效且保证接口的尽可能简化,此处没有新增 add/remove 的方法,而是在调用 sensitiveWordBs.init() 的时候,根据 IWordDeny+IWordAllow 重新构建敏感词库 因为初始化可能耗时较长(秒级别),所有优化为 init 未完成时不影响旧的词库功能,完成后以新的为准

package net.longjin.sensitiveWord;import com.github.houbb.sensitive.word.bs.SensitiveWordBs;
import net.longjin.config.SpringSensitiveWordConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;/*** @Author:何志鹏* @Package:net.longjin.sensitiveWord* @Project:mybatis_plus* @Date:2022/12/12 17:46* @Filename:SensitiveWordService*/
@Component
public class SensitiveWordService {@Autowiredprivate SensitiveWordBs sensitiveWordBs;/*** 更新词库** 每次数据库的信息发生变化之后,首先调用更新数据库敏感词库的方法。* 如果需要生效,则调用这个方法。** 说明:重新初始化不影响旧的方法使用。初始化完成后,会以新的为准。*/public void refresh() {// 每次数据库的信息发生变化之后,首先调用更新数据库敏感词库的方法,然后调用这个方法。sensitiveWordBs.init();}}

如上,你可以在数据库词库发生变更时,需要词库生效,主动触发一次初始化 sensitiveWordBs.init();

最后附上代码:mybatis_plus: springBoot集成mybatis_plus


http://chatgpt.dhexx.cn/article/3nmeqlec.shtml

相关文章

Python敏感词汇检测

只要思想不滑坡&#xff0c;办法总比困难多 昨天在写练习题的时候写到这点特别迷&#xff0c;一直绕不过这个弯&#xff0c;最后也算是成功实现吧&#xff0c;记录一下&#xff0c;防止下次再绕的出不来。 之前访问的的Github镜像站一直触发滥用检测机制&#xff0c;着实很烦…

敏感词汇检测

1、今天做测试的时候抓到一个数据包&#xff0c;发现一个txt文件&#xff08;CensorWords.b7e4bfb.txt&#xff09;&#xff0c;第一眼反应以为是系统被入侵了&#xff0c;被入侵者传了个txt到服务器上面&#xff0c;后面发现不对啊&#xff0c;攻击的话也不应该上传这种txt&am…

利用Python做简单的数据可视化

import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from pylab import mpl # 正常显示中文标签 mpl.rcParams[font.sans-serif] [KaiTi] # 正常显示负号 mpl.rcParams[axes.unicode_minus] Falseimport warnings warnings.filt…

Python做风险控制|找出形成环状投资的公司

大家好&#xff0c;我是小小明。 今天我将带大家利用python找到关系数据的环。先说下需求和背景&#xff1a; 需求描述 某投资机构需要考虑各公司的投资风险&#xff0c;手上一份各公司投资方向的数据&#xff0c;主要字段是投资者和被投资者。 而有部分公司并不是真的投资…

如何用Python做好友管理系统

--------------------------------------------------------总代码在最下面----------------------------------------------------------- &#xff08;1&#xff09;好友管理系统中不仅需要保存好友名称&#xff0c;还需要保存分组以及分组中的好友&#xff0c;因此&#xf…

怎么用python做网站?

python做网站方法步骤&#xff1a; 1、导入django包 可直接在pycharm下载&#xff0c;或者pip/easy_install Django是一个开放源代码的Web应用框架&#xff0c;由Python写成。采用了MTV的框架模式&#xff0c;即模型M&#xff0c;视图V和模版T。它最初是被开发来用于管理劳伦…

用python做一个简单GUI小软件

用python做一个简单软件 前言 这是一个课设&#xff0c;用python做一个扫描王软件 我主要做的GUI部分&#xff0c;记录分享一下。也是第一次用python做小软件&#xff0c;python的方便果然是名不虚传 遇到问题 1.python版本 下载了python3.7的编译器 由于最终软件要在wi…

手把手教你使用Python做数据分析

一、数据分析是什么 数据分析是指用适当的统计分析方法对收集来的大量数据进行分析&#xff0c;将它们加以汇总和理解并消化&#xff0c;以求最大化地开发数据的功能&#xff0c;发挥数据的作用&#xff0c;使得数据的价值最大化 二、数据分析是做什么的 数据分析是为了提取…

你究竟能用Python做什么?

中英文模式阅读 中文模式阅读 英文模式阅读 What exactly can you do with Python? Here are Pythons 3 main applications. 你究竟能用Python做什么&#xff1f;这是Python的3个主要应用。 If youre thinking of learning Python --- or if you recently started learnin…

用Python做图像处理

用Python做图像处理 最近在做一件比较 evil 的事情——验证码识别&#xff0c;以此来学习一些新的技能。因为我是初学&#xff0c;对图像处理方面就不太了解了&#xff0c;欲要利吾事&#xff0c;必先利吾器&#xff0c;既然只是做一下实验&#xff0c;那用 Python 来作原型开发…

python都能做什么

前言 一、python&#xff1a; Python具有丰富和强大的库。它常被昵称为胶水语言&#xff0c;能够把用其他语言制作的各种模块&#xff08;尤其是C/C&#xff09;很轻松地联结在一起。常见的一种应用情形是&#xff0c;使用Python快速生成程序的原型&#xff08;有时甚至是程序…

你都用 Python 来做什么?

你们都用python做些什么呢&#xff1f; 在开发中 python 这一个语言就像是小叮当&#xff0c;而 python 的第三方库则是“百宝箱”&#xff0c;你只要想着对某一个方向进行开发&#xff0c;那么这个“百宝箱”就会给你想要的东西。 由于我是在开发多年后接触到的 python&#…

怎样利用python做一个软件,python可以自己做软件吗

python能做什么软件&#xff1f; 主要可以做小程序&#xff0c;爬虫程序&#xff0c;用于系统编程等等还是很广泛的。Python 的应用领域分为下面几类。下文将介绍一些Python 具体能帮我们做的事情。 但我们不会对各个工具进行深入探讨&#xff0c;如果你对这些话题感兴趣&…

python可以做什么工作-python都能干什么用

一、Python可以做什么&#xff1f; 1、数据库&#xff1a;Python在数据库方面很优秀&#xff0c;可以和多种数据库进行连接&#xff0c;进行数据处理&#xff0c;从商业型的数据库到开放源码的数据库都提供支持。例如&#xff1a;Oracle, My SQL Server等等。有多种接口可以与…

学了python能干啥举例-Python主要用来做什么?

Python主要用来做什么&#xff1f;Python可以做web应用开发、网络爬虫、AI人工智能与机器学习、处理数据用来分析、数据科学&#xff1a;包括机器学习、数据分析和数据可视化、脚本等方面开发。 Python用来开发的有&#xff1a; 1、做Web应用开发 在国内豆瓣一开始就使用Pyth…

python怎么算列表的平方_总算明了python如何求平方

总算明了python如何求平方 日期:2019-08-25 12:22:17 浏览:341 核心提示:打开电脑上的计算器一看,居然没法求平方,是不是就没办法了呢?用python就可以啦,那么python如何求平方呢?一起来了解下吧: python如何求平方 1.计算乘方 pow(4,3) #结果64 2.计算平方 import…

Python 计算平方根

Python 计算平方根 文章目录 Python 计算平方根平方根封装为函数相关博客 平方根 平方根&#xff0c;又叫二次方根&#xff0c;表示为〔√&#xffe3;〕&#xff0c;一个正数有两个实平方根&#xff0c;它们互为相反数&#xff0c;负数没有平方根&#xff0c;0的平方根是0 …

python中平方_python里平方

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; 我正在写一个函数&#xff0c;它将返回一个平方数列表&#xff0c;但如果该函数使用参数&#xff08;appl…

python平方和计算技巧,python平方和计算技巧 Python算法练习题:四平方和

全栈记事交流群内一个同学的问题&#xff0c;正好收集一下解决方案&#xff1b; 四平方和的定理又称拉格朗日定理&#xff1a;每个正整数都可以表示至多4个正整数的平方和。如果把0包括进去&#xff0c;就可以表示为4个数的平方和。 比如&#xff1a; 50^20^21^22^2 71^21^21^2…

python中平方根_如何在Python中找到平方根

python中平方根 Hello everyone, in this tutorial, I’ll show 3 ways to find square root in Python. 大家好,在本教程中,我将展示3种在Python中找到平方根的方法。 Let’s see how to do it. 让我们来看看如何做。 1. Using Exponent 1.使用指数 number = int(input(&…