最近家父身体异样,回去赔了一段时间,一眨眼有半个多月没写点什么了,心里不免空落落的。
这几天上班也很忙,一个劲儿地改需求,似乎抽不出时间。但还是想写点什么,那就把最近敏感词检测库的调查写一写吧。
在我们使用即时通讯应用聊天的时候,聊天的内容是会被审核的。
聊天内容的审核,会涉及到三种类型的媒体:文本、图片、视频。这三种类型审核的技术不一样。这次调查的是文本内容的审核。
文本内容的审核可以花点钱调用大厂的接口,还可以自主研发。
如果是自主研发,在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框架似乎更符合我的需求,有默认的敏感词库,可以覆盖默认的敏感词库,另外框架一直在维护。
由于时间有限,只能做些粗略的调查,源码还需要在用的时候慢慢研究。
除了调用大厂的敏感词检测接口,自主研发还有其他框架可用吗?
领取专属 10元无门槛券
私享最新 技术干货