201671030111 词频统计软件项目报告

 项     目   内     容 
所属课程 软件工程
作业要求 实验二软件工程个人项目
课程目标 掌握软件项目个人开发流程,
掌握Github上发布软件项目的操作方法。
项目源码 源码链接

一、需求分析

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

二、功能设计

1.读取英文文本的功能;
2.可输出指定单词的词频(可输入一个或多个单词);
3.可显示对应单词的柱状图;
4.统计并输出前k个高频词及其词频;
5.统计文本中的单词数量及词频数;
6.将单词及词频数按字典顺序输出到文件result.txt。

三、设计实现

  • 1.项目包含两个类,分别是主函数Main类和实现功能的Function类。
  • 2.Main类的作用是实现用户选择功能、退出功能和读取英文文本的功能。
  • 3.Function类的作用是实现指定单词词频统计功能、统计并输出前k个高频词及其词频功能、统计文本所有单词数量及词频数并将单词及词频数按字典顺序输出到文件result.txt的功能和退出功能。
  • 4.流程图:
    201671030111 词频统计软件项目报告

四、测试运行

  • 1.指定单词词频统计功能:
    201671030111 词频统计软件项目报告
  • 2.高频词统计功能(前k个):
    201671030111 词频统计软件项目报告
  • 3.统计该文本所有单词数量及词频数,并将单词及词频数按字典顺序输出到文件result.txt:
    201671030111 词频统计软件项目报告
    201671030111 词频统计软件项目报告
  • 4.退出功能:
    201671030111 词频统计软件项目报告

五、部分代码展示

1.统计并输出前k个高频词及其词频

public void topword(TreeMap<String, Integer> wordFrequent) {
		Set<Map.Entry<String, Integer>> set=wordFrequent.entrySet();	
		List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(set);
		
		System.out.println("请输入单词个数:");
		int k = in.nextInt();
		int i;
		
		Collections.sort(list,new Comparator<Map.Entry<String,Integer>>() 
		{            
			public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) 
			{                
				return o2.getValue()-(o1.getValue());            
			}        
		});//end of sort
		
		for (i = 0; i < k; i++) 
		{
            System.out.println(list.get(i));
        }
		
		System.out.println("Over!");
        System.exit(0);
	}//end of topword	

2.将单词及词频数按字典顺序输出到文件result.txt

public void printresult(TreeMap<String, Integer> wordFrequent) throws IOException {
		Set<Map.Entry<String, Integer>> set=wordFrequent.entrySet();//返回treemap里的条目规则集
		FileWriter file = new FileWriter("result.txt");
		BufferedWriter reader = new BufferedWriter(file);

		for(Map.Entry<String, Integer> e:set)
	    {	
				reader.write(e.getKey() + ":" + e.getValue() + "	");
	    }
  
        reader.close();
        
        System.out.println("Over!");
        System.exit(0);
	}//end of printresult

六、总结

        主类里实现功能选择,简单的退出功能和调用Function类中的函数的功能,Function类里实现指定单词词频统计功能,高频词统计功能(前k个)和统计该文本所有单词数量及词频数,并将单词及词频数按字典顺序输出到文件result.txt的功能,每个功能用一个函数实现,以实现软件设计的“模块化”原则。

七、PSP

PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划 8 10
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 8 10
Development 开发 130 256
Analysis 需求分析 (包括学习新技术) 20 44
Design Spec 生成设计文档 10 14
Design Review 设计复审 10 12
Coding Standard 代码规范 5 5
Design 具体设计 10 10
Coding 具体编码 60 145
Code Review 代码复审 5 10
Test 测试(自我测试,修改代码,提交修改 10 16
Reporting 报告 5 5
Test Report 测试报告 3 2
Size Measurement 计算工作量 2 3
Postmortem & Process Improvement Plan 事后总结 ,并提出过程改进计划 3 5

        通过本项目,我对软件的开发流程有了大致的了解,这种规范化的流程对比我以往的代码编写方法确实有许多的优点;通过本项目,我也学到了一些新知识,比如怎样将TreeMap按value值排序,怎样在Github上发布软件项目;通过本项目,我也发现了自己还有许多不足之处,比如Java基础不好,编程实现困难。在本次项目开发中,我也有一点遗憾,一是没有实现选择功能的循环录入,二是因个人能力不足没有将指定单词的柱状图完全实现,而是用一种投机取巧的方式实现。