统计一TXT文档中单词出现频率,输出频率最高的10个单词
2014-10-18 21:17
771 查看
实验过程
主要思路就是首先将标点符号,常用冠词等替换掉,然后利用哈希表和数组原理排序,输出最高频率的前十个数组
代码如下
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;
}
运行结果如图
![](https://img-blog.csdn.net/20141019142655197?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzk0NjcyMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
、
并且用JDK自带的visualVM测试工具进行测试,测试见截图如下
![](https://img-blog.csdn.net/20141020112459830?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzk0NjcyMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
主要思路就是首先将标点符号,常用冠词等替换掉,然后利用哈希表和数组原理排序,输出最高频率的前十个数组
代码如下
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测试工具进行测试,测试见截图如下
相关文章推荐
- Linux作业(三)-shell统计某文章中出现频率最高的N个单词并排序输出出现次数
- 统计一段文字中出现频率最高的10个单词(c语言)
- 读取一段文档,输出每个单词出现的频率,并且把出现频率最高的十个单词输出。
- 一个文本文件统计各个单词出现的频率最高的10个词以及次数
- 统计一篇英文文章内每个单词出现频率,并返回出现频率最高的前10个单词及其出现次数
- Linux作业(三)-shell统计某文章中出现频率最高的N个单词并排序输出出现次数
- 统计一个文档中出现频率最多的10个单词(英文文档)
- 输入一段英文文本,用程序统计出现频率最高和最低的两个单词;
- 分析一个文本文件中各个单词出现的频率,把频率最高的10个词打印出来
- 统计一个文档中出现频率最多的k个单词的实现
- [python]使用Counter统计文章中出现频率最高的单词
- java 读取键盘输入到txt文件,统计每个单词出现的次数并输出
- 分析一个文本文件中各个单词出现的频率,把频率最高的10个词打印出来
- 找出文本中出现频率最高的10个单词(java实现)
- 针对一个文件 统计其中的单词和字符数 找出文件中出现次数最多的单词数 将文件中出现的单词按频率进行排序并输出
- 软件工程第一次作业:java实现分析一个文本文件中各个词出现的频率,并输出频率最高的10个词
- 输出一篇英文文章前十个出现频率最高的单词
- 统计出现频率最高的十个单词的程序性能分析
- 分析一个文档(英语文章)中各个词出现的频率,并打印频率最高的前10个。
- 一个简单的程序,统计文本文档中的单词和汉字数,逆序排列(出现频率高的排在最前面)。python实现。