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
相关产品推荐
相关产品推荐

