Java利用DFA算法实现敏感词管理
作者:xn_xy19
我们在完成一些文章发布的功能是,可以使用第三方工具如阿里云的内容安全来进行文章的审核,但是这个第三方接口并不能过滤一些敏感词,所以本文就来讲讲如何通过DFA算法就行敏感词管理吧
我们在完成一些文章发布的功能是,可以使用第三方工具如阿里云的内容安全来进行文章的审核,但是这个第三方接口并不能过滤一些敏感词
因此这时候我们需要自己维护一套敏感词。
1.敏感词-过滤
技术选型
| 方案 | 说明 |
|---|---|
| 数据库模糊查询 | 效率太低 |
| String.indexOf("")查找 | 数据库量大的话也是比较慢 |
| 全文检索 | 分词再匹配 |
| DFA算法 | 确定有穷自动机(一种数据结构) |
2.DFA实现原理
DFA全称为:Deterministic Finite Automaton,即确定有穷自动机。
存储:一次性的把所有的敏感词存储到了多个map中,就是下图表示这种结构

检索的过程

3.实现步骤
3.1初始化敏感词库
private static int checkWord(String text, int beginIndex) {
if (dictionaryMap == null) {
throw new RuntimeException("字典不能为空");
}
boolean isEnd = false;
int wordLength = 0;
Map<String, Object> curMap = dictionaryMap;
int len = text.length();
// 从文本的第beginIndex开始匹配
for (int i = beginIndex; i < len; i++) {
String key = String.valueOf(text.charAt(i));
// 获取当前key的下一个节点
curMap = (Map<String, Object>) curMap.get(key);
if (curMap == null) {
break;
} else {
wordLength ++;
if ("1".equals(curMap.get("isEnd"))) {
isEnd = true;
}
}
}
if (!isEnd) {
wordLength = 0;
}
return wordLength;
}3.3获取匹配的关键词和命中的次数
public static Map<String, Integer> matchWords(String text) {
Map<String, Integer> wordMap = new HashMap<>();
int len = text.length();
for (int i = 0; i < len; i++) {
int wordLength = checkWord(text, i);
if (wordLength > 0) {
String word = text.substring(i, i + wordLength);
// 添加关键词匹配次数
if (wordMap.containsKey(word)) {
wordMap.put(word, wordMap.get(word) + 1);
} else {
wordMap.put(word, 1);
}
i += wordLength - 1;
}
}
return wordMap;
}3.4测试
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("星期天");
list.add("放假");
list.add("加班");
initMap(list);
String content="我是一个好人,但是我星期天又要加班";
Map<String, Integer> map = matchWords(content);
System.out.println(map);
}到此这篇关于Java利用DFA算法实现敏感词管理的文章就介绍到这了,更多相关Java敏感词管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
