广告
返回顶部
首页 > 资讯 > 后端开发 > Python >JAVA使用前缀树(Tire树)实现敏感词过滤、词典搜索
  • 839
分享到

JAVA使用前缀树(Tire树)实现敏感词过滤、词典搜索

JAVA前缀树敏感词过滤JAVA前缀树 2023-01-03 12:01:10 839人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录简介Trie树code结论简介 有时候需要对用户输入的内容进行敏感词过滤,或者实现查找文本中出现的词典中的词,用遍历的方式进行替换或者查找效率非常低,这里提供一个基于Trie树的

简介

有时候需要对用户输入的内容进行敏感词过滤,或者实现查找文本中出现的词典中的词,用遍历的方式进行替换或者查找效率非常低,这里提供一个基于Trie树的方式,进行关键词的查找与过滤,在词典比较大的情况下效率非常高。

Trie树

Trie树,又叫前缀树,多说无益,直接看图就明白了

词典:[“猪狗”, “小狗”, “小猫”, “小猪”, “垃圾”, “狗东西”]

Tire数据结构

在这里插入图片描述

code

树节点node.class


public class Node {
    
    private Map<Character, Node> nextNodes = new HashMap<>();

    public void addNext(Character key, Node node){
        nextNodes.put(key, node);
    }

    public Node getNext(Character key){
        return nextNodes.get(key);
    }

    public boolean isLastCharacter(){
        return nextNodes.isEmpty();
    }
}

搜索类TrieSearcher.class


public class TrieSearcher {

    private Node root = new Node();

    
    public void addWord(String Word) {
        Node tmpNode = root;
        for (char c : word.toCharArray()) {
            Node node = tmpNode.getNext(c);
            if (null == node) {
                node = new Node();
                tmpNode.addNext(c, node);
            }
            tmpNode = node;
        }
    }

    
    public String replace(String text, String afterReplace) {
        StringBuilder result = new StringBuilder(text.length());
        Node tmpNode = root;
        int begin = 0, pos = 0;
        while (pos < text.length()) {
            char c = text.charAt(pos);
            tmpNode = tmpNode.getNext(c);
            if (null == tmpNode) {
                result.append(text.charAt(begin));
                begin++;
                pos = begin;
                tmpNode = root;
            } else if (tmpNode.isLastCharacter()) {
                // 匹配完成, 进行替换
                result.append(afterReplace);
                pos++;
                begin = pos;
                tmpNode = root;
            } else {
                // 匹配上向后移
                pos++;
            }
        }
        result.append(text.substring(begin));
        return result.toString();
    }

    
    public Map<String, Integer> find(String text) {
        Map<String, Integer> resultMap = new HashMap<>(16);
        Node tmpNode = root;
        StringBuilder word = new StringBuilder();
        int begin = 0, pos = 0;
        while (pos < text.length()) {
            char c = text.charAt(pos);
            tmpNode = tmpNode.getNext(c);
            if (null == tmpNode) {
                begin++;
                pos = begin;
                tmpNode = root;
            } else if (tmpNode.isLastCharacter()) {
                // 匹配完成
                String w = word.append(c).toString();
                resultMap.put(w, resultMap.getOrDefault(w, 0) + 1);
                pos++;
                begin = pos;
                tmpNode = root;
                word = new StringBuilder();
            } else {
                // 匹配上向后移
                word.append(c);
                pos++;
            }
        }
        return resultMap;
    }
}

测试Main.class

public class Main {
    public static void main(String[] args) {
        TrieSearcher trieSearcher = new TrieSearcher();
        Stream.of("猪狗", "小狗", "小猫", "小猪", "垃圾", "狗东西").forEach(trieSearcher::addWord);
        String sentence = "你好,小狗,小猪,今天天气真好。";
        System.out.println(trieSearcher.replace(sentence, "***"));
        System.out.println(trieSearcher.find(sentence));
    }
}

输出:

你好,***,***,今天天气真好。
{小猪=1, 小狗=1}

Benchmark:

replace    1093.517    ns/op
trie    200.042        ns/op

结论

在仅有短文本和小词典的情况下,通过性能测试可以看出前缀树的效率很高,随着文本和词典的增长,性能提升会非常明显。

到此这篇关于JAVA使用前缀树(Tire树)实现敏感词过滤、词典搜索的文章就介绍到这了,更多相关JAVA前缀树敏感词过滤内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JAVA使用前缀树(Tire树)实现敏感词过滤、词典搜索

本文链接: https://www.lsjlt.com/news/176468.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JAVA使用前缀树(Tire树)实现敏感词过滤、词典搜索
    目录简介Trie树code结论简介 有时候需要对用户输入的内容进行敏感词过滤,或者实现查找文本中出现的词典中的词,用遍历的方式进行替换或者查找效率非常低,这里提供一个基于Trie树的...
    99+
    2023-01-03
    JAVA前缀树敏感词过滤 JAVA前缀树
  • SpringBoot使用前缀树过滤敏感词的方法实例
    目录一、前缀树二、敏感词过滤器总结一、前缀树 一般设计网站的时候,会有问题发布或者是内容发布的功能,这些功能的有一个很重要的点在于如何实现敏感词过滤,要不然可能会有不良信息的发布,或...
    99+
    2022-11-12
  • SpringBoot使用前缀树过滤敏感词的方法是什么
    这篇文章跟大家分析一下“SpringBoot使用前缀树过滤敏感词的方法是什么”。内容详细易懂,对“SpringBoot使用前缀树过滤敏感词的方法是什么”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着...
    99+
    2023-06-26
  • Java怎么使用DFA算法实现敏感词过滤
    本篇内容主要讲解“Java怎么使用DFA算法实现敏感词过滤”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么使用DFA算法实现敏感词过滤”吧!1 前言敏感词过滤就是你在项目中输入某些字(...
    99+
    2023-07-05
  • Java使用DFA算法实现敏感词过滤的示例代码
    目录1 前言2 代码实现2.1 敏感词库初始化2.2 编写测试类1 前言 敏感词过滤就是你在项目中输入某些字(比如输入xxoo相关的文字时)时要能检测出来,很多项目中都会有一个敏感词...
    99+
    2023-03-24
    Java DFA敏感词过滤 Java 敏感词过滤
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作