最近在开发了一个词频统计功能的代码,这最初版的,先放出来,大家可以参考
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");
}
}