从《哈利·波特》到代码用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统计机制MapString, 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排序ListMap.EntryString, 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.EntryString, 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))); // 词频统计 MapString, 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); } } // 排序 ListMap.EntryString, 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等无意义词SetString stopWords Set.of(the, and, a, of, to); if (!stopWords.contains(word)) { // 统计逻辑 }词干提取识别running和ran为同一词根情感分析通过情感词典判断文本倾向文本分析就像摄神取念术能揭示作者自己都未察觉的用词习惯。我在分析《神奇动物在哪里》剧本时发现纽特说creature的次数是people的3倍——这完美反映了他对神奇生物的偏爱。
从《哈利·波特》到代码:用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统计机制MapString, 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排序ListMap.EntryString, 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.EntryString, 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))); // 词频统计 MapString, 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); } } // 排序 ListMap.EntryString, 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等无意义词SetString stopWords Set.of(the, and, a, of, to); if (!stopWords.contains(word)) { // 统计逻辑 }词干提取识别running和ran为同一词根情感分析通过情感词典判断文本倾向文本分析就像摄神取念术能揭示作者自己都未察觉的用词习惯。我在分析《神奇动物在哪里》剧本时发现纽特说creature的次数是people的3倍——这完美反映了他对神奇生物的偏爱。