单词词频统计(12组)
单词词频统计
0.前言
该程序写于2018年7月9日,在北京航空航天大学与南通大学鞠小林老师结对完成。在此期间通过结对编程完成整个项目的需求分析、设计、开发、测试等。现在回顾一下这个程序的编写过程。与鞠老师的合作是很愉快的。总体信息如下:
+ 小组GitHub 地址:https://github.com/yuan574954352/WordCount
+ 博客园博客地址:
+ PSP
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
|
|
· Estimate |
· 估计这个任务需要多少时间 |
10 |
15 |
Development |
开发 |
0 |
0 |
· Analysis |
· 需求分析 (包括学习新技术) |
30 |
30 |
· Design Spec |
· 生成设计文档 |
15 |
15 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
20 |
30 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
5 |
5 |
· Design |
· 具体设计 |
10 |
20 |
· Coding |
· 具体编码 |
40 |
80 |
· Code Review |
· 代码复审 |
20 |
30 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
40 |
50 |
Reporting |
报告 |
0 |
0 |
· Test Report |
· 测试报告 |
5 |
10 |
· Size Measurement |
· 计算工作量 |
5 |
5 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
10 |
20 |
|
合计 |
210 |
310 |
- 设计思路
Java中的Map接口建立了 key 和 value 的映射。拟采用 key 存储需要统计的字符(或单词),value 则对应对应字符(或单词)的频率。
例如, 建立一个map,其中的key存储的是字符(a,w,z等),value则存储的对应的频率。
2.系统框架
程序的整体开发流程如下:
(1)对文本中非英语的一切字符进行过滤,只留下英语和必要的空格,能够区分不同单词,同时对于英语中特别的字符要加以处理)
(2)过滤出单词
(3)对单词首先在数据表中“查找”操作,如果存在,则更新值,如果不存在,则插入值。
(4)寻找合适的呈现方法,将最终的数据呈现出来,表格、文件等
主要处理流程是:
main(String[] args) { |
|
|
lib test = new lib(); |
|
test.dealFile(args); |
|
orderList1 = test.sortMap(test.getMap1()); |
|
orderList2 = test.sortMap(test.getMap2()); |
|
test.out("output1.txt",orderList1); |
|
test.out("output2.txt",orderList2); |
|
} |
Step1: 函数dealFile(),逐行读取文件; 调用函数 dealLine() 来处理每一行字符和字符串;统计好频率放到对应的全局变量 map1、map2;
Step2: 函数sortMap()是对 map (map1 和 map2)的内容按 value 值降序排列;
Step3:函数out() 输出 top_n 字符(串)到指定的文件。
这个过程中用到了信息隐蔽原则,将上述4个主要函数dealFile、dealLine、sortMap、out 独立编写在 lib.java文件中;其中 dealFile 循环调用 dealLine 函数以处理输入文件的每一行;
此外,在 lib.java 中编写了一些判断字符类型的短小的函数,如isZ()、isNumber()、isSplit()。
上述设计不足之处是采用if… else… 结构处理分词,效率比较低,而且容易遗漏一些特殊的单词组合情况。如以下单词:isn’t 、FFile3name 等
- 性能评估及改进
利用 JProfile 开展性能评估,处理大文件,gong_with_the_wind.txt第一次,运行时间大概2000+ms,分析发现系统打印输出代码耗费了大量的时间,因此移除了调试时插入的一些打印输出代码。程序执行时间大为缩短。大约339ms,主要时间耗费在 Map中元素的查找。