You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现移除文本停用词并统计高频词问题求助

Java移除停用词并统计高频词问题修复

原代码的核心问题

  • 读取hello.txt时,fis2.read(b) 错误使用了对应停用词文件的b数组,而非目标文件的b1数组,导致目标内容未被读取,后续循环无数据输出
  • 单词分割正则错误:split("/s") 无法匹配空格,正确写法是split("\\s+")(匹配任意数量空白字符,包括空格、制表符等)
  • 遍历处理时误用了停用词文件的行数据data[i],而非目标文件的行data1[i]
  • 单词数统计读取的是原hello.txt,而非移除停用词后的内容
  • 缺失核心的词频统计(HashMap)和前n个高频词排序逻辑

修正后的完整实现

以下代码实现了移除停用词、统计词频、输出前n个高频词的完整功能,同时修复了原代码的各类问题:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;

public class WordFrequencyProcessor {

    public static void main(String[] args) {
        final String STOPWORDS_PATH = "stopwords.txt";
        final String TARGET_PATH = "hello.txt";
        final int TOP_N = 5; // 自定义要显示的前N个高频词

        // 1. 读取停用词,用HashSet提升查询效率
        Set<String> stopWords = new HashSet<>();
        try (BufferedReader br = new BufferedReader(new FileReader(STOPWORDS_PATH))) {
            String line;
            while ((line = br.readLine()) != null) {
                stopWords.add(line.trim().toLowerCase());
            }
        } catch (IOException e) {
            System.err.println("读取停用词文件失败:" + e.getMessage());
            return;
        }

        // 2. 处理目标文件,移除停用词并统计词频
        Map<String, Integer> wordFrequency = new HashMap<>();
        StringBuilder processedContent = new StringBuilder();

        try (BufferedReader br = new BufferedReader(new FileReader(TARGET_PATH))) {
            String line;
            while ((line = br.readLine()) != null) {
                // 分割行内单词,处理大小写和空白
                String[] words = line.trim().split("\\s+");
                StringBuilder processedLine = new StringBuilder();

                for (String word : words) {
                    String lowerCaseWord = word.trim().toLowerCase();
                    // 跳过停用词
                    if (!stopWords.contains(lowerCaseWord)) {
                        processedLine.append(word).append(" ");
                        // 更新词频统计
                        wordFrequency.put(lowerCaseWord, wordFrequency.getOrDefault(lowerCaseWord, 0) + 1);
                    }
                }

                if (!processedLine.isEmpty()) {
                    processedContent.append(processedLine).append("\n");
                }
            }
        } catch (IOException e) {
            System.err.println("读取目标文件失败:" + e.getMessage());
            return;
        }

        // 3. 输出处理后的内容
        System.out.println("移除停用词后的内容:");
        System.out.println(processedContent);

        // 4. 统计并输出处理后的单词总数
        int totalWords = wordFrequency.values().stream().mapToInt(Integer::intValue).sum();
        System.out.println("\n处理后的单词总数:" + totalWords);

        // 5. 排序并输出前N个高频词
        System.out.println("\n前" + TOP_N + "个高频词:");
        // 将HashMap转换为列表,按词频降序排序,词频相同则按字母升序
        List<Map.Entry<String, Integer>> sortedEntries = new ArrayList<>(wordFrequency.entrySet());
        sortedEntries.sort((e1, e2) -> {
            int freqCompare = e2.getValue().compareTo(e1.getValue());
            if (freqCompare != 0) {
                return freqCompare;
            }
            return e1.getKey().compareTo(e2.getKey());
        });

        // 输出前N个(如果词数不足N则输出全部)
        int displayCount = Math.min(TOP_N, sortedEntries.size());
        for (int i = 0; i < displayCount; i++) {
            Map.Entry<String, Integer> entry = sortedEntries.get(i);
            System.out.printf("%s: %d\n", entry.getKey(), entry.getValue());
        }
    }
}

关键优化说明

  • 停用词存储:用HashSet替代ArrayList,查询停用词的时间复杂度从O(n)降到O(1),处理大文件时效率更高
  • 文件读取:使用BufferedReader逐行读取,避免一次性读取大文件导致的内存溢出问题
  • 词频统计:用HashMap记录每个非停用词的出现次数,getOrDefault方法简化计数逻辑
  • 排序逻辑:对词频条目按降序排序,词频相同时按单词字母顺序升序,保证结果有序
  • 异常处理:针对文件读取异常给出明确提示,避免程序静默失败

内容的提问来源于stack exchange,提问作者imherebcsomethingisntworking

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:45:42