个人第一次编程作业
这个作业属于哪个课程 | 班级链接 |
---|---|
这个作业要求在哪里 | 作业链接 |
这个作业的目标1 | 论文查重算法设计 |
这个作业的目标2 | 学习PSP表格 |
这个作业的目标3 | 单元测试 |
这个作业的目标4 | Profile性能分析 |
这个作业的目标5 | Git管理 |
代码链接(Python)
- 写在前面的话:本次作业使用Python完成。
- Github链接
- 可运行的exe文件已发布至仓库的release包内
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 45 |
· Estimate | · 估计这个任务需要多少时间 | ||
Development | 开发 | 180 | 345 |
· Analysis | · 需求分析 (包括学习新技术) | 20 | |
· Design Spec | · 生成设计文档 | 15 | |
· Design Review | · 设计复审 | ||
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 5 | 10 |
· Design | · 具体设计 | 50 | |
· Coding | · 具体编码 | 60 | 150 |
· Code Review | · 代码复审 | ||
· Test | · 测试(自我测试,修改代码,提交修改) | ||
Reporting | 报告 | 75 | 85 |
· Test Repor | · 测试报告 | ||
· Size Measurement | · 计算工作量 | ||
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | ||
· 合计 | 570 | 945 |
计算模块接口的设计与实现过程
整体流程
- 建立了一个Text类和两个函数(get_word_vector和cos_dist)
- 创建Text实例,调用Text类中的get_word_list函数分割字符串(这里程序可以选择两种分割字符串的方法,一种是调用re包逐字分割,另一种是使用jieba包逐词分割),并返回列表
- 使用get_word_vector函数将字符列表转换为向量
- 使用余弦相似度函数(cos_dist)计算两个字符列表的余弦相似度
工程截图
一共有三个文件,main.py文件,test.py文件和text.py文件
1、整体流程
2、函数方法
- main函数:主函数
- get_word_list函数:将字符串转换为字符列表
- get_word_vector 函数:将字符列表转换为向量
- cos_dist函数:计算余弦相似度(核心算法)
3、核心算法
余弦相似度:
性能分析
这里使用专业版pycharm内置的profile进行性能分析
容易看出,获取字符列表向量的操作占了程序大部分的时间(输入输出的时间除外)
原因是get_word_vector中获取向量需要使用双重for循环:
def get_word_vector(word_list1, word_list2):
key_word = list(set(word_list1 + word_list2))
# 给定形状和类型的用0填充的矩阵存储向量
word_vector1 = np.zeros(len(key_word))
word_vector2 = np.zeros(len(key_word))
# 计算词频
# 依次确定向量的每个位置的值
for i in range(len(key_word)):
# 遍历key_word中每个词在句子中的出现次数
for j in range(len(word_list1)):
if key_word[i] == word_list1[j]:
word_vector1[i] += 1
for k in range(len(word_list2)):
if key_word[i] == word_list2[k]:
word_vector2[i] += 1
return word_vector1, word_vector2
异常处理与单元测试
1.异常处理说明
对每种异常的情况进行提示并且返回特定的值,方便测试模块中的assertEqual方法进行验证
路径错误
文件为空
2. test模块测试
- 测试正常读取
- 测试错误读取
调用unittest包编写了10个测试用例,主要对出现不存在路径和空文件的情况进行测试。