Hutool 的 WordTree(敏感词检测)
package cn.hutool.dfa;
WordTree
继承自 HashMap<Character, WordTree>
,表示一个字符到子树的映射,构成一颗“词树”(类似 Trie 树),用于快速匹配字符串中的词语(敏感词检测、关键词匹配等)。
主要特点和功能
结构是多叉树,每个节点是一个
HashMap<Character, WordTree>
,键是当前字符,值是对应的子树节点。endCharacterSet
存储标记某些字符作为词尾,用来判断一个词是否匹配完成。charFilter
用于过滤字符,比如跳过一些停用字符(空格、标点等)。支持批量添加词
addWords
,单个添加词addWord
。提供多种匹配方法:
isMatch(String text)
判断文本是否包含树中的词。match(String text)
返回匹配到的第一个词。matchAll(String text)
返回所有匹配词。
支持限制匹配数量和匹配策略(密集匹配、贪婪匹配)。
工作原理简述
构建词树
addWord
方法逐字符插入,如果路径不存在则新建节点,最后标记词尾字符。匹配词
遍历文本,从每个字符开始,沿树向下匹配。如果走到词尾节点,说明匹配到一个词。字符过滤
使用charFilter
过滤无意义字符,忽略它们,不影响匹配。
数据演示
敏感词:
"毒品", "赌博", "枪支"
演示代码:
import cn.hutool.dfa.WordTree;
import java.util.Arrays;
import java.util.List;public class WordTreeDemo {public static void main(String[] args) {// 1. 创建词树WordTree tree = new WordTree();// 2. 添加敏感词List<String> sensitiveWords = Arrays.asList("毒品", "赌博", "枪支");tree.addWords(sensitiveWords);// 3. 待检测文本String text = "他涉嫌赌博和毒品交易,持有非法枪支。";// 4. 检测文本中是否包含敏感词boolean hasSensitive = tree.isMatch(text);System.out.println("是否包含敏感词: " + hasSensitive);// 5. 找出第一个匹配词String firstMatch = tree.match(text);System.out.println("第一个匹配的敏感词: " + firstMatch);// 6. 找出所有匹配词List<String> allMatches = tree.matchAll(text);System.out.println("所有匹配的敏感词: " + allMatches);// 7. 将敏感词替换为***String cleanText = text;for (String word : allMatches) {cleanText = cleanText.replaceAll(word, "***");}System.out.println("替换后的文本: " + cleanText);}
}
输出结果示例:
是否包含敏感词: true
第一个匹配的敏感词: 赌博
所有匹配的敏感词: [赌博, 毒品, 枪支]
替换后的文本: 他涉嫌***和***交易,持有非法***。
addWords
把所有敏感词加入词树。
isMatch
检测文本是否包含任意敏感词。
match
找到文本中第一个敏感词。
matchAll
找到文本中所有敏感词。最后用
replaceAll
把敏感词替换成***
。
补充
tree.addword和tree.addwords区别
tree.matchAllWords
和 tree.matchAll区别
方法名 | 返回类型 | 内容 | 用途 |
---|---|---|---|
matchAllWords | List<FoundWord> | 词 + 位置 + 其他信息 | 需要详细匹配信息的场景 |
matchAll | List<String> | 只有匹配的词字符串 | 只关心匹配词,不关心词在文本中位置 |