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

项目要求
源码地址

一、需求分析

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

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

二、功能设计

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

三、设计实现

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

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

四、测试运行

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

1616084-20190319092332826-1620252447.png

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

1616084-20190319092356244-1458594173.png

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

1616084-20190319092349463-717958399.png

result.txt

1616084-20190322075820358-229018048.png

五、部分代码


输出柱状图:

                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);
                
            }

六、总结

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

七、PSP

实际完成时间(min)计划完成时间(min)任务内容PSP2.1
2820计划Planning
2820估计这个任务需要多少时间,并规划大致工作步骤Estimate
1020674开发Development
3020需求分析(包括学习新技术)Analysis
3520设计Design
2210设计复审Design Review
54代码规范Coding Standard
5860具体设计Design
720480具体编码Coding
12060代码复审Code Review
3020测试test
6560报告Reporting
3030测试报告Test Report
2020计算工作量Size Measurement
1510事后总结,病提出过程改进计划Postmortem & Process Improvement Plan

通过总结,发现本次项目的计划时间与实际完成时间出入比较大,尤其在具体编码方面,体现了我的动手编写代码能力不足,需要加强,也是因为设计的时候没有细化,不够完善,导致编写代码时不顺利。在今后的学习中,希望可以加强我的项目具体设计能力及编程能力。

转载于:https://www.cnblogs.com/SongFeiF/p/10556475.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值