基于 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'
590 1
|
7月前
|
关系型数据库 数据库 PostgreSQL
【赵渝强老师】PostgreSQL的模板数据库
在PostgreSQL中,创建新数据库时,默认通过拷贝`template1`实现。`template1`包含标准系统对象,可自定义以影响新数据库内容;而`template0`是纯净模板,仅含预定义对象且不应修改。视频讲解和代码示例展示了如何查看现有数据库信息及标识字段的作用。 ![图示](https://ucc.alicdn.com/pic/developer-ecology/yub6x2mlkqwck_398ed06397a44c2d9bfbb5ae5c90bbc0.png) [视频链接](https://www.bilibili.com/video/BV1szyfY4EQn)
125 0
【赵渝强老师】PostgreSQL的模板数据库
|
9月前
|
机器学习/深度学习 数据采集 自然语言处理
HuggingFace Transformers 库深度应用指南
本文首先介绍HuggingFace Tra环境配置与依赖安装,确保读者具备Python编程、机器学习和深度学习基础知识。接着深入探讨Transformers的核心组件,并通过实战案例展示其应用。随后讲解模型加载优化、批处理优化等实用技巧。在核心API部分,详细解析Tokenizers、Models、Configuration和Dataset的使用方法。文本生成章节则涵盖基础概念、GPT2生成示例及高级生成技术。最后,针对模型训练与优化,介绍预训练模型微调、超参数优化和推理加速等内容。通过这些内容,帮助读者掌握HuggingFace Transformers的深度使用,开发高效智能的NLP应用。
1294 22
|
12月前
|
机器学习/深度学习 人工智能 并行计算
CPU和GPU的区别
【10月更文挑战第14天】
|
传感器 算法 安全
蓝牙中频率跳变技术的原理及其应用
蓝牙中频率跳变技术的原理及其应用
872 9
|
机器学习/深度学习 存储 人工智能
人工智能大语言模型微调技术:SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法
人工智能大语言模型微调技术:SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法
人工智能大语言模型微调技术:SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法
|
安全 Unix Go
Golang深入浅出之-Go语言中的时间与日期处理:time包详解
【4月更文挑战第26天】Go语言的`time`包提供处理日期和时间的功能,包括`time.Time`类型、时间戳、格式化与解析。本文讨论了核心概念、常见问题(如时区处理、格式字符串混淆、超时控制和并发安全)及解决方法。推荐使用`time.LoadLocation`管理时区,熟悉时间格式规则,用`context`精确控制超时,并注意并发安全。文中通过代码示例展示了如何获取格式化时间、计算时间差以及创建定时任务。学习和应用这些知识可提高程序的健壮性和准确性。
606 2
|
编解码 并行计算
ffmpeg cuda加速 h264->hevc(h265) 缩小存储空间
ffmpeg cuda加速 h264->hevc(h265) 缩小存储空间
433 0
|
机器学习/深度学习 搜索推荐 Python
L1范数(L1 norm)
L1范数(L1 norm),也称为曼哈顿距离(Manhattan distance)或绝对值范数(Absolute value norm),是向量中各个元素绝对值之和。它在数学和机器学习中经常被用作一种正则化项或稀疏性度量。
2597 2
|
机器学习/深度学习 并行计算 异构计算
gpu是什么和cpu的区别 模型训练
gpu是什么和cpu的区别 模型训练
1134 1