当前位置: 首页 > 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.jsqmd.com/news/952588/

相关文章:

  • 避坑指南:Xilinx SelectIO IP核仿真中的异步复位与bitslip机制详解
  • 保姆级教程:用Omnic和Origin搞定FTIR光谱图,从CSV数据到发表级图表
  • 保姆级教程:不root不越狱,用华为电脑助手和MMRecovery完整导出微信聊天记录(含备份文件解析)
  • 告别一堆遥控器!用几十块钱成本搭建家庭红外控制中心,支持小爱、小度、天猫精灵
  • 别再只盯着集中式和分布式了:聊聊BMS硬件架构选型背后的那些‘坑’与实战考量
  • 抖音批量下载神器:三步搞定视频收藏与内容管理
  • LendNova:AI驱动的信用风险评估创新实践
  • 丝杆升降机运行不安全?一份完整检查指南送给你
  • 效率提升秘籍:用快马AI一键生成‘香香’宠物应用可扩展代码框架
  • 2026年海珠区黄金回收值得关注!这些专业广州黄金回收品牌你知道几个? - 极速版本
  • HP M126nw打印机实测:PS切片打印超长PDF的完整避坑指南(含Acrobat页眉页脚设置)
  • 不逐产业风口,坚守关键赛道:中国电子云以专属AI云,重新定义关键行业智能新底座
  • BilibiliDown终极指南:3步完成B站音频无损下载的完整教程
  • 告别一堆遥控器!用NodeMCU搭建家庭红外控制中枢,一个App搞定所有设备
  • OpenCore Legacy Patcher终极指南:如何让旧Mac焕发新生
  • 2026年5月AI无损测糖分选机品牌推荐,冬枣选果机/智能无损选果机/圣女果分选机,AI无损测糖分选机供应商推荐 - 品牌推荐师
  • 2026苏州管道疏通公司实测榜单|首选老牌靠谱店,避坑指南收好 - 极速版本
  • 时序伪造定位技术:DDNet框架解析与应用
  • 衡水地区,橡胶减震垫块厂商哪家交货快? - mypinpai
  • GEO优化行业权威白皮书:GEO优化的核心定义
  • 声学引力波的非线性效应与宇宙学研究
  • 从固话到5G承载网:PCM30/32(E1)技术是如何‘老树开新花’的?
  • 告别ORA-28547:深入理解Oracle Net与OCI驱动,从根源上解决连接问题
  • 嵌入式开发必知:Hex、Bin、Srec文件到底有啥区别?看完这篇别再搞混了
  • 硅胶异形件口碑如何?汇科橡胶告诉你 - mypinpai
  • 【AI测试智能体10】实测打脸:5轮对话后,顶级大模型qwen-plus秒变“失忆症患者”
  • 从‘异步’到‘同步’:聊聊电源里MOS管如何‘卷’掉了二极管(附SP6012驱动芯片实战解析)
  • 2026年当下北京专业滚针轴承直销厂商市场格局剖析与选择指南 - 2026年企业资讯
  • Flutter上架AppStore,我踩过的permission_handler权限坑(附完整Podfile配置)
  • AEC-Q氦质谱检漏试验