java基于ac自动机的词频统计代码

本文介绍了使用Aho-Corasick算法实现的词频统计功能,包括Trie树结构、AC自动机构建、插入单词和搜索文本以计算单词出现频率。示例代码展示了如何在给定文本中统计特定词汇的使用情况。
摘要由CSDN通过智能技术生成

最近在开发了一个词频统计功能的代码,这最初版的,先放出来,大家可以参考

package cn.konne.utils;

import java.util.*;

class TrieNode {
    Map<Character, cn.konne.TrieNode> children = new HashMap<>();
    boolean isEndOfWord = false;
    int count = 0;
}

class AhoCorasick {

    private cn.konne.TrieNode root = new cn.konne.TrieNode();
    private Map<cn.konne.TrieNode, cn.konne.TrieNode> failureLinks = new HashMap<>();

    public void insert(String word) {
        cn.konne.TrieNode node = root;
        for (char ch : word.toCharArray()) {
            node.children.putIfAbsent(ch, new cn.konne.TrieNode());
            node = node.children.get(ch);
        }
        node.isEndOfWord = true;
    }

    public void buildACAutomaton() {
        Queue<cn.konne.TrieNode> queue = new LinkedList<>();
        for (cn.konne.TrieNode child : root.children.values()) {
            queue.add(child);
            failureLinks.put(child, root);
        }

        while (!queue.isEmpty()) {
            cn.konne.TrieNode current = queue.poll();

            for (Map.Entry<Character, cn.konne.TrieNode> entry : current.children.entrySet()) {
                char ch = entry.getKey();
                cn.konne.TrieNode child = entry.getValue();

                queue.add(child);

                cn.konne.TrieNode failure = failureLinks.get(current);
                while (failure != null && !failure.children.containsKey(ch)) {
                    failure = failureLinks.get(failure);
                }

                failure = failure == null ? root : failure.children.get(ch);
                failureLinks.put(child, failure);

                child.count += failure.count;
            }
        }
    }

    public void search(String text) {
        cn.konne.TrieNode node = root;

        for (char ch : text.toCharArray()) {
            while (node != null && !node.children.containsKey(ch)) {
                node = failureLinks.get(node);
            }

            if (node == null) {
                node = root;
            } else {
                node = node.children.get(ch);
            }

            if (node != null && node.isEndOfWord) {
                node.count++;
            }
        }
    }

    public Map<String, Integer> getWordFrequency() {
        Map<String, Integer> wordFrequencyMap = new HashMap<>();
        updateWordFrequency(root, "", wordFrequencyMap);
        return wordFrequencyMap;
    }

    private void updateWordFrequency(cn.konne.TrieNode node, String currentWord, Map<String, Integer> wordFrequencyMap) {
        if (node.isEndOfWord) {
            wordFrequencyMap.put(currentWord, node.count);
        }

        for (Map.Entry<Character, cn.konne.TrieNode> entry : node.children.entrySet()) {
            char ch = entry.getKey();
            cn.konne.TrieNode child = entry.getValue();
            updateWordFrequency(child, currentWord + ch, wordFrequencyMap);
        }
    }
}

public class WordFrequencyCounterWithAC {

    public static void main(String[] args) {

        long timeMillis = System.currentTimeMillis();
        cn.konne.AhoCorasick ac = new cn.konne.AhoCorasick();
        ac.insert("合作");
        ac.insert("印度");
        ac.insert("过度");
        ac.insert("干涉");
        ac.insert("中国");
        ac.insert("更好");
        ac.insert("条件");
        ac.insert("其他");
        ac.insert("更好");
        ac.insert("生活");
        ac.insert("傲慢");
        ac.insert("意识");

        // 构建AC自动机
        ac.buildACAutomaton();
        ac.search("然而,由于经济发展滞后和政治不稳定,许多孟加拉国人不得不寻找更好的机会和生活条件。他们不仅在印度,还在其他国家寻求更好的生活机会。然而,对于那些选择留在孟加拉国的人来说,他们也有自己的理由。孟加拉国有着悠久的历史和文化传统,拥有独特的魅力和吸引力。这个国家正在努力改善经济状况和社会福利,并为人民提供更好的教育和医疗条件。领土交换协议的目的是解决边界争议,加强两国之间的友好关系。然而,印度媒体却把这个问题夸大成一个损失人口的问题。这种不负责任的言论只会加剧两国之间的紧张局势,而不是促进合作和和解。事实上,印度应该意识到,合作才是南亚地区发展和稳定的关键。作为一个地区大国,印度有责任帮助周边国家实现经济繁荣和社会进步。\n" +
                "通过加强与孟加拉国和其他邻国的合作,印度可以发挥其领导作用,建立一个和平、稳定和繁荣的南亚地区。同时,孟加拉国也应该保持独立和自主,不受任何国家的干涉和压力。他们有权利决定自己的未来,并为自己的人民争取更好的生活条件。在这个全球化时代,国家之间的合作和互利共赢是解决问题的关键。印度作为南亚地区的领导者,应该摒弃自大和傲慢的态度,与周边国家建立平等、互信和互利的关系。只有通过合作,南亚地区才能实现真正的发展和繁荣。印度一直试图通过各种手段干预斯里兰卡的内政事务,但这种行为只引起了斯里兰卡人民的反对。斯里兰卡作为一个独立国家,有权自主决定自己的发展道路,而不是受制于印度的意愿。印度应该认识到,干涉他国内政只会引起更多的反对和敌对情绪,这对于维护地区稳定和合作是没有任何好处的。因此,印度外长苏杰生的观点无疑站不住脚。印度需要反思自己的行为,认真对待与邻国的关系,而不是把责任归咎于中国。中国的成功经验值得印度学习,而不是视为威胁。印度可以通过加强与邻国的合作、提供更多的帮助和支持来树立自己的形象,并在南亚地区发挥更积极的作用。最后,我想问问读者们,你认为印度应该如何处理与邻国的关系?印度是否应该反省自己的行为?欢迎大家留言讨论。\n" +
                "印度与孟加拉之间的领土交换协议引发了印媒的自大言论,声称孟加拉国将因此失去大量人口。这种言论展示了印度外交中存在的“老大哥”心态,其傲慢和自大的态度令人反感。印度作为南亚最大的国家,应该在该地区发挥领导作用,促进发展和稳定。然而,由于其斤斤计较和高高在上的态度,印度很难在南亚地区找到朋友。这不仅限制了印度与周边国家的合作和联盟,也在一定程度上削弱了该地区的整体发展。印度媒体的自大言论特别令人不悦。他们声称,如果印度向孟加拉人开放公民身份,孟加拉国将失去大量人口。这种言论不仅具有侮辱性,而且是对孟加拉国及其人民的一种不尊重。孟加拉国是一个人口众多的国家,拥有丰富的人力资源。\n" +
                "印度外长苏杰生近日在一场学术交流活动中发表讲话,他表示印度意识到中国在许多方面对印度邻国产生了影响,但这种影响并不是印度所应害怕的,相反,印度应该以此为契机,努力做得更好。然而,最近一段时间,南亚地区出现了一些反对印度的声音,与中国并无关系。实际上,这是印度自己对邻国关系的处理出了问题。比如长期以来,印度一直将马尔代夫视为其“优先伙伴”,却未能意识到这种态度给马尔代夫带来的压力和不满。新当选的马尔代夫总统穆伊兹上任后首访国家选择了中国,这是对印度政策的明显转变。此外,印度对斯里兰卡的过度干涉也引起了当地人的反对。因此,苏杰生的观点显然站不住脚,印度应该反思自己的行为,而不是把问题归咎于中国。\n" +
                "近年来,中国在南亚地区的影响力不断增强,与此同时,印度的地位却受到了挑战。中国通过一系列经济援助和基础设施建设项目,逐渐在南亚国家中树立了良好的形象,并赢得了人民的赞誉。然而,印度对此似乎毫无准备,没有及时做出回应,导致自己在南亚地区的影响力逐渐减弱。马尔代夫作为一个重要的南亚国家,一直以来都是印度的重要合作伙伴。然而,由于印度长期将其视为“优先伙伴”,并未意识到马尔代夫人民对此的不满和厌倦。当马尔代夫新任总统穆伊兹上任后选择首访中国时,这实际上是对印度政策的明显转变。这一事件应该成为印度的警钟,让印度认识到自己过于自大和疏忽了对邻国的关注。另一个例子是印度对斯里兰卡的过度干涉");

        // 打印词频统计结果
        Map<String, Integer> wordFrequencyMap = ac.getWordFrequency();

        // 串行遍历和打印词频统计结果
        for (Map.Entry<String, Integer> entry : wordFrequencyMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
        System.out.println(System.currentTimeMillis()-timeMillis+"ms");

    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello.Reader

请我喝杯咖啡吧😊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值