最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

簡(jiǎn)介

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

Trie樹(shù)

Trie樹(shù),又叫前綴樹(shù),多說(shuō)無(wú)益,直接看圖就明白了

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

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

在這里插入圖片描述

code

樹(shù)節(jié)點(diǎn)Node.class

/**
 * trie tree
 *
 * @author lovely dog
 * @date 2020/10/20
 */
public class Node {
    /**
     * 子節(jié)點(diǎn)
     */
    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()) {
                // 匹配完成, 進(jìn)行替換
                result.append(afterReplace);
                pos++;
                begin = pos;
                tmpNode = root;
            } else {
                // 匹配上向后移
                pos++;
            }
        }
        result.append(text.substring(begin));
        return result.toString();
    }

    /**
     * 查找
     *
     * @param text 待處理文本
     * @return 統(tǒng)計(jì)數(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;
    }
}

測(cè)試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ò)性能測(cè)試可以看出前綴樹(shù)的效率很高,隨著文本和詞典的增長(zhǎng),性能提升會(huì)非常明顯。

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

相關(guān)文章

  • 值得Java程序猿閱讀的書(shū)籍

    值得Java程序猿閱讀的書(shū)籍

    這篇文章主要推薦了一些值得Java程序猿閱讀的書(shū)籍,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • java容器類知識(shí)點(diǎn)詳細(xì)總結(jié)

    java容器類知識(shí)點(diǎn)詳細(xì)總結(jié)

    這篇文章主要介紹了java容器類知識(shí)點(diǎn)詳細(xì)總結(jié),
    2019-06-06
  • Java編程中正則表達(dá)式的用法總結(jié)

    Java編程中正則表達(dá)式的用法總結(jié)

    這篇文章主要介紹了Java編程中正則表達(dá)式的用法總結(jié),正則表達(dá)式是一種強(qiáng)大的字符串處理工具,Java對(duì)正則表達(dá)式的支持還是很不錯(cuò)的,我們先來(lái)整理一下正則表達(dá)式的一些基礎(chǔ)知識(shí):
    2016-05-05
  • 詳解Spring Boot的GenericApplicationContext使用教程

    詳解Spring Boot的GenericApplicationContext使用教程

    這篇教程展示了如何在Spring應(yīng)用程序中使用GenericApplicationContext 。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • Java實(shí)現(xiàn)跳躍表的示例詳解

    Java實(shí)現(xiàn)跳躍表的示例詳解

    跳表全稱叫做跳躍表,簡(jiǎn)稱跳表,是一個(gè)隨機(jī)化的數(shù)據(jù)結(jié)構(gòu),實(shí)質(zhì)就是一種可以進(jìn)行二分查找的有序鏈表。本文將利用Java語(yǔ)言編寫(xiě)一個(gè)跳表,需要的可以參考一下
    2022-05-05
  • java實(shí)現(xiàn)快速排序的方法

    java實(shí)現(xiàn)快速排序的方法

    這篇文章主要介紹了java實(shí)現(xiàn)快速排序的方法,涉及java排序的相關(guān)操作技巧,需要的朋友可以參考下
    2015-05-05
  • java壓縮zip文件中文亂碼問(wèn)題解決方法

    java壓縮zip文件中文亂碼問(wèn)題解決方法

    這篇文章主要介紹了java壓縮zip文件中文亂碼問(wèn)題的解決方法,需要的朋友可以參考下
    2014-07-07
  • Java 如何使用@Autowired注解自動(dòng)注入bean

    Java 如何使用@Autowired注解自動(dòng)注入bean

    這篇文章主要介紹了Java 使用@Autowired注解自動(dòng)注入bean的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • OpenFeign無(wú)法遠(yuǎn)程調(diào)用問(wèn)題及解決

    OpenFeign無(wú)法遠(yuǎn)程調(diào)用問(wèn)題及解決

    文章介紹了在使用Feign客戶端時(shí)遇到的讀超時(shí)問(wèn)題,并分析了原因是系統(tǒng)啟動(dòng)時(shí)未先加載Nacos配置,為了解決這個(gè)問(wèn)題,建議將Nacos配置放在`bootstrap.yml`文件中,以便項(xiàng)目啟動(dòng)時(shí)優(yōu)先加載Nacos配置
    2024-11-11
  • java 中鎖的性能提高辦法

    java 中鎖的性能提高辦法

    這篇文章主要介紹了java 中鎖的性能提高辦法的相關(guān)資料,需要的朋友可以參考下
    2017-02-02

最新評(píng)論

谷城县| 汉源县| 陆川县| 大荔县| 吉木萨尔县| 新建县| 威远县| 弥勒县| 福泉市| 曲靖市| 孟州市| 漳浦县| 崇礼县| 德昌县| 巩义市| 灵丘县| 玉门市| 吴旗县| 靖安县| 明水县| 潼关县| 汉川市| 兴和县| 江口县| 平阳县| 萨嘎县| 商城县| 基隆市| 庆阳市| 奉化市| 垫江县| 文安县| 开封市| 华亭县| 吉林市| 东安县| 吴桥县| 建湖县| 陆丰市| 西畴县| 石河子市|