结对第二次—文献摘要热词统计及进阶需求
课程:软工实践(链接)
作业:结对第二次—文献摘要热词统计及进阶需求 (链接)
Github基础需求项目地址(链接)
Github进阶需求项目地址(链接)
结对学号:221600219 221600212
作业目标:
一、基本需求:实现一个能够对文本文件中的单词的词频进行统计的控制台程序。
二、进阶需求:在基本需求实现的基础上,编码实现顶会热词统计器。
一、Github签入记录
基础需求
进阶需求
自动测试
爬虫数据分析
二、基础需求
项目结构
├── PairProject1-Java
│ └── 221600219&221600212
│ └── src
│ ├── Main.java
│ └── Lib.java
类图
核心代码
三、进阶需求
项目结构
├── PairProject2-Java
│ └── 221600219&221600212
│ └── cvpr
│ ├── Main.java
│ └── result.txt
│ └── src
│ ├── Main.java
│ └── Lib.java
类图
核心代码
使用Junit 进行了单元测试:
单元测试的覆盖率:
使用Jprofiler进行性能测试
本次性能测试的数据都是爬虫爬取到的result.txt数据,一共502篇论文
优化前各项的耗时情况
分析:
我们发现早期的性能瓶颈是因为对文件进行了多次读取,并在每次读取都进行了排序,所以导致Lib.sortWordMap时间占用长。
对于这样的耗时情况,是不能接受的:
我们推翻的之前的方法,通过商讨,摒弃的之前较慢的字符串处理,而是采用了更快的二进制字节处理,同时原本的多次读取文件也改为了一次读取,多次使用。
main调用只读取一次文件:
收集单词使用二进制判断:
优化后各项的耗时情况
从原本的87s左右降低到了仅有3s,大幅度的提升了程序的运行速度:
爬虫
爬虫部分使用java编写,结合了Jsoup,先匹配CVPR网站上的ptitle类,然后查找类中的
python编写的自动测试工具
为了方便对基础代码进行自动测试,我使用了python的subprocess库进行对Java代码的自动编译和执行,用unitest来对Java程序的运行结果进行测试,用HTML_Runner_Chart库来对测试结果进行呈现。
代码已经开源至Github仓库:https://github.com/numb-men/wordCountAutoTest
代码目录和核心代码
使用Python自动测试结果(动图加载可能较慢)
四、附加题
我们使用Python的pyecharts、subprocess库,对Java的爬虫代码和WordCount进行了调用,对词组词数分别为1-5的情况进行了图表数据呈现。
github仓库地址:https://github.com/numb-men/cvpr2018DataAnalysis
当词组单词数为1时,发现最经常出现的词是learning,是啊,这是个learning的时代,一方面是机器学习、深度学习的火热,一方面是在这个时代IT不保持学习就会落后..
当词组数为2时,neural networks(神经网络)、convolutional neural(卷积神经)都出现在了热词里...
词组数为3时,前二都是卷积神经网络
我们对词组为2时进行了词云图分析
五、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 2310 | 2870 |
Estimate | 估计这个任务需要多少时间 | 2310 | 2870 |
Development | 开发 | 800 | 1000 |
Analysis | 需求分析 (包括学习新技术) | 100 | 100 |
Design Spec | 生成设计文档 | 60 | 30 |
Design Review | 设计复审 | 30 | 50 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 20 |
Design | 具体设计 | 180 | 250 |
Coding | 具体编码 | 800 | 1000 |
Code Review | 代码复审 | 110 | 110 |
Test | 测试(自我测试,修改代码,提交修改) | 100 | 150 |
Reporting | 报告 | 50 | 50 |
Test Repor | 测试报告 | 30 | 30 |
Size Measurement | 计算工作量 | 30 | 30 |
Postmortem & Process Improvement Plan |
事后总结, 并提出过程改进计划 | 60 | 50 |
All | 合计 | 2310 | 2870 |
六、遇到的困难与解决
- 使用字符串来进行单词的频率计算,效率低下。后面使用二进制字节来进行了所有的检测流程,效率提高了,但是编码的难度也提高了,好在付出了更多的时间之后还是解决了这个问题。
- 由于平时没有使用IDE,编写代码后都使用命令行运行,导致对IDEA并不熟悉,花了很多时间来进行程序的性能分析和单元测试覆盖率分析。
七、队友评价
- 感觉这次能和长平同学结对是一次很愉快的合作。在整个作业的分析,设计,开发,调试过程中,长平一直很认真的在对待,一起沟通问题解决问题。他较为丰富的开发经验以及对Bug的一丝不苟,保障了作业的高质量 完成同时也少走许多歪路。真的是一位很可靠的搭档!
八、总结
- 这次作业,小组遇到了不少的困难,但也收获了不少新的技能。这次在对需求的分析上,我们遇到了很多的障碍,其实很多需求在作业中已经给明了清晰的定义,只是我们在阅读需求文档的经验不足,导致不能够很敏锐的挖掘出这些潜在的信息。在这次作业里,我觉得我和我的队友都得到了很好的一次锻炼,也充分意识到了,在对需求没有一个清晰的理解下就动手编码,只会让作业的完成事半功倍。在以后的工作岗位上,我们一定会遇到更多的更苛刻的需求,所以很开心可以在这次作业中锻炼自己的这方面的阅读能力。
- 除了掌握基本的算法知识之外,掌握一些额外的技能也是很重要的,如使用python来进行数据的分析和处理,然后图表化呈现、使用Jprofiler进行Java的性能分析,这些技能能更好的辅助我们进行代码的编写。