当前位置: 首页 > news >正文

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.matchAllWordstree.matchAll区别

 

方法名返回类型内容用途
matchAllWordsList<FoundWord>词 + 位置 + 其他信息需要详细匹配信息的场景
matchAllList<String>只有匹配的词字符串只关心匹配词,不关心词在文本中位置
http://www.dtcms.com/a/305726.html

相关文章:

  • 阿里云AI代码助手通义灵码开发指导
  • Javaweb————什么是OPTIONS预检请求
  • 2025年6月数据挖掘顶刊TKDE研究热点有哪些?
  • 磁悬浮技术原理
  • 自动化与配置管理工具 ——Ansible
  • spark入门-helloword
  • React 闭包陷阱及解决方案与 React 16/17/18 版本区别
  • 5种安全方法:如何删除三星手机上的所有内容
  • 三轴云台之减震系统篇
  • OpenEuler 安装 apache + php8 不解析php文件的处理
  • Apache Ignite 2.8 引入的新指标系统(New Metrics System)的完整说明
  • SpringBoot+Three.js打造3D看房系统
  • 深入理解 Doris Compaction:提升查询性能的幕后功臣
  • 深入剖析 Spark Shuffle 机制:从原理到实战优化
  • 【CVPR2025】FlowRAM:用区域感知与流匹配加速高精度机器人操作策略学习
  • linux 执行sh脚本,提示$‘\r‘: command not found
  • (8)(8.6) H-流量(光学流量和距离传感器模块)
  • 自动化测试实战—petstore实战
  • SparkSQL_数组排序函数 array_sort用法详解
  • 快秀录屏记录高光时刻,分享游戏激情
  • 少林寺用什么数据库?
  • 传统ERP迁移SAP Cloud ERP现代化升级:Kyano Crossway一种更智能的迁移方案
  • 【C++详解】深入解析多态 虚函数、虚函数重写、纯虚函数和抽象类、多态原理、重载/重写/隐藏的对⽐
  • Python字典高级映射:键到多值映射的工程实践
  • 智能Agent场景实战指南 Day 26:Agent评估与性能优化
  • SAP ABAP锁机制程序锁
  • LeetCode热题100--148. 排序链表--中等
  • Linux730 tr:-d /-s;sort:-r,-n,-R,-o,-t,-k,-u;bash;cut:-d,-c;tee -a;uniq -c -i
  • AD域设计与管理-批量创建域用户
  • 大语言模型API付费?