欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JAVA使用前綴樹(Tire樹)實現(xiàn)敏感詞過濾、詞典搜索

 更新時間:2023年01月03日 10:31:36   作者:萌萌噠二狗子  
本文主要介紹了JAVA使用前綴樹(Tire樹)實現(xiàn)敏感詞過濾、詞典搜索,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

簡介

有時候需要對用戶輸入的內(nèi)容進行敏感詞過濾,或者實現(xiàn)查找文本中出現(xiàn)的詞典中的詞,用遍歷的方式進行替換或者查找效率非常低,這里提供一個基于Trie樹的方式,進行關(guān)鍵詞的查找與過濾,在詞典比較大的情況下效率非常高。

Trie樹

Trie樹,又叫前綴樹,多說無益,直接看圖就明白了

詞典:[“豬狗”, “小狗”, “小貓”, “小豬”, “垃圾”, “狗東西”]

Tire數(shù)據(jù)結(jié)構(gòu):

在這里插入圖片描述

code

樹節(jié)點Node.class

/**
 * trie tree
 *
 * @author lovely dog
 * @date 2020/10/20
 */
public class Node {
    /**
     * 子節(jié)點
     */
    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

/**
 * trie tree searcher
 *
 * @author lovely dog
 * @date 2020/10/20
 */
public class TrieSearcher {

    private Node root = new Node();

    /**
     * 添加詞
     *
     * @param word 詞
     */
    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;
        }
    }

    /**
     * 替換詞
     *
     * @param text         待處理文本
     * @param afterReplace 替換后的詞
     * @return 處理后的文本
     */
    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();
    }

    /**
     * 查找
     *
     * @param text 待處理文本
     * @return 統(tǒng)計數(shù)據(jù) key: word value: count
     */
    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

結(jié)論

在僅有短文本和小詞典的情況下,通過性能測試可以看出前綴樹的效率很高,隨著文本和詞典的增長,性能提升會非常明顯。

到此這篇關(guān)于JAVA使用前綴樹(Tire樹)實現(xiàn)敏感詞過濾、詞典搜索的文章就介紹到這了,更多相關(guān)JAVA前綴樹敏感詞過濾內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java的MyBatis框架中XML映射緩存的使用教程

    Java的MyBatis框架中XML映射緩存的使用教程

    MyBatis程序在做好XML映射后能夠有緩存的功能,這樣映射過SQL語句的配置以后就可以拿過來直接用了,這里我們來一起總結(jié)一下Java的MyBatis框架中XML映射緩存的使用教程
    2016-06-06
  • Java取整與四舍五入

    Java取整與四舍五入

    本文詳細(xì)講解了Java取整與四舍五入,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • Java通過SMS短信平臺實現(xiàn)發(fā)短信功能 含多語言

    Java通過SMS短信平臺實現(xiàn)發(fā)短信功能 含多語言

    這篇文章主要為大家詳細(xì)介紹了Java通過SMS短信平臺實現(xiàn)發(fā)短信功能的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-07-07
  • IDEA maven項目中刷新依賴的兩種方法小結(jié)

    IDEA maven項目中刷新依賴的兩種方法小結(jié)

    這篇文章主要介紹了IDEA maven項目中刷新依賴的兩種方法小結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java數(shù)據(jù)類型分類與基本數(shù)據(jù)類型轉(zhuǎn)換

    Java數(shù)據(jù)類型分類與基本數(shù)據(jù)類型轉(zhuǎn)換

    這篇文章主要介紹了Java數(shù)據(jù)類型分類與基本數(shù)據(jù)類型轉(zhuǎn)換,Java的數(shù)據(jù)類型主要分為兩類,基本數(shù)據(jù)類型、引用數(shù)據(jù)類型,下文詳細(xì)介紹,感興趣的朋友可以參考一下
    2022-07-07
  • 關(guān)于spring.factories失效原因分析及解決

    關(guān)于spring.factories失效原因分析及解決

    這篇文章主要介紹了關(guān)于spring.factories失效原因分析及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java日常練習(xí)題,每天進步一點點(25)

    Java日常練習(xí)題,每天進步一點點(25)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • Spring Boot學(xué)習(xí)入門之統(tǒng)一異常處理詳解

    Spring Boot學(xué)習(xí)入門之統(tǒng)一異常處理詳解

    我們在做Web應(yīng)用的時候,請求處理過程中發(fā)生錯誤是非常常見的情況。下面這篇文章主要給大家介紹了關(guān)于Spring Boot學(xué)習(xí)入門之統(tǒng)一異常處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-09-09
  • java substring(a)與substring(a,b)的使用說明

    java substring(a)與substring(a,b)的使用說明

    這篇文章主要介紹了java substring(a)與substring(a,b)的使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Java之SpringBoot集成ActiveMQ消息中間件案例講解

    Java之SpringBoot集成ActiveMQ消息中間件案例講解

    這篇文章主要介紹了Java之SpringBoot集成ActiveMQ消息中間件案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評論