广告

Java正则统计HashMap词频并将词频与键绑定的完整实战教程

场景与目标

应用场景

在日志分析、文本统计和自然语言处理等场景中,快速统计词频并将词作为键绑定到 HashMap 的值,可以帮助开发者快速发现高频词和话题趋势。该实战教程围绕使用 Java 的正则表达式来提取词语,并将统计结果以 HashMap<String,Integer> 的形式绑定到词上,形成可查询的键值对集合。

通过本教程,你将掌握从文本中提取可统计的“词”,统一小写、去除标点等归一化步骤,以及利用 HashMap 增量统计的方法,最终输出带有排序信息的结果,方便后续分析和可视化。

核心目标

实现一个完整的实战案例,用正则提取词语统计词频、以及将统计结果绑定到词作为键,形成可直接使用的数据结构。

同时提供可复用的代码片段,方便你在真实项目中替换输入文本源(文件、数据库、日志流等),并输出 Top-K词云数据 等分析结果。

正则策略与数据结构

正则表达式设计

为了兼容多语言文本,[\\p{L}\\p{N}]+ 能匹配任意语言的字母与数字序列,涵盖中文、英文、数字等字符。

通过 PatternMatcher 组合,逐词提取可以避免复杂的分词逻辑,确保稳定性和可维护性。

数据结构选择

选用 HashMap<String,Integer>,其中键是单词(词)值是该词出现的次数,实现直观的词频绑定。

若后续需要高频词排序或输出 Top-K,可以将 HashMap 转换为 List<Map.Entry<String,Integer>>,并进行排序。

完整实现

核心方法实现

核心逻辑包括:正则提取文本归一化增量统计,以及返回绑定了词频的映射。

下面给出一个简化但完整的核心实现,帮助你把思路落地到代码中。


public class WordFrequencyHashMap {// 使用正则提取单词,支持多语言字符private static final Pattern WORD_PATTERN = Pattern.compile("[\\p{L}\\p{N}]+");public static Map<String, Integer> countWordFrequency(String text) {Map<String, Integer> frequency = new HashMap<>();if (text == null || text.isEmpty()) return frequency;Matcher m = WORD_PATTERN.matcher(text.toLowerCase());while (m.find()) {String word = m.group();frequency.put(word, frequency.getOrDefault(word, 0) + 1);}return frequency;}
}

完整示例与排序输出

要查看结果,可以将统计结果按频次排序后输出,方便识别高频词并进行后续分析。 排序输出 是常见且实用的展示方式。

此外,示例中包含从文件读取文本的能力,便于在实际工程中替换为日志、文档库等数据源。


import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;public class WordFrequencyHashMap {private static final Pattern WORD_PATTERN = Pattern.compile("[\\p{L}\\p{N}]+");public static Map<String, Integer> countWordFrequency(String text) {Map<String, Integer> frequency = new HashMap<>();if (text == null || text.isEmpty()) return frequency;Matcher m = WORD_PATTERN.matcher(text.toLowerCase());while (m.find()) {String word = m.group();frequency.put(word, frequency.getOrDefault(word, 0) + 1);}return frequency;}public static void main(String[] args) throws IOException {String text = Files.readString(Path.of("sample.txt"));Map<String, Integer> freq = countWordFrequency(text);// 将结果按频次从高到低排序freq.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()).thenComparing(Map.Entry.comparingByKey())).forEach(e -> System.out.println(e.getKey() + " : " + e.getValue()));}
}

进一步进阶与应用

从文本源到实际应用

在真实场景中,你可能需要直接从服务器日志、文档库、社交文本等数据源进行统计。只需将输入源替换为你实际的数据流,例如从日志文件、数据库字段、消息队列中的文本读取即可。

为了提升性能,可以考虑使用 并行处理,例如并行流(parallelStream)或分片遍历,确保在多核环境下的吞吐量。

结果后续处理

统计结果还可以进一步加工为 Top-K 列表词云数据、以及可视化所需的结构,便于前端展示和业务分析。

Java正则统计HashMap词频并将词频与键绑定的完整实战教程


import java.util.*;
import java.util.stream.Collectors;public class WordFrequencyTransformer {public static List> toTopK(Map freq, int k) {return freq.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()).thenComparing(Map.Entry.comparingByKey())).limit(k).collect(Collectors.toList());}public static List toWordCloudData(Map freq) {return freq.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())).map(Map.Entry::getKey).collect(Collectors.toList());}
}

广告

后端开发标签