首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

敏感词检测框架,Java语言的就没有吗?

最近家父身体异样,回去赔了一段时间,一眨眼有半个多月没写点什么了,心里不免空落落的。

这几天上班也很忙,一个劲儿地改需求,似乎抽不出时间。但还是想写点什么,那就把最近敏感词检测库的调查写一写吧。

在我们使用即时通讯应用聊天的时候,聊天的内容是会被审核的。

聊天内容的审核,会涉及到三种类型的媒体:文本、图片、视频。这三种类型审核的技术不一样。这次调查的是文本内容的审核。

文本内容的审核可以花点钱调用大厂的接口,还可以自主研发。

如果是自主研发,在java语言中,有哪些现成的框架可以使用呢?

以前也没做过敏感词检测,同事找的是其他语言的,就没有java的吗,问问AI,给了6个答案,挨个看下。

在 Java 语言中,有多款开源的敏感词检测库可供使用,能够帮助快速实现敏感词过滤功能。以下是几款常用且稳定的敏感词检测库。

1. AHOCorasick Double Array Trie(AC 自动机)

这是一个经典的多模式匹配算法,适合敏感词过滤,性能高效,能够快速查找多个关键词。

Maven 依赖:

<groupId>org.ahocorasick</groupId>

<artifactId>ahocorasick</artifactId>

<version>0.2.0</version>

示例:

代码一贴,咋还报错呢?查看源码,Trie类中没有builder()方法。

来到maven官网,查看最新的ahocorasick框架。最新的版本是0.6.3,止步于2021年三月。把maven依赖更改为:

代码调整下,匹配全部的敏感词:

Trie trie = Trie.builder()

.addKeyword("敏感词1")

.addKeyword("敏感词2")

.build();

// 测试文本

Collection<Emit> emit = trie.parseText("待检测的文本内容敏感词1敏感词2他妈的测试");

if (emit != null) {

System.out.println("检测到敏感词: " + emit);

}

运行结果:

检测到敏感词: [8:11=敏感词1, 12:15=敏感词2]

敏感词检测框架在我的设想中,应该有一个敏感词库,然后才是检测功能。在这个框架中,没有敏感词库,但可以动态添加。看下一个吧。

2. Sensitive Word

基于 DFA(确定性有限自动机)算法的敏感词过滤库,具有较高的检测效率。

Maven 依赖:

示例:

代码一贴,为了保险起见,还是去maven官网看一下最新的版本。

最新的版本是2024年9月更新的,把要测试的文本更改为:"待检测的文本他妈的哈哈哈测试"。

运行结果:

检测到的敏感词: [他妈的]

它是如何检测出敏感词的?看来有默认的敏感词库,我去找找。

在SensitiveWordBs类中,有这么几个变量:敏感词白名单、黑名单等等。

在源文件里找到了4个默认的文件:

我在项目的resources文件夹中加了一个sensitive_word_deny.txt文件,文中仅有4个词汇。

再来测试一下刚才的文本,测试结果:

检测到的敏感词: [他妈的, 测试]

我加的覆盖文件生效了。继续研究下一个。

3. SensitiveWordFilter

这是一个专门为敏感词检测设计的 Java 库,基于 DFA 算法,简单易用。

GitHub 项目:SensitiveWordFilter

示例:

Set<String> sensitiveWords = new HashSet<>();

sensitiveWords.add("敏感词1");

sensitiveWords.add("敏感词2");

SensitiveWordFilter filter = new SensitiveWordFilter(sensitiveWords);

String text = "待检测的文本";

boolean hasSensitive = filter.containsSensitiveWord(text);

没有架包,这是需要到github上把代码全部拷过来吗?

4. jieba-analysis

这是中文分词工具 jieba 的 Java 实现库,虽然它主要是用于分词,但也可以通过自定义词库实现敏感词检测功能。

Maven 依赖:

示例:

maven的最新版本止步于2015年6月,运行代码,有两行输出:

main dict load finished, time elapsed 614 ms

model load finished, time elapsed 35 ms.

没有我要的输出,把代码改成如下:

JiebaSegmenter segmenter = new JiebaSegmenter();

// 要检测的词汇

List<String> words = segmenter.sentenceProcess("待检测的文本内容敏感词1敏感词2他妈");

System.out.println("分过后的词: " + words);

// 敏感词汇设置

Set<String> sensitiveWords = new HashSet<>(Arrays.asList("敏感词1","敏感词2","他妈"));

for (String word : words) {

if (sensitiveWords.contains(word)) {

System.out.println("检测到敏感词: " + word);

}

}

运行结果:

main dict load finished, time elapsed 614 ms

model load finished, time elapsed 35 ms.

分过后的词: [待, 检测, 的, 文本, 内容, 敏感, 词, 1, 敏感, 词, 2, 他妈]

检测到敏感词: 他妈

这分得啥?怪不得不维护了,可以果断放弃。

5. tuyi-sensitivelib

这是一个快速敏感词检测和替换的 Java 库,性能优异,支持批量检测和替换敏感词。

GitHub 项目:tuyi-sensitivelib

示例:

SensitiveFilter filter = SensitiveFilter.DEFAULT;

String sentence = "待检测的文本";

String filtered = filter.filter(sentence, '*'); // 替换敏感词为 *

System.out.println(filtered);

没有架包,打开网站404,可以放弃。

6. FastTextSearch

高效的敏感词过滤库,基于 Trie 实现多关键词快速搜索。

GitHub 项目:FastTextSearch

示例:

TextSearch textSearch = TextSearchHelper.build();

textSearch.addWord("敏感词1");

textSearch.addWord("敏感词2");

String text = "待检测文本";

boolean containsSensitive = textSearch.contains(text);

没有架包,,打开网站404,可以放弃。

AI对6个框架的总结

性能和多关键词匹配:AHOCorasick 和 SensitiveWordFilter 基于 AC 自动机和 DFA 算法,适合需要高性能处理的场景。

中文分词支持:如果你的应用需要中文分词,可以考虑 jieba-analysis。

简单易用:tuyi-sensitivelib 和 FastTextSearch 提供了较为简洁的 API,方便快速集成。

最后总结

经过测试,6个框架,3个没找到源码。ahocorasick没有默认词库,但可以对敏感词进行精确定位。jieba-analysis倾向于对语句进行分词。sensitive-word框架似乎更符合我的需求,有默认的敏感词库,可以覆盖默认的敏感词库,另外框架一直在维护。

由于时间有限,只能做些粗略的调查,源码还需要在用的时候慢慢研究。

除了调用大厂的敏感词检测接口,自主研发还有其他框架可用吗?

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OslN7IIaJ7pW5xJTmRoh6StQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券