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

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小时

 

 

 

 

 

 

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

以上是关于(第二周)新英文词频统计的主要内容,如果未能解决你的问题,请参考以下文章

词频统计(第二周)

第二周-词频统计更新

软件工程第二周作业----词频统计

第二周作业-词频统计

第二周进度条

第二周作业