第一次个人编程作业
一、github作业链接
二、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
· Planning | · 计划 | 30 | 40 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 30 |
· Development | · 开发 | 120 | 150 |
· Analysis | · 需求分析 (包括学习新技术) | 1000 | 1200 |
· Design Spec | · 生成设计文档 | 30 | 50 |
· Design Review | · 设计复审 | 30 | 40 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 60 | 60 |
· Design | · 具体设计 | 240 | 250 |
· Coding | · 具体编码 | 360 | 300 |
· Code Review | · 代码复审 | 60 | 50 |
· Test | · 测试(自我测试,修改代码,提交修改) | 120 | 180 |
· Reporting | · 报告 | 40 | 40 |
· Test Repor | · 测试报告 | 30 | 30 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 90 |
· 合计 | 2220 | 2520 |
三、计算模块接口的设计与实现过程
- 整体流程图
- 这里对涉及到的算法及概念做简要介绍
- 余弦相似度算法: 一个向量空间中两个向量夹角间的余弦值作为衡量两个个体之间差异的大小,余弦值接近1,夹角趋于0,表明两个向量越相似,余弦值接近于0,夹角趋于90度,表明两个向量越不相似。
对于n维向量,有如下公式:
- OneHot编码:在此处用于对分词进行编码,计算词频,获取词频向量。下图举了个栗子:
通过将最后生成的矩阵的每一行向量加起来形成的行向量,即所求的词频向量
- 代码组织
构建类数目:1;构建函数数目:3,依次完成jieba分词-关键词抽取、one_hot编码、余弦相似度计算,第三者会对前两者产生调用。几个函数实现的功能都是该算法的关键。至于独到之处,看了很多博客文本查重算法有多种,都是有利有弊,本次使用的算法理解起来比较容易,但复杂度相对高。
四、计算接口部分的性能改进
- 内存耗用
本次使用memory_profiler进行内存监控
从内存耗用上来看,关键词提取函数(extract_keyword())耗费内存占主导地位 - 时间耗费
本次使用line_profiler进行时间性能分析
从时间耗费上来看,完成对文本分词并提取关键词功能的函数耗费时间占主导地位
综上,分词并完成关键词提取的函数(extract_keyword())程序消耗最大,是程序的瓶颈,需要进行优化。过程中尝试修改优化,但是没啥明显的效果。
五、计算模块部分单元测试展示
- 测试代码
x = {}
y = open('orig.txt', 'r', encoding='UTF-8')
x['orig.txt'] = y.read()
y.close()
#此处代码与上面大同小异,故省略n行
class MyTestCase(unittest.TestCase):
@staticmethod
def test_main():
for i in x.keys():
if x[i] != '':
sim = CosineSimilarity(x['orig.txt'], x[i])
similarity = sim.main()
print('样本:%s,查重率为:%.2f' % (i, similarity))
else:
raise EmptyError
if __name__ == '__main__':
unittest.main()
样本测试:
空文本抛出异常:
- 测试覆盖率截图
ps:项目模块没分好,都塞一起了-_-,unit_test测试率:100%
- 测试数据思路
除题文给出的测试样本外,添加了与原文完全一样的测试文本以及空文本(用于检测异常)
六、计算模块部分异常处理说明
- 空文本异常
若测试样本为空文本,则计算余弦相似度时会产生除零操作,故设计此异常将空文本指出
七、博主有话说
- 连续好几天睡很少真的好累啊-我想睡觉(哭)
- 确确实实学到了新东西,但好像还只是停留在依葫芦画瓢的阶段,没有掌握好。要继续加油呐!
- 从没想过软工是这样的软工,第一次读题真的--都是啥跟啥
- 此处笔❤