201671030116宋菲菲 词频统计软件项目报告

项目要求
源码地址 html

1、需求分析

尝试按照《构建之法》第2章中2.3所述PSP流程,使用JAVA编程语言,独立完成一个英文文本词频统计的软件开发。软件基本功能要求以下:

  • 程序可读入任意英文文本文件,该文件中英文词数大于等于1个。
  • 程序须要很壮健,能读取容纳英文原版《哈利波特》10万词以上的文章。
  • 指定单词词频统计功能:用户可输入从该文本中想要查找词频的一个或任意多个英文单词,运行程序的统计功能可显示对应单词在文本中出现的次数和柱状图。
  • 高频词统计功能:用户从键盘输入高频词输出的个数k,运行程序统计功能,可按文本中词频数降序显示前k个单词的词频及单词。
  • 统计该文本全部单词数量及词频数,并能将单词及词频数按字典顺序输出到文件result.txt。

2、功能设计

  • 读取文件text.txt,能容纳10万单词以上。
  • 统计词频,能够分解输入字符串并统计输入一个或多个单词的词频。
  • 统计高频词,用户输入高频词个数n,程序返回n个高频词以及每一个单词的词频。
  • 将text.txt文本中的单词及其词频按照字典顺序输出到文件result.txt文件中。

3、设计实现

项目主要包含两个类,一个是主函数Main,一个是统计单词的类SortResult。

  • 主函数Main中实现图形用户界面,实现各个功能。输入框3个,分别是原文本文件的文件名(采用相对路径),想要查找的一个或多个单词,想要查找的N高频词及其词频数。两个按钮,分别是“肯定”和“取消”。因为两个查找在同一个面板,防止出现冲突,若两个输入框均有输入,则实现第一个输入框的功能。点击肯定后,直接将字典顺序输出到result.txt文本中,而且实现相应功能。
  • SortResult中将文本中的每一个单词按照字典顺序将单词及词频数输出到result.txt文本文件中。

4、测试运行

读入text.txt文件,输入要查找的一个或多个词语,以空格为分割符,返回各个单词的词频及柱状图:

输入想要查找的高频单词个数n,输出前n个高频词及其频数:

若同时输入了查找单词和查找高频单词个数,只执行查找单词功能:

result.txt

5、部分代码


输出柱状图:

int i;
                String print = "";//记录输入单词及词频
                String print2 = "\n";//记录柱状图
                for(i=0; i<input.length; i++) 
                {
                    for(Entry<String, Integer> entry : wordsStatistics.entrySet()) 
                    { 
                        if(input[i].equals(entry.getKey()))
                        {
                            map.put(entry.getKey(), entry.getValue());

                            print2+=entry.getKey()+":\n";
                            for(int j=0;j<entry.getValue()/100;j++)
                                print2+="*";//柱状图以“*”显示
                            print2+="\n";
                            print += entry.getKey() + ":" + entry.getValue()+"    "; 
                            break;
                        }
                     } 
                 }
                JOptionPane.showConfirmDialog(null, print+print2,"结果",JOptionPane.DEFAULT_OPTION);

输出高频词:

if(admin.isEmpty() && !num.isEmpty()) //若输入单词栏为空且输入高频词个数不为空
            {
                int n=Integer.parseInt(num);//将读到的字符串转化为整型
                String print = "";
                ArrayList<Map.Entry<String,Integer>> resultlist = new ArrayList<Map.Entry<String,Integer>>(wordsStatistics.entrySet());//结果存入 resultlist
                
                Collections.sort(resultlist,new Comparator<Map.Entry<String,Integer>>(){  
                    @Override  
                    public int compare(Entry<String, Integer> w1, Entry<String, Integer> w2) {  
                        return w2.getValue() - w1.getValue();    //以降序的形式存入
                    }  
                }); 
                
                for(int i = 0; i<n; i++){  
                    print += resultlist.get(i).getKey()+ ": " +resultlist.get(i).getValue()+"    ";
                }
                JOptionPane.showConfirmDialog(null, print,"结果",JOptionPane.DEFAULT_OPTION);
                
            }

6、总结

  • 本次项目为单人项目,经过实践,大体了解了软件项目我的开发流程。从需求分析到设计实现再到测试运行,这次项目实验让我体验了每个步骤的具体实现。
  • 学会了在Github上发布软件项目的操做方法。
  • 项目完成后还有许多地方不足,好比柱状图没有用图形的样式表现出来。
  • 本次项目完成时的模块划分能力有所欠缺,只有两个模块,功能实现Main和字典输出到文本,多数功能都在Main中直接编码调用。

7、PSP

实际完成时间(min) 计划完成时间(min) 任务内容 PSP2.1
28 20 计划 Planning
28 20 估计这个任务须要多少时间,并规划大体工做步骤 Estimate
1020 674 开发 Development
30 20 需求分析(包括学习新技术) Analysis
35 20 设计 Design
22 10 设计复审 Design Review
5 4 代码规范 Coding Standard
58 60 具体设计 Design
720 480 具体编码 Coding
120 60 代码复审 Code Review
30 20 测试 test
65 60 报告 Reporting
30 30 测试报告 Test Report
20 20 计算工做量 Size Measurement
15 10 过后总结,病提出过程改进计划 Postmortem & Process Improvement Plan

经过总结,发现本次项目的计划时间与实际完成时间出入比较大,尤为在具体编码方面,体现了个人动手编写代码能力不足,须要增强,也是由于设计的时候没有细化,不够完善,致使编写代码时不顺利。在从此的学习中,但愿能够增强个人项目具体设计能力及编程能力。java

相关文章
相关标签/搜索