单词统计2 续
这次的课堂作业是接着上一次的课堂作业。第一步:输出单个文件中的前 N 个最常出现的英语单词。输出文件中所有不重复的单词,按照出现次数由多到少排列,出现次数同样多的,以字典序排列。 指定文件目录,对目录下每一个文件执行统计的操作。 指定文件目录,是会递归遍历目录下的所有子目录的文件进行统计单词的功能。输出出现次数最多的前 n 个单词。
代码为:
package piao; import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Scanner; import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; public class piao { public static void main(String[] args) throws Exception { BufferedReader reader = new BufferedReader(new FileReader( "D:\\飘.txt")); StringBuffer buffer = new StringBuffer(); String line = null; while ((line = reader.readLine()) != null) { buffer.append(line); } reader.close(); Pattern expression = Pattern.compile("[a-zA-Z]+");// 定义正则表达式匹配单词 String string = buffer.toString(); Matcher matcher = expression.matcher(string);// Map<String, Integer> map = new TreeMap<String, Integer>(); String word = ""; int times = 0; while (matcher.find()) {// 是否匹配单词 word = matcher.group();// 得到一个单词-树映射的键 if (map.containsKey(word)) {// 如果包含该键,单词出现过 times = map.get(word);// 得到单词出现的次数 map.put(word, times + 1); } else { map.put(word, 1);// 否则单词第一次出现,添加到映射中 } } /* * 核心:如何按照TreeMap 的value排序而不是key排序.将Map.Entry放在集合里, 重写比较器,在用 * Collections.sort(list, comparator);进行 排序 */ List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>( map.entrySet()); /* * 重写比较器 * 取出单词个数(value)比较 */ Comparator<Map.Entry<String, Integer>> comparator = new Comparator<Map.Entry<String, Integer>>() { public int compare(Map.Entry<String, Integer> left, Map.Entry<String, Integer> right) { return (left.getValue()).compareTo(right.getValue()); } }; Collections.sort(list, comparator);// 排序 System.out.println("请输入要输出的单词个数:"); Scanner s=new Scanner(System.in); int n=s.nextInt(); int last = list.size() - 1; for (int i = last; i > last - n; i--) { String key = list.get(i).getKey(); Integer value = list.get(i).getValue(); System.out.println(key + " :" + value); } } }
结果截图为:
第二步:
支持 stop words。在一本小说里, 频率出现最高的单词一般都是 "a", "it", "the", "and", "this", 这些词, 可以做一个 stop word 文件 (停词表), 在统计词汇的时候,跳过这些词。 我们把这个文件叫 "stopwords.txt" 。
思路就是,建立一个stopwords.txt文本文件,把一些常用词放在这个表里,然后利用这个停词表,在输出文件中出现频率最高的单词时,去掉这几个单词。
代码为:
package piao;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class piao2 {
public class stopwords
{
HashSet<String> set = new HashSet<>();
public stopwords()
{
String File = "";
try
{
String path = "D:\\stopwords.txt";
Scanner in = null;
piao2 pp2=new piao2();
in = new Scanner(pp2.get(path));
while (in.hasNextLine())
{
File += in.nextLine();
}
} catch (Exception e)
{
System.err.println("无该文件");
e.printStackTrace();
}
for (String string : File.split(" "))
{
set.add(string);
}
System.out.println(set);
}
public boolean get(String a)
{
return set.contains(a);
}
}
public static void main(String[] args) throws Exception {
BufferedReader r = new BufferedReader(new FileReader("D:\\飘.txt"));
StringBuffer buffer = new StringBuffer();
String line = null;
while ((line = r.readLine()) != null) {
buffer.append(line);
}
r.close();
Pattern expression = Pattern.compile("[a-zA-Z]+");// 定义正则表达式匹配单词
String s = buffer.toString();
Matcher m = expression.matcher(s);
Map<String, Integer> map = new TreeMap<String, Integer>();
String word = "";
int times = 0;
while (m.find()) {// 是否匹配单词
word = m.group();// 得到一个单词-树映射的键
if (map.containsKey(word)) {// 如果包含该键,单词出现过
times = map.get(word);// 得到单词出现的次数
map.put(word, times + 1);
}
else {
map.put(word, 1);// 否则单词第一次出现,添加到映射中
}
}
List<Map.Entry<String, Integer>>list = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>(){// 排序,打印
public int compare(Map.Entry<String, Integer> left,Map.Entry<String, Integer> right) {
return (left.getValue()).compareTo(right.getValue());
}
});
int last = list.size() - 1;
for (int i = last; i > 0; i--) {
String key = list.get(i).getKey();
Integer value = list.get(i).getValue();
System.out.println(key + " :" + value);
}
}
public Readable get(String path) {
// TODO Auto-generated method stub
return null;
}
}
这个是stopwords.txt里的内容
结果截图: