基于 Trie 实现敏感词过滤

简介: 本文章利用 Trie 数据结构来过滤敏感词

加载外部文件

publicvoidinit() {
try (
InputStreamis=this.getClass().getClassLoader().getResourceAsStream("sensitive-words.txt");
BufferedReaderreader=newBufferedReader(newInputStreamReader(is));) {
Stringkeyword;
while ((keyword=reader.readLine()) !=null) {
// 添加到前缀树this.addKeyword(keyword);
        }
    } catch (IOExceptione) {
logger.error("加载敏感词文件失败: "+e.getMessage());
    }
    }

定义 Trie

privateclassTrieNode {
// 关键词结束标识privatebooleanisKeywordEnd=false;
// 子节点(key是下级字符,value是下级节点)privateMap<Character, TrieNode>subNodes=newHashMap<>();
publicbooleanisKeywordEnd() {
returnisKeywordEnd;
    }
publicvoidsetKeywordEnd(booleankeywordEnd) {
isKeywordEnd=keywordEnd;
    }
// 添加子节点publicvoidaddSubNode(Characterc, TrieNodenode) {
subNodes.put(c, node);
    }
// 获取子节点publicTrieNodegetSubNode(Characterc) {
returnsubNodes.get(c);
    }
}

将一个敏感词添加到前缀树中

privatevoidaddKeyword(TrieNoderootNode, Stringkeyword) {
TrieNodetempNode=rootNode;
for (inti=0; i<keyword.length(); i++) {
charc=keyword.charAt(i);
TrieNodesubNode=tempNode.getSubNode(c);
if (subNode==null) {
// 初始化子节点subNode=newTrieNode();
tempNode.addSubNode(c, subNode);
        }
// 指向子节点,进入下一轮循环tempNode=subNode;
// 设置结束标识if (i==keyword.length() -1) {
tempNode.setKeywordEnd(true);
        }
    }
}

过滤敏感词

publicStringfilter(Stringtext) {
if (StringUtils.isBlank(text)) {
returnnull;
    }
// 指针1TrieNodetempNode=rootNode;
// 指针2intbegin=0;
// 指针3intposition=0;
// 结果StringBuildersb=newStringBuilder();
while (position<text.length()) {
charc=text.charAt(position);
// 跳过符号if (isSymbol(c)) {
// 若指针1处于根节点,将此符号计入结果,让指针2向下走一步if (tempNode==rootNode) {
sb.append(c);
begin++;
            }
// 无论符号在开头或中间,指针3都向下走一步position++;
continue;
        }
// 检查下级节点tempNode=tempNode.getSubNode(c);
if (tempNode==null) {
// 以begin开头的字符串不是敏感词sb.append(text.charAt(begin));
// 进入下一个位置position=++begin;
// 重新指向根节点tempNode=rootNode;
        } elseif (tempNode.isKeywordEnd()) {
// 发现敏感词,将begin~position字符串替换掉sb.append("****");
// 进入下一个位置begin=++position;
// 重新指向根节点tempNode=rootNode;
        } else {
// 检查下一个字符position++;
        }
    }
// 将最后一批字符计入结果sb.append(text.substring(begin));
returnsb.toString();
}
目录
相关文章
|
安全 开发者 C++
Windows10安装modelscope后import这个模块报错:OSError: [WinError 1] 函数不正确。: 'D:\Anaconda\envs\MDS\lib\site-packages\modelscope\utils\ast_utils.py'
Windows10安装modelscope后import这个模块报错:OSError: [WinError 1] 函数不正确。: 'D:\Anaconda\envs\MDS\lib\site-packages\modelscope\utils\ast_utils.py'
725 1
|
9月前
|
关系型数据库 数据库 PostgreSQL
【赵渝强老师】PostgreSQL的模板数据库
在PostgreSQL中,创建新数据库时,默认通过拷贝`template1`实现。`template1`包含标准系统对象,可自定义以影响新数据库内容;而`template0`是纯净模板,仅含预定义对象且不应修改。视频讲解和代码示例展示了如何查看现有数据库信息及标识字段的作用。 ![图示](https://ucc.alicdn.com/pic/developer-ecology/yub6x2mlkqwck_398ed06397a44c2d9bfbb5ae5c90bbc0.png) [视频链接](https://www.bilibili.com/video/BV1szyfY4EQn)
168 0
【赵渝强老师】PostgreSQL的模板数据库
|
机器学习/深度学习 人工智能 并行计算
CPU和GPU的区别
【10月更文挑战第14天】
|
传感器 算法 安全
蓝牙中频率跳变技术的原理及其应用
蓝牙中频率跳变技术的原理及其应用
1099 9
|
机器学习/深度学习 存储 人工智能
人工智能大语言模型微调技术:SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法
人工智能大语言模型微调技术:SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法
人工智能大语言模型微调技术:SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法
|
机器学习/深度学习 人工智能 前端开发
跨界融合:前端技术与人工智能的奇妙联盟
在技术的世界里,前端开发不再是孤岛。本文探讨了前端技术如何与人工智能领域结合,为用户体验与功能提升开辟了新的可能性。从机器学习到智能推荐系统,我们将看到这些技术如何在前端应用中发挥其 ultimate 的作用。
|
设计模式 算法 搜索推荐
从策略模式看软件设计的智慧-灵活应对变化的艺术
策略模式是一种行为设计模式,它定义了算法族,分别封装起来,让它们之间可以互相替换,使得算法的变化独立于使用算法的客户。本文深入探讨了策略模式的组成、应用场景、实现方式及其优缺点。通过实际案例,展示了策略模式在灵活处理算法和业务规则变化中的强大作用。文章还提供了最佳实践和使用注意事项,帮助开发者更有效地运用策略模式,同时比较了与其他设计模式的异同。掌握策略模式,将为您的软件设计带来更高的灵活性和可维护性。
724 0
从策略模式看软件设计的智慧-灵活应对变化的艺术
|
自然语言处理 编译器 C语言
【C/C++ 标准的发展】C/C++ 语言标准的历史和演变
【C/C++ 标准的发展】C/C++ 语言标准的历史和演变
907 3
|
编解码 并行计算
ffmpeg cuda加速 h264->hevc(h265) 缩小存储空间
ffmpeg cuda加速 h264->hevc(h265) 缩小存储空间
492 0
|
机器学习/深度学习 并行计算 异构计算
gpu是什么和cpu的区别 模型训练
gpu是什么和cpu的区别 模型训练
1277 1