小怡同学被骂到清空社交平台?各大平台连敏感词库都没有的吗?

article/2025/9/19 12:40:31

敏感词都没有的平台

最近某加拿大籍贯的 rapper 被曝私生活不检点,且极有可能涉及诱X未成-年少-女,成为一个 raper。

胖虎

当然至于是否属实,其实一个人是否是海王,微信、QQ 聊天记录里面记得清清楚楚。再上升到刑事案件的时候,TX 完全可以审查所有的历史记录。腾讯视频和某电鳗解约,也不见得毫无根据,毕竟利益相关。

但是我在整个过程中却发现两个非常值得注意的地方:

(1)其绯闻女友小怡同学,被骂到清空所有社交平台。作为吃瓜大户的 X 博,难道只会服务器瘫痪,不知道敏感词过滤吗?

(2)举报者都美竹收到大量xue|腥的照片,难道各大天天吹人工智能的平台,也没有过滤的功能吗?

当然了,对于人工智能我一无所知。

但是对于敏感词,最近写了一个小工具,如果各大平台需要的话,已经开源,欢迎自取。

https://github.com/houbb/sensitive-word

至少可以把美丽的中国话脱敏下面的样子:

你 XXX 的,我 XXX 你 XXX,你 XXXX,XXX!!XXX!

创作目的

基于 DFA 算法实现,目前敏感词库内容收录 6W+(源文件 18W+,经过一次删减)。

后期将进行持续优化和补充敏感词库,并进一步提升算法的性能。

希望可以细化敏感词的分类,感觉工作量比较大,暂时没有进行。

这里说一下愿景吧,愿景是成为第一好用的敏感词工具。

当然,第一总是空虚的。

空虚公子

特性

  • 6W+ 词库,且不断优化更新

  • 基于 DFA 算法,性能较好

  • 基于 fluent-api 实现,使用优雅简洁

  • 支持敏感词的判断、返回、脱敏等常见操作

  • 支持全角半角互换

  • 支持英文大小写互换

  • 支持数字常见形式的互换

  • 支持中文繁简体互换

  • 支持英文常见形式的互换

  • 支持用户自定义敏感词和白名单

  • 支持数据的数据动态更新,实时生效

快速开始

准备

  • JDK1.7+

  • Maven 3.x+

Maven 引入

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

api 概览

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

方法参数返回值说明
contains(String)待验证的字符串布尔值验证字符串是否包含敏感词
findAll(String)待验证的字符串字符串列表返回字符串中所有敏感词
replace(String, char)使用指定的 char 替换敏感词字符串返回脱敏后的字符串
replace(String)使用 * 替换敏感词字符串返回脱敏后的字符串

使用实例

所有测试案例参见 SensitiveWordHelperTest

判断是否包含敏感词

final String text = "敏感词1迎风飘扬,敏感词2的画像屹立在敏感词3前。";Assert.assertTrue(SensitiveWordHelper.contains(text));

返回第一个敏感词

final String text = "敏感词1迎风飘扬,敏感词2的画像屹立在敏感词3前。";String word = SensitiveWordHelper.findFirst(text);
Assert.assertEquals("敏感词1", word);

返回所有敏感词

final String text = "敏感词1迎风飘扬,敏感词2的画像屹立在敏感词3前。";List<String> wordList = SensitiveWordHelper.findAll(text);
Assert.assertEquals("[敏感词1, 敏感词2, 敏感词3]", wordList.toString());

默认的替换策略

final String text = "敏感词1迎风飘扬,敏感词2的画像屹立在敏感词3前。";
String result = SensitiveWordHelper.replace(text);
Assert.assertEquals("****迎风飘扬,***的画像屹立在***前。", result);

指定替换的内容

final String text = "敏感词1迎风飘扬,敏感词2的画像屹立在敏感词3前。";
String result = SensitiveWordHelper.replace(text, '0');
Assert.assertEquals("0000迎风飘扬,000的画像屹立在000前。", result);

更多特性

后续的诸多特性,主要是针对各种针对各种情况的处理,尽可能的提升敏感词命中率。

这是一场漫长的攻防之战。

忽略大小写

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

忽略半角圆角

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

忽略数字的写法

这里实现了数字常见形式的转换。

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

忽略繁简体

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

忽略英文的书写格式

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

忽略重复词

final String text = "ⒻⒻⒻfⓤuⓤ⒰cⓒ⒦ the bad words";List<String> wordList = SensitiveWordHelper.findAll(text);
Assert.assertEquals("[ⒻⒻⒻfⓤuⓤ⒰cⓒ⒦]", wordList.toString());

邮箱检测

final String text = "楼主好人,邮箱 sensitiveword@xx.com";List<String> wordList = SensitiveWordHelper.findAll(text);
Assert.assertEquals("[sensitiveword@xx.com]", wordList.toString());

特性配置

说明

上面的特性默认都是开启的,有时业务需要灵活定义相关的配置特性。

所以 v0.0.14 开放了属性配置。

配置方法

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

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

SensitiveWordBs wordBs = SensitiveWordBs.newInstance().ignoreCase(true).ignoreWidth(true).ignoreNumStyle(true).ignoreChineseStyle(true).ignoreEnglishStyle(true).ignoreRepeat(true).enableNumCheck(true).enableEmailCheck(true).enableUrlCheck(true).init();final String text = "敏感词1迎风飘扬,敏感词2的画像屹立在敏感词3前。";
Assert.assertTrue(wordBs.contains(text));

配置说明

其中各项配置的说明如下:

序号方法说明
1ignoreCase忽略大小写
2ignoreWidth忽略半角圆角
3ignoreNumStyle忽略数字的写法
4ignoreChineseStyle忽略中文的书写格式
5ignoreEnglishStyle忽略英文的书写格式
6ignoreRepeat忽略重复词
7enableNumCheck是否启用数字检测。默认连续 8 位数字认为是敏感词
8enableEmailCheck是有启用邮箱检测
9enableUrlCheck是否启用链接检测

动态加载(用户自定义)

情景说明

有时候我们希望将敏感词的加载设计成动态的,比如控台修改,然后可以实时生效。

v0.0.13 支持了这种特性。

接口说明

为了实现这个特性,并且兼容以前的功能,我们定义了两个接口。

IWordDeny

接口如下,可以自定义自己的实现。

返回的列表,表示这个词是一个敏感词。

/*** 拒绝出现的数据-返回的内容被当做是敏感词* @author binbin.hou* @since 0.0.13*/
public interface IWordDeny {/*** 获取结果* @return 结果* @since 0.0.13*/List<String> deny();}

比如:

public class MyWordDeny implements IWordDeny {@Overridepublic List<String> deny() {return Arrays.asList("我的自定义敏感词");}}

IWordAllow

接口如下,可以自定义自己的实现。

返回的列表,表示这个词不是一个敏感词。

/*** 允许的内容-返回的内容不被当做敏感词* @author binbin.hou* @since 0.0.13*/
public interface IWordAllow {/*** 获取结果* @return 结果* @since 0.0.13*/List<String> allow();}

如:

public class MyWordAllow implements IWordAllow {@Overridepublic List<String> allow() {return Arrays.asList("敏感词1");}}

配置使用

接口自定义之后,当然需要指定才能生效。

为了让使用更加优雅,我们设计了引导类 SensitiveWordBs

可以通过 wordDeny() 指定敏感词,wordAllow() 指定非敏感词,通过 init() 初始化敏感词字典。

系统的默认配置

SensitiveWordBs wordBs = SensitiveWordBs.newInstance().wordDeny(WordDenys.system()).wordAllow(WordAllows.system()).init();final String text = "敏感词1迎风飘扬,敏感词2的画像屹立在敏感词3前。";
Assert.assertTrue(wordBs.contains(text));

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

指定自己的实现

我们可以测试一下自定义的实现,如下:

String text = "这是一个测试,我的自定义敏感词。";SensitiveWordBs wordBs = SensitiveWordBs.newInstance().wordDeny(new MyWordDeny()).wordAllow(new MyWordAllow()).init();Assert.assertEquals("[我的自定义敏感词]", wordBs.findAll(text).toString());

这里只有 我的自定义敏感词 是敏感词,而 测试 不是敏感词。

当然,这里是全部使用我们自定义的实现,一般建议使用系统的默认配置+自定义配置。

可以使用下面的方式。

同时配置多个

  • 多个敏感词

WordDenys.chains() 方法,将多个实现合并为同一个 IWordDeny。

  • 多个白名单

WordAllows.chains() 方法,将多个实现合并为同一个 IWordAllow。

例子:

String text = "这是一个测试。我的自定义敏感词。";IWordDeny wordDeny = WordDenys.chains(WordDenys.system(), new MyWordDeny());
IWordAllow wordAllow = WordAllows.chains(WordAllows.system(), new MyWordAllow());SensitiveWordBs wordBs = SensitiveWordBs.newInstance().wordDeny(wordDeny).wordAllow(wordAllow).init();Assert.assertEquals("[我的自定义敏感词]", wordBs.findAll(text).toString());

这里都是同时使用了系统默认配置,和自定义的配置。

spring 整合

背景

实际使用中,比如可以在页面配置修改,然后实时生效。

数据存储在数据库中,下面是一个伪代码的例子,可以参考 SpringSensitiveWordConfig.java

要求,版本 v0.0.15 及其以上。

自定义数据源

简化伪代码如下,数据的源头为数据库。

MyDdWordAllow 和 MyDdWordDeny 是基于数据库为源头的自定义实现类。

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

敏感词库的初始化较为耗时,建议程序启动时做一次 init 初始化。

动态变更

为了保证敏感词修改可以实时生效且保证接口的尽可能简化,此处没有新增 add/remove 的方法。

而是在调用 sensitiveWordBs.init() 的时候,根据 IWordDeny+IWordAllow 重新构建敏感词库。

因为初始化可能耗时较长(秒级别),所有优化为 init 未完成时不影响旧的词库功能,完成后以新的为准

@Component
public class SensitiveWordService {@Autowiredprivate SensitiveWordBs sensitiveWordBs;/*** 更新词库** 每次数据库的信息发生变化之后,首先调用更新数据库敏感词库的方法。* 如果需要生效,则调用这个方法。** 说明:重新初始化不影响旧的方法使用。初始化完成后,会以新的为准。*/public void refresh() {// 每次数据库的信息发生变化之后,首先调用更新数据库敏感词库的方法,然后调用这个方法。sensitiveWordBs.init();}}

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

其他使用保持不变,无需重启应用。

冠希哥微微一笑,想做事,先做人。

冠希哥

拓展阅读

敏感词工具实现思路

DFA 算法讲解

敏感词库优化流程

停止词的思考记录

小结

还是那句话,我们用法律捍卫自己,但是绝不允许有些人把所有的事情都娱乐化,以为钱可以买来一切。

值此百年之际,更不能让先辈的xue白流。

何况是一个三无的加拿大戏子,建议依法处置,然后(ノ`Д)ノ(优美的中国话)
在这里插入图片描述


http://chatgpt.dhexx.cn/article/sH9L73Vh.shtml

相关文章

敏感关键词 词库_关键词优化难度分析怎么做?老鸟如何一键筛选优质关键词(悬赏1元)...

关键词优化是SEO工作的重点之一&#xff0c;之前聊了关键词挖掘&#xff0c;就有朋友问如何做关键词优化难度的分析&#xff0c;所以决定把这块详细写一写。 同时也说一下我自己的一个关键词优化性价比算法&#xff0c;目前这个算法已经帮我筛选出大量竞争低、流量高的关键词&a…

谷歌归期未定,但敏感词库已经建起来了

西雅图IT圈&#xff1a;seattleit 【今日作者】 PowerBall选号机 身体和灵魂总有一个要 走在买PowerBall的路上 谷歌回归 中国大陆的消息年年有&#xff0c;次次说的有鼻子有眼&#xff0c;而这回好像比哪一次都更靠谱。 从上周开始&#xff0c;谷歌回国的消息就又沸沸扬扬的传…

Python敏感词过滤DFA算法+免费附带敏感词库

DFA简介参考&#xff1a;https://blog.csdn.net/chenssy/article/details/26961957 此篇是上述JAVA敏感词过滤的python版本&#xff0c;完整版本&#xff0c;修改版本 首先我们看看最终处理效果 实例1&#xff1a; 输入字符串 处理结果 核心代码&#xff1a; SensitiveFilt…

Java实现自定义敏感词库过滤

最近接到一个需求&#xff0c;要添加一个敏感词管理模块&#xff0c;一如既往的CURD&#xff0c;敏感词我们添加到了自己的库里。然后进行一个自定义敏感词过滤&#xff0c;话不多说直接贴代码 1、工具类 这里只是最简单的得到敏感词进行转换&#xff0c;可以根据自己的业务需…

node实现敏感词过滤及敏感词库

核心代码 import * as fs from fs; import * as path from path; import * as readline from readline;export default class BadWords {private static _instance: BadWords;private data: Array<string> [];constructor () {const files fs.readdirSync(path.resol…

百度内容审查做敏感词库筛选

最近在做项目的敏感词库筛选更新。笔者最终的目标是通过百度API将现有的敏感词库筛选更新成。 一、准备工作 读者需在百度智能云登陆账号&#xff0c;然后开通百度内容审核功能&#xff0c;然后根据API Key和Secret Key可以获得调用接口所需的access_token。 二、代码调用API…

敏感词过滤之——自定义构建查询词库与快速查询实现

关于敏感词过滤的一点思考与实践 业务场景思考与研究逻辑分析代码实现(php)构建敏感词树分割字符串敏感词树长分支的递归实现读取敏感词库 敏感词树的查询查询实现调用 测试、分析与总结 业务场景 最近在公司维护的小程序上&#xff0c;遇到一个需要用到敏感词过滤功能的业务模…

计算机网络网络协议与网络结构

协议三要素 语法syntax&#xff1a;数据与控制信息的结构与格式&#xff0c;信号与电平 语义semantics&#xff1a;发出何种信息&#xff0c;做出何种响应&#xff0c;差错控制 时序timing&#xff1a;事件顺序 网络边缘 客户/服务器应用模型client/server&#xff1a;如we…

互联网网络协议 网络三种连接方式描述

学习笔记 目录 网络三种连接方式描述 子网掩码 网络三种连接方式描述 桥接模式: 使用外部统一网段,虚拟机可以和外部系统通讯,但是容易照成IP冲突 NAT模式: 网络地址转换模式,虚拟系统可以和外部系统通讯,不造成IP冲突,外部地址不能访问内部虚拟系统应为虚拟系统是通过代理…

计算机网络 协议三要素

1. 语法&#xff1a;数据与控制信息的结构或特点 2.语义&#xff1a;需要发出何种控制信息&#xff0c;完成何种动作以及做出何种响应 3.同步&#xff1a;事件实现顺序的详细说明 例题&#xff1a;

网络协议 -- 最全的网络协议图

转载自&#xff1a;http://www.52im.net 图片较大&#xff0c;建议单击放大或者下载后查看

计算机术语mls指什么意思,了解计算机网络协议的原则与要素两者

计算机网络协议是有关计算机网络通信的一整套规则&#xff0c;或者说是为了进行数据交换而制订的规则、约定和标准。网络协议由语法、语义和时序三大要素组成。现在就跟着小编共同来学习一下&#xff1a;了解计算机网络协议的原则与要素两者。 想必不需要小编多说&#xff0c;大…

网络协议介绍

一、什么是协议 协议&#xff0c;就是大家共同遵守的一些约定&#xff0c;协议是一种约定&#xff0c;是指通信双方共同指定的一个标准约定 举两个例子&#xff1a; 例子1&#xff1a;一个宿舍的人来自五湖四海&#xff0c;开学来到宿舍后&#xff0c;如果大家都说自己家乡的…

计算机网络协议层次

计算机网络学习的核心内容就是网络协议的学习。网络协议是为计算机网络中进行数据交换而建立的规则、标准或者说是约定的集合。计算机网络协议同我们的语言一样&#xff0c;多种多样。 为了给网络协议的设计提供一个结构&#xff0c;网络设计者以分层的方式组织协议。 一个协…

网络协议是什么 网络协议三要素是什么

本文向大家详细介绍网络协议是什么以及网络协议三要素是什么的基础知识&#xff0c;不懂的朋友可以通过本文了解学习 网络协议是什么 网络协议的定义&#xff1a;为计算机网络中进行数据交换而建立的规则、标准或约定的集合。 一个网络协议至少包括三要素: 语法&#xff1a;用来…

常见网络协议

一、网络协议 二、TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09; TCP头格式 TCP协议中的三次握手和四次挥手 TCP报文抓取工具三、HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09; 请求报…

网络通信的三要素

一、要素一&#xff1a;IP地址 设备在网络中的地址&#xff0c;是唯一的标识。 IP地址&#xff1a; IP&#xff08;Internet Protocol&#xff09;&#xff1a;全称”互联网协议地址”&#xff0c;是分配给上网设备的唯一标志。 常见的IP分类为&#xff1a;IPv4和IPv6 I…

计算机中的网络协议包括哪些,网络协议三要素有什么关系

网络协议三要素有什么关系?为进行计算机网络中的数据交换而建立的规则、标准或约定的集合&#xff0c;协议总是指某一层的协议。准确地说&#xff0c;它是对同等层实体之间的通信制定的有关通信规则或约定的结合。佰佰安全网看看吧。 一个网络协议至少包括三要素: 语法&#x…

网络协议概述(一)

目录 一、协议三要素 二、常用的网络协议 2.1 由url确定目标ip地址&#xff08;DNS协议&#xff09; 2.2 打包需要发送的信息&#xff08;http/https协议&#xff09; 2.3 有应用层到传输层&#xff08;TCP协议保证应用层包一定送达&#xff09; 2.4 有传输层到达网络层&…

推荐:大视频免费压缩成指定大小的小视频的解决方法

给大家推荐一款好用的视频压缩软件MOO0视频压缩器&#xff0c;免费压缩&#xff0c;可选压缩画质&#xff0c;小巧便捷&#xff0c;这款软件不像某捷、某云这些软件&#xff0c;不花钱的话你是没办法压缩大文件的 云盘下载&#xff1a; 链接: https://pan.baidu.com/s/1ZUOi7…