通过Trie字典树实现敏感词过滤

DFA和trie字典树实现敏感词过滤(python和c语言) 现在做的项目都是用python开发,需要用做关键词检查,过滤关键词,之前用c语言做过这样的事情,用字典树,蛮高效的,内存小,检查快。 到了python上,第一想法是在pip上找一个基于c语言的python字典树模块,可惜没找到合适的,如果我会用c写python模块的话,我就自己写一个了,可惜我还不具备这个能力, 只能用python写了,性能差一点就差点吧,内存多一点也无所谓了。 用搜 阅读详情

1.首先将基本模型构建出来

     创建一个名为TrieNode的类,该类就是我们需要去完善形成的一个Trie的数据结构类。其中有一个Node内部类,Node用来代表Trie中的每一个节点,其中isWord表示首节点到该节点的路径是一个单词,next指向了下一个节点。

 
public class TrieNode {
    //是不是敏感词的结尾
    private boolean end = false;
    //Character代表当前节点的字符,TrieNode代表了下一个节点
    private Map<Character, TrieNode> subNodes = new HashMap<>();
 
    public void addSubNode(Character key, TrieNode node) {
        subNodes.put(key, node);
    }
 
    //查看下一个节点有没有对应的字符
    TrieNode getNextSubNode(Character key) {
        return subNodes.get(key);
    }
 
    boolean isEndWord() {
        return end;
    }
 
    void setEndWord(boolean end) {
        this.end = end;
    }
}

2.构建添加敏感词方法

private TrieNode root = new TrieNode();
    public void addWord(String word){
        TrieNode tempNode = root;
        for(int i = 0 ; i < word.length();i++){
            Character c = word.charAt(i);
            //判断该字符是否已存在
            TrieNode node = tempNode.getNextSubNode(c);
            //若不存在则添加
            if(node == null){
                node = new TrieNode();
                tempNode.addSubNode(c,node);
            }
            tempNode = node;
 
            if(i == word.length()-1){
                tempNode.setEndWord(true);
            }
        }
    }

3.构建过滤敏感词的方法

需要将待查询的word的每个字符遍历看是否存在,将传入的字符串中不是敏感词的就加入到StringBuilder中,如果是敏感词则用***代替。

public String filter(String words){
        String replacement = "***";
        TrieNode tempNode = root;

        int position = 0;

        StringBuilder result = new StringBuilder();
        while(position < words.length()){
            char c = words.charAt(position);
            tempNode = tempNode.getNextSubNode(c);

            //如果这个字符不在敏感词中则添加到结果中
            if(tempNode == null){
                result.append(words.charAt(position));
                tempNode = root;
            }else if(tempNode.isEndWord()){
                //发现敏感词进行打码
                result.append(replacement);
                tempNode = root;
            }
            position++;
        }
        return result.toString();
    }

4.测试代码

public class main {
    public static void main(String[] args) {
        Trie trie = new Trie();
        trie.addWord("色情");
 
        System.out.println(trie.filter("hello,色情"));
    }
}

 可以看到将敏感词色情过滤成了***  

JAVA实现trie树(前缀树,字典树)进行敏感词检测/过滤 JAVA实现trie树(前缀树,字典树)进行敏感词检测/过滤 文章目录JAVA实现trie树(前缀树,字典树)进行敏感词检测/过滤定义优点:缺点:应用敏感词检测开始构建敏感词Trie树时间复杂度敏感词去重敏感词检测去特殊字符方法结束标识符JAVA实现完整代码初始化词库 定义 在计算机科学中,trie树,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而 阅读详情

相关推荐

字典树(Trie)核心原理与实战:从自动补全到敏感词过滤的高效实现

在计算机科学中,数据结构是构建高效算法的基石,其中树形结构因其层次化特性,在组织与检索数据方面展现出独特优势。字典树(Trie)作为一种专用于字符串集合的树形数据结构,其核心原理在于利用‘公共前缀共享’机制,将字符存储在节点路径上,从而将前缀匹配的时间复杂度优化至与查询串长度相关,与数据集规模几乎无关。这一设计为系统带来了巨大的技术价值,尤其在需要快速前缀查找的场景下,性能提升显著。其典型的应用场景包括搜索引擎的输入提示(自动补全)、网络系统中的敏感词实时过滤以及IP路由表的最长前缀匹配。本文聚焦于字典树的

weixin_34289454的博客 350

用 C# 实现的前缀树 - Trie

拜读了 Jeffery Zhao 的大作 后,有自己写一棵前缀树的冲动,于是花了一点时间,朴素地实现了。 [EDIT]发现这个实现有很多漏洞,隐藏了……真要看,点此展开 代码: using System.Collections.Generic; namespace DataStructure.Trees { public sealed class Trie<TKe...

weixin_30532837的博客 388

C# 实现 Trie 树(字典树)

它遍历单词的每个字符,并在 Trie 树中查找相应的节点。如果在遍历完成后发现最后一个字符的节点被标记为单词的结束节点,则表示该单词存在于 Trie 树中。Trie 树的基本结构由节点组成,每个节点包含一个字符和指向其他节点的指针。Trie 树,也称为字典树或前缀树,是一种非常高效的数据结构,用于存储和检索字符串集合。它遍历单词的每个字符,在 Trie 树中沿着相应的路径创建节点。类表示 Trie 树的节点,包含字符值、一个布尔值用于表示节点是否为某个单词的结束节点,以及一个指向子节点的字典。

HackQuestR的博客 288

字典树-trie树

又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。---转自百度百科 它有3个基本性质: 根节点不包含字符,除根节点外每一个节点都只包含一个字符; 从根节点到某一节点

taozuihen17的专栏 1141

使用C#实现多重搜索的Trie树

它的每个节点表示一个字符串,从根节点到每个叶子节点的路径表示从根节点开始的字符串的串联,而每个节点的直系子节点代表这个字符串后面一个字符的所有可能性。具体来说,我们插入了“apple”、“banana”、“cat”和“dog”四个字符串,然后测试了Search、Delete和SearchAll的功能。具体来说,我们插入了“apple”、“banana”、“cat”和“dog”四个字符串,然后测试了Search、Delete和SearchAll的功能。搜索所有以给定字符串开头的字符串,并返回它们的列表。

qq_37934722的博客 287

csharp-trie:C#中的trie(前缀树)数据结构实现

尖锐的三重奏 C#中的trie(前缀树)数据结构实现。 主要: 开发人员: 主要: 开发人员: nuget: Install-Package rm.Trie 尝试方法 // Adds a word to the Trie. void AddWord ( string word ); // Removes word from the Trie. int RemoveWord ( string word ); // Removes words by prefix from the Trie. void RemovePrefix ( string prefix ); // Gets all

利用Trie(字典树)实现敏感词过滤算法

Trie(字典树),正如它的名字一样,其主要的作用就是来存储字符串的,用它来实现字符串的查找效率比较高,查找的时间复杂度主要和它的元素(字符串的长度)O(W)相关,但是消耗的内存也比较大。 字典树主要应用于: 字符串的检索 词频统计 字符串的排序 利用Trie实现敏感词过滤器主要有下面三个步骤: 定义前缀树 根据敏感词,初始化前缀树 编写过滤敏感词的算法 定义和初始化前缀树 根节点没有字...

weixin_41927235的博客 4966

C#编写的PatriciaTrie树及其基本操作

Trie是一种字典树,用于存储文本字符,并利用了单词之间共享前缀的特点,所以叫做前缀树。不像平衡BST,Trie的高度只与最长的文本串的长度s有关系,而与单词的数量n无关。如果一颗Trie中有很多单词只有一个儿子结点,可以用Patricia Trie(Linux内核中叫做Radix Tree)压缩存储。该代码为Patricia Trie的C#版本。

【数据结构】通过Trie字典树实现敏感词过滤

一、基本概念 Trie字典树主要用于存储字符串,Trie的每个Node保存一个字符。用链表来描述的话,就是一个字符串就是一个链表。每个Node都保存了它的所有子节点。 如下图所示,根节点不包含任何信息。每个节点表示一个字符串中的字符,从根节点到红色节点的一条路径表示一个字符串。红色节点不一定是叶子节点。 使用Trie这种数据结构存储字符串,查询每个字...

offer! 1463

C#编写的Trie树操作

Trie是一种字典树,用于存储文本字符,并利用了单词之间共享前缀的特点,所以叫做前缀树。不像平衡BST,Trie的高度只与最长的文本串的长度s有关系,而与单词的数量n无关。该代码为C#版本。

trie:Trie(又名前缀树)C#实现。 具有固定时间的字符串前缀查找

特里 Trie (又名前缀树)是一种有序的树数据结构,用于存储键通常为字符串的关联数组。 节点的所有后代具有与该节点关联的字符串的公共前缀,而根与空字符串关联。 参考: 优点 查找键更快。 查找长度键的键需要O(| key |)时间 查找前缀更快。 查找前缀需要O(| prefix |)时间 移除需要O(| key |)时间 该库提供了trie数据结构的四种实现: TrieSet<T> Trie<TKey> StringTrieSet StringTrie<TValue> 讲解 Trie<TValue>实现IDictionary<string>接口。 尝试初始化: var trie = new StringTrie<TValue>(); 或使用接受IEqualityComparer<char> comparer接口的构造函数: var trie = new StringTrie<TValue>(comparer); 要将项目添加到特里: trie.Add("key", value); trie.AddRange(trieEntries);

Java手写字典树(Trie树),实现敏感词过滤

trie树介绍与实现

stu_kk的博客 864

C# TrieTree介绍及实现方法

在自然语言处理(NLP)研究中,NGram是最基本但也是最有用的一种比对方式,这里的N是需要比对的字符串的长度,而今天我介绍的TrieTree,正是和NGram密切相关的一种数据结构,有人称之为字典树。TrieTree简单的说是一种多叉树,每个节点保存一个字符,这么做的好处是当我们要做NGram比对时,只需要直接从树的根节点开始沿着某个树叉遍历下去,就能完成比对;如果没找到,停止本次遍历。这话讲得有些抽象,我们来看一个实际的例子。 假设我们现在词库里面有以下一些词: 上海市 上海滩 上海人 上海公司 北京 北斗星 杨柳 杨浦区 如图所示:挂在根节点上的字有上、北、杨, 如果我们现在对“上海市

dfa算法c语言,DFA跟trie字典树实现敏感词过滤(python和c语言)

DFA和trie字典树实现敏感词过滤(python和c语言)现在做的项目都是用python开发,需要用做关键词检查,过滤关键词,之前用c语言做过这样的事情,用字典树,蛮高效的,内存小,检查快。到了python上,第一想法是在pip上找一个基于c语言的python字典树模块,可惜没找到合适的,如果我会用c写python模块的话,我就自己写一个了,可惜我还不具备这个能力,只能用python写了,性能差...

weixin_39977547的博客 604

【GPIO模拟串口通信协议】

由于这段时间搞了个安卓相关的项目,需要和安卓进行Uart通信。但是选用的芯片并没有自带uart功能,所以在充分评估项目后,考虑波特率不高的情况下,决定使用GPIO去模拟串口通信协议了。

学海无涯苦作舟 2638

h5页面调用微信JS-SDK分享到微信好友或者朋友圈的配置

1.引入js &lt;script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"&gt;&lt;/script&gt; 2.在页面添加配置 &lt;script type="text/javascript"&gt; var url = location.href..

tiantiandashi的博客 2万+

字典树(Trie)核心原理与实战:从自动补全到敏感词过滤的高效实现

在计算机科学中,数据结构是优化算法性能的基石,尤其在处理海量字符串时,传统方法常面临性能瓶颈。字典树(Trie,又称前缀树)作为一种专为字符串设计的高级树形结构,其核心原理是利用字符串的公共前缀来组织数据,将查询时间复杂度降至与单个字符串长度相关,实现了极速检索。这种以空间换时间的设计,在工程上带来了显著的技术价值:它使得前缀匹配、批量查找等操作变得异常高效。因此,字典树被广泛应用于需要快速字符串处理的场景,例如搜索引擎的自动补全功能,它能在用户输入时实时提供候选词;在内容安全领域,它构成了敏感词过滤系统的

culuo8053的博客 562

android技术--------如何解决弹出键盘只影响当前fragment输入的窗口

题目比较长,也可能有很多人不明所以这东西有啥可写的,简单来说就是实现近似于Android Pad 上QQHD聊天的界面效果,搞了很长的事件,今天终于搞定。 android3.0新加了组件Fragment称之为碎片,对这个一无所知的请自觉补习。今天的阐述将基于此组件。 fragment可以放入activity中,并随activity的生命周期变化而变化,但当相应键盘事件的时候,就比较让人挠头了,

3506

php 字典树,[原创] Trie树 php 实现敏感词过滤

[TOC]背景项目中需要过滤用户发送的聊天文本, 由于敏感词有将近2W条, 如果用 str_replace 来处理会炸掉的.网上了解了一下, 在性能要求不高的情况下, 可以自行构造 Trie树(字典树), 这就是本文的由来.简介Trie树是一种搜索树, 也叫字典树、单词查找树.DFA可以理解为DFA(Deterministic Finite Automaton), 即这里借用一张图来解释Trie树...

weixin_34123811的博客 396

Cadence IC618与Spectre231安装:环境变量与License配置详解

在Linux系统中部署Virtuoso等EDA工具时,环境变量与License管理是决定工具能否顺利启动的核心环节。环境变量决定了系统如何找到工具二进制文件以及工具如何定位自身资源,而License则通过FlexLM授权机制控制工具的使用权限。理解PATH、CDS_ROOT、CDS_LIC_FILE等关键变量的作用,掌握lmgrd服务与lmstat验证方法,能显著减少安装后启动失败的概率。无论是学生初装Cadence IC618与Spectre231,还是实验室工作站需要搭建可用的模拟设计环境,理顺环境变量

weixin_29192365的博客 368

极具性价比的步进电机驱动芯片-TMC2226/TMC2209使用小结

TMC2226/2209相对于TMC2660C、TMC5160来说,价格低了很多,同时功能并没有太多阉割。对比TMC5160,少了内部加减速曲线,电流足够(Ipeak = 2.8A),相对5160而言功能也很足够,所以毫无疑问TMC2226是极具性价比的步进驱动芯片。

Trinamic_TMC的博客 7003

字典树的实际应用场景之敏感词过滤(附 Java 实现代码)

文章目录前言敏感词过滤Trie 实现敏感词的过滤Java 代码实现 前言 这篇文章主要介绍怎么用字典树实现敏感词的过滤,关于字典树的一些介绍可以参考其他文章,也看一下我的另一篇文章:Trie(字典树,前缀树)及其实现; 敏感词过滤 在很多场景都会用到敏感词过滤,比如在网站提交的内容,游戏中的聊天等等…那么这些敏感词是如何被过滤掉的呢?其实这就是一个字符串的匹配过程,我们很容易就可以想到的就是准备一...

无意呢的博客 1311

记一次在JAVA中客户端使用axis调用webservice服务端出现的异常:Unmarshalling Error: For input string: ""

在使axis调用webservice服务端,参照网上给的demo: Call call = (Call) service.createCall(); call.setTargetEndpointAddress(endpoint);//设置服务请求路径 QName qn = new QName(name); call.setOperationName(qn); call.addParamet

kry1201的专栏 8080
上一篇: 22. 括号生成
下一篇: 用两个栈实现队列
phoenix_xqq
博客等级 码龄11年 44粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值