敏感词替换简单实现
前言
我们在论坛、博客等社交场景中发送文章时,都会涉及到敏感词的问题,都需要进行删除或者替换。
maven依赖
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>sensitive-word</artifactId>
<version>0.2.0</version>
</dependency>
代码实现
原始文本为 “这是五星红旗 这是毛主席 这是中国”,将五星红旗替换为国家红旗,毛主席替换为教员。
package com.imooc;
import com.github.houbb.sensitive.word.api.ISensitiveWordReplace;
import com.github.houbb.sensitive.word.api.ISensitiveWordReplaceContext;
import com.github.houbb.sensitive.word.bs.SensitiveWordBs;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class TestSensitiveWord {
public static void main(String[] args) {
SensitiveWordBs wordBs = SensitiveWordBs.newInstance()
.wordDeny(() -> new ArrayList<>(sensitiveWords().keySet()))
.ignoreCase(true)
.ignoreWidth(true)
.ignoreNumStyle(false) // 设置为true会将 五 转换为 5
.ignoreChineseStyle(true)
.ignoreEnglishStyle(true)
.ignoreRepeat(true)
.enableNumCheck(false)
.enableEmailCheck(false)
.enableUrlCheck(false)
.init();
String result = wordBs.replace("这是五星红旗 这是毛主席 这是中国", new MySensitiveWordReplace());
System.out.println(result);//这是国家旗帜 这是教员 这是中国
}
// 场景: 将"五星红旗"替换为"国家旗帜","毛主席"替换为"教员"。
public static class MySensitiveWordReplace implements ISensitiveWordReplace {
@Override
public String replace(ISensitiveWordReplaceContext context) {
System.out.println(context.sensitiveWord());
return sensitiveWords().getOrDefault(context.sensitiveWord(), "*");
}
}
private static Map<String, String> sensitiveWords() {
Map<String, String> map = new HashMap<>();
map.put("五星红旗", "国家旗帜");
map.put("毛主席", "教员");
return map;
}
}
实现原理
DFA介绍
通过 DFA(Deterministic Finite Automaton,确定有限状态自动机) 算法构建敏感词的树,内部使用Map实现,具体结构如下
{
"五": {
"ED": false,
"星": {
"红": {
"ED": false,
"旗": {
"ED": true
}
},
"ED": false
}
},
"毛": {
"主": {
"席": {
"ED": true
},
"ED": false
},
"ED": false
}
}
DFA和String.replace对比
| 项目 | DFA | String.replace |
|---|---|---|
| 时间复杂度 | O(n) | O(n*m)(m为敏感词数量) |
| 内存使用 | 低(构建一次后可重复使用) | 高(每次替换都创建新字符串) |
| 匹配效率 | 高(单次扫描完成) | 低(每次匹配都要重新扫描) |
| 大规模敏感词 | 优秀(与敏感词数量无关) | 差(敏感词越多,性能越差) |
| 单次匹配 | 一般 | 优秀(简单场景) |

浙公网安备 33010602011771号