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文件,输入要查找的一个或多个词语,以空格为分割符,返回各个单词的词频及柱状图:

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

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

result.txt

五、部分代码


### 输出柱状图: int i; String print = "";//记录输入单词及词频 String print2 = "\n";//记录柱状图 for(i=0; i 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
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

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

posted @ 2019-03-19 10:49  宋菲~  阅读(365)  评论(2编辑  收藏  举报