(第二周)新英文词频统计
Posted 演奏者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(第二周)新英文词频统计相关的知识,希望对你有一定的参考价值。
需求分析
1、两种读取文件的方法(建立两个类):
小文本输入、命令行输入文件名
2、进行词频统计
3、对结果进行排序并输出
https:https://git.coding.net/yanzouzhe/ywcptj.git
SSH:[email protected]:yanzouzhe/ywcptj.git
功能实现
1、小文本输入读取文件
public class Article { /** * @param args */ String content;// 保存文章的内容 String[] rawWords;// 保存分隔后的单词集合 String[] words;// 保存统计后的单词集合 int[] wordFreqs;// 保存单词对应的词频 // 统计总数 int total = 0; // 构造函数:输入文章的内容 public Article() { Scanner sc = new Scanner(System.in); System.out.println("请输入小文件内容:"); String nr = sc.nextLine(); content = nr; }
2、命令行输入文件名读取文件
public class Article2 { /** * @param args */ String content;//保存文章的内容 String[] rawWords;//保存分隔后的单词集合 String[] words;//保存统计后的单词集合 int[] wordFreqs;//保存单词对应的词频 String fileName;//文件名 // 统计总数 int total = 0; //构造函数:输入文章的内容 public Article2() throws IOException{ Scanner sc = new Scanner(System.in); System.out.println("请输入文件名:"); fileName = sc.nextLine(); File file = new File(fileName); if(!file.exists()){ System.out.println("文件不存在!"); return; } BufferedReader bf = new BufferedReader(new FileReader(file)); StringBuffer content = new StringBuffer(); //动态字符串数组 String temp = bf.readLine(); while(temp != null){ content.append(temp+" "); //往动态字符串数组里添加数据 temp = bf.readLine(); if(temp == null){ break; } } this.content = content.toString(); }
3、两个类中相同的分词方法
// 对文章根据分隔符进行分词,将结果保存到rawWords数组中 public void splitWord() { // 分词的时候,因为标点符号不参与,所以所有的符号全部替换为空格 final char SPACE = ‘ ‘; content = content.replace(‘\"‘, SPACE).replace(‘,‘, SPACE).replace(‘.‘, SPACE).replace(‘\‘‘, SPACE); content = content.replace(‘(‘, SPACE).replace(‘)‘, SPACE).replace(‘-‘, SPACE); rawWords = content.split("\\s+");// 凡是空格隔开的都算单词,上面替换了‘,所以I‘ve被分成两个单词 }
4、两个类中相同的统计词的方法
// 统计词,便利数组 public List<String> sort() { // 将所有出现的字符串放入唯一的list中,不用map,是因为map寻找效率太低了 List<String> list = new ArrayList<String>(); for (String word : rawWords) { list.add(word); } Collections.sort(list); return list; }
5、两个类中相同的词频排序方法
// 根据词频,将词数组和词频数组进行降序排序 public List countWordFreq() { // 统计词频信息 Map<String, Integer> wordsInfo = new TreeMap<String, Integer>(); String word = ""; // 词频名字 int count = 0; // 词频数量 //统计单词总数 int total = 0; List<String> wordList = sort(); word = wordList.get(0); for (int i = 0; i <= wordList.size(); i++) { if (i == wordList.size()) { wordsInfo.put(word, count); total++; break; } if (wordList.get(i).equals(word)) { count++; } else { wordsInfo.put(word, count); total++; word = wordList.get(i); count = 1; } } //词频信息排序 List<Map.Entry<String,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(wordsInfo.entrySet()); Collections.sort(list,new Comparator<Map.Entry<String,Integer>>(){ @Override public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { // TODO Auto-generated method stub return o2.getValue().compareTo(o1.getValue()); } }); this.total = total; return list; }
6、小文本输入中输出结果的方法
public void run() { // 拆分文本 splitWord(); // 统计词频 List<Map.Entry<String,Integer>> list = countWordFreq(); // 打印词频总数 System.out.println("词频总数:" + this.total); System.out.println("词频统计信息:"); // 打印统计词频 for (Map.Entry<String,Integer> mapping: list) { System.out.println(mapping.getKey()+" : "+mapping.getValue()); } } // 测试类的功能 public static void main(String[] args) { // TODO Auto-generated method stub Article a = new Article(); a.run(); }
7、命令行输入文件名类似的输出结果的方法,由于cmd执行,所以无法显示所有词频,只保留词频高的前10个显示出来
public void run() { // 拆分文本 splitWord(); // 统计词频 List<Map.Entry<String,Integer>> list = countWordFreq(); // 打印词频总数 System.out.println("词频总数:"); System.out.println("total:" + this.total); System.out.println("词频统计信息:"); // 打印统计词频 int m = 0; for (Map.Entry<String,Integer> mapping: list) { if(m<10){ System.out.println(mapping.getKey()+" : "+mapping.getValue()); m++; } else break; } } // 测试类的功能 public static void main(String[] args) throws IOException{ Article2 article2 = new Article2(); article2.run(); }
运行结果
1、小文本输入
2、按命令行输入文件名
词频统计PSP表格
项目:英文词频统计
项目类型:个人项目
项目完成情况:已完成
项目改进:已变更变更
项目日期:2016.9.11—2016.9.12
C类别 | C内容 | S开始时间 | ST结束时间 | I中断时间 | T净时间 |
分析 | 需求、设计 | 10:00 | 12:30 | 0:30 | 120 |
编码 | java编写 | 14:00 | 22:00 | 4:30 | 210 |
文档 | 随笔 | 19:30 | 20:40 | 0:20 | 50 |
讨论 | 检查随笔格式 | 20:40 | 21:00 | 0 | 20 |
PSP2.1 | 任务 | 时间(小时) |
Planning | 计划:完成输入小文本统计词频 | 计划2小时 |
计划:完成命令行输入文件名统计词频 | 计划3小时 | |
Analysis | 需求分析 | 2小时 |
Coding | 具体编码 | 3.5小时 |
Test | 测试功能(测试,修改代码) | 1小时 |
老师,我对您的作业要求只能理解到这种程度了,如果有问题还请见谅。