团队成员:张贺 杨涛 石恩升
github地址:https://github.com/ThomasMrY/ASE-project-MSRA
题目简介:
此次编程的题目是——统计文本文件中英语单词的频率,作业要求我们不仅要完成题目功能,还要对我们的程序做speed testing 和 performance analysis.
题目的源地址:https://www.cnblogs.com/xinz/archive/2011/11/27/2265000.html
用户需求:英语的26 个字母的频率在一本小说中是如何分布的?某类型文章中常出现的单词是什么?某作家最常用的词汇是什么?《哈利波特》 中最常用的短语是什么,等等。 我们就写一些程序来解决这个问题,满足一下我们的好奇心。
程序要具有的基本功能:
第0步:输出某个英文文本文件中 26 字母出现的频率;
第一步:输出单个文件中的前 N 个最常出现的英语单词;
第二步: 支持 stop words,即略过停用词文件里的单词;
第三步: 统计常用的短语频率,短语包含的单词数目由人为规定;
第四步:把动词形态都统一之后再计数;
第五步:统计“动词-介词”短语的频率。
前期准备:
项目前期,我们小组在一起讨论了作业的实现思路,最终决定了我们工作流程和代码风格。
工作流程:首先,每个人根据自己的想法实现作业中的几个功能;然后,比较每个人的算法在各个任务上的性能,选择最优的版本继续开发;最后,通过pair programming的方式将最终代码汇总,并作性能分析和功能优化。
代码风格:我们投票决定使用python作为项目的开发语言,为了提高我们的合作效率,我们规定了代码中变量、函数的命名风格以及注释的格式。
变量、函数命名风格:
def CountLetters(fileName,n,stopName,verbName):
注释格式:
###########################################################################
#Name:CountLetters
#Inputs:fileName
# n : output the top N items in letters
# stopName: the file of stopwords skipped
# verbName: the file of verb dict
#outputs:None
#Author: ThomasY
#Date:2018.10.24
###########################################################################
开发阶段:
1、项目过程中,因为小组成员线下交流比较方便,因此,针对各个阶段功能的实现,我们遵守了先前的约定,各自完成功能核心代码后便进行了交流。经过比较代码性能,选择较好的版本并入项目,此过程我们通过结对编程来完成。
2、每增加一个功能,我们用“单元测试”验证代码的正确性和覆盖率,以step2:支持 stop words为例说明,我们在用测试用例测试该模块代码时,发现虽然可以100%实现预期功能,但其中两行代码总是无法覆盖,如下图所示:
红色阴影处是我们在删除单词字典“tempc”中的元素时,为防止删除字典中不存在的元素时会报错而写的异常处理机制。分析后可知,上一步得到的“tempc”变量是“Counter”类型的,这一类型的结构在删去本身不存在的元素时会自动跳过,因此我们的异常处理是多余的。删去try...except...语句后覆盖率达到100%.
3.每次在原有工程上扩充一个新功能后,我们都在做单元测试的同时,测试以往功能,避免新引入的模块对以前的功能造成破坏,从而完成回归测试。
4.完成题目要求的所有功能后,我们用python中自带的cProfile模块和可视化图形模块graphviz对工程做效能分析。
队友评价:
自我评价: