当前位置: 首页 > news >正文

从《哈利·波特》到代码:用Java词频统计带你发现文本中的秘密(附完整源码)

从《哈利·波特》到代码:用Java词频统计带你发现文本中的秘密(附完整源码)

当J.K.罗琳写下"Harry"这个单词在《哈利·波特》系列中出现超过18,000次时,她可能没想到这会被编程初学者当作绝佳的数据分析案例。文本分析就像麻瓜世界的魔法——通过几行Java代码,我们就能揭开经典文学作品中隐藏的用词规律。本文将带你用HashMap和Collections.sort,像分析魁地奇比赛数据那样统计任意文本的词频分布。

1. 搭建你的"魔法实验室":基础环境准备

任何魔法实验都需要准备坩埚和魔杖,而我们的代码实验只需要:

import java.io.*; import java.util.*;

推荐使用IntelliJ IDEA或VS Code作为开发环境,它们就像魔法世界里的自动搅拌坩埚,能实时显示代码错误。新建一个Java项目时,记得勾选"Create git repository"选项——这相当于给你的实验施加一个"原形立现"咒语,随时可以回退到之前的版本。

提示:Windows用户如果遇到文件编码问题,可在读取文件时指定UTF-8编码:

new InputStreamReader(new FileInputStream("hp.txt"), "UTF-8")

2. 文本处理的"四分五裂"咒:字符串分割技术

在霍格沃茨,学生们用"Diffindo"咒语分割物体,而Java提供了两种文本分割方式:

2.1 String.split()方法

String spell = "Wingardium Leviosa"; String[] words = spell.split(" "); // 按空格分割 System.out.println(Arrays.toString(words)); // [Wingardium, Leviosa]

特殊符号需要转义处理,就像处理恶作剧物品那样小心:

String potion = "Dragon|Blood|Potion"; String[] ingredients = potion.split("\\|"); // 分割竖线

2.2 StringTokenizer类

这个老派但高效的类就像韦斯莱先生的汽车:

String quote = "It does not do to dwell on dreams"; StringTokenizer tokenizer = new StringTokenizer(quote); while(tokenizer.hasMoreTokens()) { System.out.println(tokenizer.nextToken()); }

两种方法的性能对比:

方法处理速度内存占用灵活性
String.split()较慢较高
StringTokenizer

3. 制作"活点地图":词频统计核心实现

现在我们要像制作活点地图那样,追踪每个单词出现的踪迹:

3.1 HashMap统计机制

Map<String, Integer> wordCount = new HashMap<>(); String text = "Harry Harry Hermione Ron Harry Hermione"; String[] words = text.split(" "); for (String word : words) { wordCount.put(word, wordCount.getOrDefault(word, 0) + 1); }

这段代码相当于给每个单词施了"踪迹显现"咒。getOrDefault()方法就像家养小精灵多比——如果找不到钥匙(单词),它会自动返回默认值0。

3.2 处理大小写和标点

真正的魔法师知道细节决定成败:

word = word.toLowerCase() .replaceAll("[^a-z]", ""); // 移除非字母字符

4. 制作"预言家日报"排行榜:排序与输出

是时候像丽塔·斯基特那样制作热门词汇排行榜了:

4.1 使用Collections.sort排序

List<Map.Entry<String, Integer>> sortedList = new ArrayList<>(wordCount.entrySet()); Collections.sort(sortedList, (a, b) -> b.getValue() - a.getValue());

这个lambda表达式就像速记羽毛笔,简洁地实现了降序排列。

4.2 可视化输出

让我们把结果打印得像魔法部公告那样整齐:

System.out.println("词汇热度榜:"); System.out.println("-------------------"); System.out.printf("%-15s | %s\n", "单词", "出现次数"); System.out.println("-------------------"); for (Map.Entry<String, Integer> entry : sortedList) { System.out.printf("%-15s | %d\n", entry.getKey(), entry.getValue()); }

完整代码示例(可直接运行):

import java.io.*; import java.util.*; public class WordFrequencyAnalyzer { public static void main(String[] args) throws IOException { // 读取《哈利·波特》文本文件 String content = new String(Files.readAllBytes(Paths.get("harry_potter.txt"))); // 词频统计 Map<String, Integer> wordCount = new HashMap<>(); String[] words = content.split("\\s+"); for (String word : words) { word = word.toLowerCase().replaceAll("[^a-z]", ""); if (!word.isEmpty()) { wordCount.put(word, wordCount.getOrDefault(word, 0) + 1); } } // 排序 List<Map.Entry<String, Integer>> sortedList = new ArrayList<>(wordCount.entrySet()); sortedList.sort((a, b) -> b.getValue() - a.getValue()); // 输出前20个高频词 System.out.println("《哈利·波特》高频词汇Top20:"); for (int i = 0; i < 20 && i < sortedList.size(); i++) { System.out.printf("%-10s %5d次\n", sortedList.get(i).getKey(), sortedList.get(i).getValue()); } } }

5. 进阶技巧:像傲罗那样分析文本

真正的文字侦探会关注这些细节:

  • 停用词过滤:忽略"the","and"等无意义词
Set<String> stopWords = Set.of("the", "and", "a", "of", "to"); if (!stopWords.contains(word)) { // 统计逻辑 }
  • 词干提取:识别"running"和"ran"为同一词根
  • 情感分析:通过情感词典判断文本倾向

文本分析就像摄神取念术,能揭示作者自己都未察觉的用词习惯。我在分析《神奇动物在哪里》剧本时发现,纽特说"creature"的次数是"people"的3倍——这完美反映了他对神奇生物的偏爱。

http://www.zskr.cn/news/1464203.html

相关文章:

  • 保姆级教程:不root不越狱,用华为电脑助手和MMRecovery完整导出微信聊天记录(含备份文件解析)
  • LendNova:AI驱动的信用风险评估创新实践
  • 不逐产业风口,坚守关键赛道:中国电子云以专属AI云,重新定义关键行业智能新底座
  • BilibiliDown终极指南:3步完成B站音频无损下载的完整教程
  • 2026苏州管道疏通公司实测榜单|首选老牌靠谱店,避坑指南收好 - 极速版本
  • 告别ORA-28547:深入理解Oracle Net与OCI驱动,从根源上解决连接问题
  • 【AI测试智能体10】实测打脸:5轮对话后,顶级大模型qwen-plus秒变“失忆症患者”
  • 硅胶异形件口碑如何?汇科橡胶告诉你 - mypinpai
  • UniApp微信分享卡壳?手把手教你搞定iOS Universal Links配置(HBuilderX + 苹果开发者后台)
  • AWVS新手避坑指南:用DVWA靶场完成你的第一次Web漏洞扫描
  • VMware克隆三台CentOS 7虚拟机后,别忘了检查这3个网络配置!否则集群搭建第一步就失败
  • 告别数小时环境配置:用快马平台云端qt环境即刻开启高效开发
  • AWVS扫描DVWA实战:从78个漏洞报告看如何优化扫描策略与结果分析
  • Linux 内核中的 cgroups:从资源隔离到内存规约
  • SystemVerilog 2012新特性实战:用‘with’和‘bins for sequence’写出更智能的覆盖率模型
  • 2026年近期浙江酒瓶采购方寻求优质厂家,这家企业值得深度关注 - 2026年企业资讯
  • 告别一堆遥控器!用NodeMCU做个红外中继,实现天猫精灵语音控制老空调
  • STM32H743用CubeMX一键移植ThreadX,新手避坑指南(实测STM32CubeIDE更稳)
  • informix 常用命令
  • 计算机毕业设计之基于大数据的网站流量日志数据分析系统
  • 给TMS320F28379D新手的中断配置避坑指南:从PIE映射到ISR的完整流程
  • ABAP开发避坑:内表行数 vs 数据库COUNT(*),性能差了多少?
  • 考验AI的“自我”、记忆和逻辑-AI对《红楼梦》后40回的改写(11)
  • 从VOC到自定义:手把手教你解决SSD-Pytorch训练中的5个常见版本兼容性错误
  • 开启ai辅助开发,在快马平台上让ai成为你的java学习路线私人导师与编程助手
  • 当激励成为投资:AI如何让每一分佣金花得透明、算得精准
  • 3分钟掌握:抖音去水印下载工具完全配置与实战指南
  • AI辅助开发:利用快马构建天元云防火墙智能日志分析与策略推荐系统
  • 告别繁琐配置:用快马ai一键生成cad自动化安装助手原型
  • 某金融 Agent 一天烧掉 2 万 API 费用,只因工具调用写了死循环