201671030124 词频统计软件项目报告
本次开发使用了《构建之法》中个人开发流程(PSP),并使用了java语言编写代码。
1.需求分析
根据老师在博文实验二 软件工程个人项目中的要求,软件需求如下:
- 程序可读入任意英文文本文件,该文件中英文词数大于等于1个。
- 程序需要很壮健,能读取容纳英文原版《哈利波特》10万词以上的文章。
- 指定单词词频统计功能:用户可输入从该文本中想要查找词频的一个或任意多个英文单词,运行程序的统计功能可显示对应单词在文本中出现的次数和柱状图。
- 高频词统计功能:用户从键盘输入高频词输出的个数k,运行程序统计功能,可按文本中词频数降序显示前k个单词的词频及单词。
- 统计该文本所有单词数量及词频数,并能将单词及词频数按字典顺序输出到文件result.txt。
2.功能设计
- 读取英文文件内容的功能
- 输入单词可查找出该单词的词频
- 用柱状图显示查找所查找单词的词频
- 可以降序显示前k个单词的词频和单词
- 统计文本中的单词数量和词频数
- 按字典顺序排序文本中的单词
- 将按字典顺序排列的单词输出到文本result.txt
3.设计实现
该程序有四个类,分别是main类,CountOccurrenceOfWords类,HighFrequencyWords类,WordStorage类
- main类的作用是控制整个程序,使用BufferedReader实现文本的读取和绘制单词词频的柱状图三个功能;
- CountOccurrenceOfWords类是使用map的键值对实现单词词频的统计;
- HighFrequencyWords类是实现输出前k个词频最高的单词及其词频的功能;
- WordStorage类是实现将文本中的单词及其词频输出到result.txt文件中。
4.测试运行
5.代码展示
- 1.通过BufferedReader类读取文本内容
InputStreamReader is = new InputStreamReader(new FileInputStream(file), "utf-8");//将字节流转换为字符流
BufferedReader buff = new BufferedReader(is);//提供通用的缓冲方式文本读取
List<String> list = new ArrayList<String>();//list中只存放纯单词文本
String readLine = null;//单词列表初始为空
while((readLine = buff.readLine())!=null){
String[] WordsArr = readLine.split("[^a-zA-z]");
for(String word:WordsArr){
if(word.length()!=0){
list.add(word);//将截取后的纯单词放入list
}
}
}
- 2.使用map统计单词的词频
public class CountOccurrenceOfWords {
public String[] query(Map<String, Integer> Map,String s) {
String[] word= s.split(",");//使用逗号隔开单词
int i;
for(i=0; i<word.length; i++) {
for(Entry<String,Integer> entry : Map.entrySet()) {
if(word[i].equals(entry.getKey()))
{
System.out.println(entry.getKey() + ":\t " + entry.getValue());
break;
}
}
}
return word;
}
}
6.总结
首先按照软件开发的流程需求分析-概要设计-详细设计-编码-测试分析的顺序,按步骤做出每步所需做的事。但是由于之前没有相关的经验,还是习惯性的想着编码,但是最后基本都完成了。在实验刚开始的时候,我先按照老师所给的要求分析我需要实现几项功能,然后我先对每部分如何实现进行一些设计,比如如何读取文件的内容使用BufferedReader等,然后开始详细的设计实现功能所需要的数据结构和如何实现这个功能的流程等内容,之后按照前面的设计进行编码,最后进行测试代码是否正确。由于并不太擅长Java,所以在编写代码的时候,困难很大。
7.展示PSP
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 8 | 15 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 8 | 10 |
Development | 开发 | 82 | 120 |
Analysis | 需求分析 (包括学习新技术) | 6 | 10 |
Design Spec | 生成设计文档 | 10 | 20 |
Design Review | 设计复审 (和同事审核设计文档) | 4 | 5 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 3 | 5 |
Design | 具体设计 | 10 | 40 |
Coding | 具体编码 | 50 | 100 |
Code Review | 代码复审 | 20 | 40 |
Test | 测试(自我测试,修改代码,提交修改) | 10 | 20 |
Reporting | 报告 | 30 | 40 |
Test Report | 测试报告 | 10 | 15 |
Size Measurement | 计算工作量 | 5 | 10 |
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 15 | 30 |
由于第一回按照PSP进行软件开发,对时间的掌握还有自身能力的认识不足,导致实际花费时间比计划花费时间多出近一倍,尤其是编码阶段,本次软件开发使用Java开发,但是我的Java编码能力不是很好,导致编码过程状况频出,所以在编码阶段花费了大量的时间,通过本次实验,我认识到我的编码能力还有待提高。除此之外,我对软件工程的流程认识也不是很好,总是习惯性的直接想去编码,导致思路混乱。