
在文本处理任务中,停用词过滤(stop word removal)和词频统计(word frequency counting)是两个非常常见的步骤。停用词通常是那些在文本中出现频率很高但对文本含义贡献不小的词,例如“的”、“是”、“在”等。通过过滤这些词,我们可以更有效地分析文本的核心内容。本教程将指导您如何使用java实现这一过程。
处理文本文件的第一步是将其内容读取到内存中。Java NIO.2 提供的 java.nio.file.Files 类使得文件读写变得非常简洁高效。我们将使用 Files.readString() 方法来读取整个文件的内容。
首先,假设我们有两个文件:
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
public class TextProcessor {
public static void main(String[] args) {
// 创建示例文件 (实际应用中这些文件应已存在)
createExampleFiles();
try {
// 1. 读取原始文本文件
String helloTxtContent = Files.readString(Paths.get("hello.txt"), Charset.defaultCharset());
System.out.println("原始文本内容:
" + helloTxtContent);
// 2. 读取停用词文件
String stopWordsTxtContent = Files.readString(Paths.get("stopwords.txt"), Charset.defaultCharset());
// 将停用词解析为一个Set,方便快速查找
Set<String> stopWords = Arrays.stream(stopWordsTxtContent.split("\s+"))
.map(String::toLowerCase) // 转换为小写以实现不区分大小写的匹配
.collect(Collectors.toSet());
System.out.println("
停用词列表:
" + stopWords);
// ... 后续处理 ...
} catch (IOException e) {
e.printStackTrace();
}
}
// 辅助方法:创建示例文件
private static void createExampleFiles() {
try {
Files.writeString(Paths.get("hello.txt"), "remove leave remove leave remove leave re move remov e leave remove hello remove world!");
Files.writeString(Paths.get("stopwords.txt"), "remove world");
} catch (IOException e) {
e.printStackTrace();
}
}
}在上述代码中,我们首先通过 Files.readString() 读取了两个文件的内容。对于停用词,我们将其内容按空格分割,并转换为小写后存储在一个 Set 中,这有助于后续进行高效的包含性检查。
读取文件内容后,下一步是移除文本中的停用词。Java的 String.replaceAll() 方法结合正则表达式是实现这一功能的强大工具。为了确保只替换完整的单词而不是单词的一部分,我们需要使用正则表达式的单词边界 。
立即学习“Java免费学习笔记(深入)”;
// ... (接上一段代码)
// 3. 过滤停用词
String filteredText = helloTxtContent;
for (String stopWord : stopWords) {
// 使用正则表达式 确保只匹配完整的单词
// 忽略大小写匹配,并替换为空字符串
filteredText = filteredText.replaceAll("(?i)\b" + stopWord + "\b", "");
}
// 移除可能因为替换而产生的多余空格
filteredText = filteredText.replaceAll("\s+", " ").trim();
System.out.println("
过滤停用词后的文本:
" + filteredText);
// ... 后续处理 ...这里,"(?i)\b" + stopWord + "\b" 是一个关键的正则表达式:
如果需要将过滤后的文本保存到文件中,可以使用 Files.writeString() 方法。
// ... (接上一段代码)
// 4. 将过滤后的文本写回文件 (可选)
String outputFilePath = "filtered_hello.txt";
Files.writeString(Paths.get(outputFilePath), filteredText, Charset.defaultCharset());
System.out.println("
过滤后的文本已保存到: " + outputFilePath);
// ... 后续处理 ...这会将 filteredText 的内容写入到名为 filtered_hello.txt 的新文件中。如果文件已存在,其内容将被覆盖。
过滤完停用词后,我们可以对剩余的文本进行词频统计。这通常涉及以下步骤:
// ... (接上一段代码)
// 5. 词频统计
Map<String, Integer> wordFrequencies = new HashMap<>();
// 将文本分割成单词,并进行标准化处理
// 使用正则表达式匹配非字母数字字符,将其替换为空格,然后按空格分割
String[] words = filteredText.toLowerCase().split("[^a-zA-Z0-9]+");
for (String word : words) {
if (!word.isEmpty()) { // 排除空字符串
wordFrequencies.put(word, wordFrequencies.getOrDefault(word, 0) + 1);
}
}
System.out.println("
原始词频统计:
" + wordFrequencies);
// 6. 排序并获取Top N词汇
int topN = 5; // 例如,获取前5个高频词
List<Map.Entry<String, Integer>> sortedFrequencies = wordFrequencies.entrySet()
.stream()
.sorted(Map.Entry.<String, Integer>comparingByValue().reversed()) // 按词频降序排列
.limit(topN) // 取前N个
.collect(Collectors.toList());
System.out.println("
Top " + topN + " 高频词汇:");
for (Map.Entry<String, Integer> entry : sortedFrequencies) {
System.out.println(" " + entry.getKey() + ": " + entry.getValue());
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 辅助方法:创建示例文件 (已在前面定义,这里不再重复)
// private static void createExampleFiles() { ... }
}在词频统计部分:
将上述所有部分整合,形成一个完整的文本处理工具类:
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
public class TextProcessor {
public static void main(String[] args) {
// 辅助方法:创建示例文件 (实际应用中这些文件应已存在)
createExampleFiles();
try {
// 1. 读取原始文本文件
String helloTxtContent = Files.readString(Paths.get("hello.txt"), Charset.defaultCharset());
System.out.println("原始文本内容:
" + helloTxtContent);
// 2. 读取停用词文件并解析为Set
String stopWordsTxtContent = Files.readString(Paths.get("stopwords.txt"), Charset.defaultCharset());
Set<String> stopWords = Arrays.stream(stopWordsTxtContent.split("\s+"))
.map(String::toLowerCase)
.collect(Collectors.toSet());
System.out.println("
停用词列表:
" + stopWords);
// 3. 过滤停用词
String filteredText = helloTxtContent;
for (String stopWord : stopWords) {
filteredText = filteredText.replaceAll("(?i)\b" + stopWord + "\b", "");
}
filteredText = filteredText.replaceAll("\s+", " ").trim(); // 清理多余空格
System.out.println("
过滤停用词后的文本:
" + filteredText);
// 4. 将过滤后的文本写回文件 (可选)
String outputFilePath = "filtered_hello.txt";
Files.writeString(Paths.get(outputFilePath), filteredText, Charset.defaultCharset());
System.out.println("
过滤后的文本已保存到: " + outputFilePath);
// 5. 词频统计
Map<String, Integer> wordFrequencies = new HashMap<>();
String[] words = filteredText.toLowerCase().split("[^a-zA-Z0-9]+");
for (String word : words) {
if (!word.isEmpty()) {
wordFrequencies.put(word, wordFrequencies.getOrDefault(word, 0) + 1);
}
}
System.out.println("
原始词频统计:
" + wordFrequencies);
// 6. 排序并获取Top N词汇
int topN = 5;
List<Map.Entry<String, Integer>> sortedFrequencies = wordFrequencies.entrySet()
.stream()
.sorted(Map.Entry.<String, Integer>comparingByValue().reversed())
.limit(topN)
.collect(Collectors.toList());
System.out.println("
Top " + topN + " 高频词汇:");
for (Map.Entry<String, Integer> entry : sortedFrequencies) {
System.out.println(" " + entry.getKey() + ": " + entry.getValue());
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 辅助方法:创建示例文件
private static void createExampleFiles() {
try {
Files.writeString(Paths.get("hello.txt"), "remove leave remove leave remove leave re move remov e leave remove hello remove world!");
Files.writeString(Paths.get("stopwords.txt"), "remove world");
} catch (IOException e) {
e.printStackTrace();
}
}
}通过本教程,我们学习了如何使用Java NIO.2的 Files 类进行高效的文件读写,利用 String.replaceAll() 结合正则表达式实现精确的停用词过滤,并通过 HashMap 和 Stream API 完成词频统计与排序。掌握这些技术,您将能够有效地处理各种文本数据,为更高级的文本分析任务打下坚实的基础。
以上就是Java实现文本文件停用词过滤与词频统计教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号