首页 > 代码库 > (第二周)新英文词频统计

(第二周)新英文词频统计

需求分析

1、两种读取文件的方法(建立两个类):

  小文本输入、命令行输入文件名

2、进行词频统计

3、对结果进行排序并输出

https:https://git.coding.net/yanzouzhe/ywcptj.git

SSH:git@git.coding.net: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:0012:300:30120
编码java编写14:0022:004:30210
文档随笔19:3020:400:2050
讨论检查随笔格式20:4021:00020

 

 

 

 

 

PSP2.1任务时间(小时)
Planning计划:完成输入小文本统计词频计划2小时
计划:完成命令行输入文件名统计词频计划3小时
Analysis需求分析2小时
Coding具体编码3.5小时
Test测试功能(测试,修改代码)1小时

 

 

 

 

 

 

老师,我对您的作业要求只能理解到这种程度了,如果有问题还请见谅。

(第二周)新英文词频统计