统计一TXT文档中单词出现频率,输出频率最高的10个单词

该博客介绍了如何使用Java读取TXT文档,移除标点和常见无意义单词,通过哈希表计算单词频率,并按频率排序输出前10个高频单词。示例代码展示了整个处理过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验过程


主要思路就是首先将标点符号,常用冠词等替换掉,然后利用哈希表和数组原理排序,输出最高频率的前十个数组



代码如下



import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class test {
 public static void main(String[] args) throws IOException {
  long start = System.currentTimeMillis(); // 程序开始时间
  File file = new File("E:/TEST.txt");

  BufferedReader br = new BufferedReader(new FileReader(file));
  StringBuilder sb = new StringBuilder();
  String line = null;
  while ((line = br.readLine()) != null) {
   sb.append(line);
  }
  br.close(); // 关闭流

  String words = sb.toString(); // 全部的单词字符串
  String targetString = words.replaceAll("[.,\"\\?!:;\\(\\)]", ""); // 将标点替换为空

  // 分词并且定义英文中不代表实际意义的一些单词,如介词、代词、情态动词等
  String[] singleWord = targetString.split(" ");
  String[] keys = { "you", "i", "he", "she", "me", "him", "her", "it",
    "they", "them", "we", "us", "your", "your", "our", "his",
    "her", "its", "my", "in", "into", "on", "for", "out", "up",
    "down", "at", "to","too", "with", "by", "about", "among", "between",
    "over", "from", "be", "been", "am", "is", "are", "was", "were",
    "whthout", "the", "of", "and", "a", "an", "that", "this", "be",
    "or", "as", "will", "would", "can", "could", "may", "might",
    "shall", "should", "must", "has", "have", "had", "than" };

  // 将一部分常见的无意义的英语单词替换为字符 '#' 以便后面输出单词出现次数时的判断
  for (int i = 0; i < singleWord.length; i++) {
   for (String str : keys) {
    if (singleWord[i].equals(str))
     singleWord[i] = "#";
   }
  }

  // 将单词以及其出现的次数关联起来
  for (int i = 0; i < singleWord.length; i++) {
   count++; // 计算单词个数
   if ((wordMap.get(singleWord[i]) != null)) {
    int value = ((Integer) wordMap.get(singleWord[i])).intValue();
    value++;
    wordMap.put(singleWord[i].toLowerCase(), new Integer(value)); // 将单词转换为小写存放以统一格式
   } else {
    wordMap.put(singleWord[i].toLowerCase(), new Integer(1));
   }

  }

  System.out.println("\t\t--文件信息--");
  System.out.println("     名称: " + file.getName() + "    大小: "
    + file.length()/ 1024 + "KB");
  System.out.println("\t\t--文件信息--");
  System.out.println();
  System.out.println("■■■■ " + count + " 个单词中出现频率最高的 10 个单词如下■■■■");

  // 比较器, 按值排序
  System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");
  List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(
    wordMap.entrySet());
  Collections.sort(list, new Comparator<Entry<String, Integer>>() {
   public int compare(Entry<String, Integer> e1,
     Entry<String, Integer> e2) {
    if (e2.getValue() != null && e1.getValue() != null
      && e2.getValue().compareTo(e1.getValue()) > 0) {
     return 1;
    } else {
     return -1;
    }
   }
  });
 
  int wordCount = 1; // 记录已经输出单词的个数
  for (Map.Entry<String, Integer> entry : list) {
   if (entry.getKey().equals("#")) // 相当于过滤作用,不输出介词、代词、情态动词等无意义单词
    continue;
   System.out.printf("\t%2d、 %8s \t %4d次\n", wordCount,
     entry.getKey(), entry.getValue());
   if (wordCount++ == 10) { // 表示只输出10个
    long end = System.currentTimeMillis(); // 程序结束时间
    System.out.println("■■■■■■■■■■■■■■■ 耗时 " + (end - start)
      + " ms" + " ■■■■■■■■■■■■■■■■");
    return;
   }
  }
 }

 private static HashMap<String, Integer> wordMap = new HashMap<String, Integer>();
 private static int count = 0;
}


运行结果如图





并且用JDK自带的visualVM测试工具进行测试,测试见截图如下





可以使用Python中的collections模块中的Counter类来完成这个任务。具体步骤如下: 1. 读取txt文件内容 2.文件内容转换为小写字母,去除标点符号和换行符 3. 使用split()方法将字符串分割成单词列表 4. 使用Counter类统计每个单词出现的次数 5. 输出结果 下面是代码示例: ```python from collections import Counter # 读取txt文件内容 with open('example.txt', 'r') as f: text = f.read() # 将文件内容转换为小写字母,去除标点符号和换行符 text = text.lower().replace('\n', ' ').replace(',', '').replace('.', '').replace('!', '').replace('?', '') # 使用split()方法将字符串分割成单词列表 words = text.split() # 使用Counter类统计每个单词出现的次数 word_counts = Counter(words) # 输出结果 for word, count in word_counts.most_common(): print(f'{word}: {count}') ``` 解释代码: 1. 首先使用open()函数打开txt文件,使用with语句保证文件在使用后正确关闭。 2. 读取文件内容并赋值给变量text。 3. 对text进行系列字符串操作,将其转换为小写字母,去除标点符号和换行符。 4. 使用split()方法将text分割成单词列表,并赋值给变量words。 5. 使用Counter类对words中的单词进行统计,得到每个单词出现的次数,并赋值给变量word_counts。 6. 使用most_common()方法对word_counts进行排序,得到出现次数最多的单词列表,并遍历输出每个单词及其出现次数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值