作业概述
| 这个作业属于哪个课程 | 软件工程 |
|---|---|
| 这个作业要求在哪里 | 个人项目 |
| 这个作业的目标 | 了解项目设计以及工作流程 |
一.Github作业链接
二.PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 30 | 20 |
| · Estimate | · 估计这个任务需要多少时间 | 30 | 20 |
| Development | 开发 | 180 | 205 |
| · Analysis | · 需求分析 (包括学习新技术) | 30 | 40 |
| · Design Spec | · 生成设计文档 | 30 | 20 |
| · Design Review | · 设计复审 | 10 | 10 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 20 |
| · Design | · 具体设计 | 20 | 15 |
| · Coding | · 具体编码 | 30 | 40 |
| · Code Review | · 代码复审 | 10 | 20 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 40 | 40 |
| Reporting | 报告 | 60 | 55 |
| · Test Repor | · 测试报告 | 20 | 20 |
| · Size Measurement | · 计算工作量 | 20 | 15 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 20 |
| · 合计 | 270 | 280 |
三.分析
需求
题目:论文查重
描述如下:
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:
从命令行参数给出:论文原文的文件的绝对路径。
从命令行参数给出:抄袭版论文的文件的绝对路径。
从命令行参数给出:输出的答案文件的绝对路径。
注意:答案文件中输出的答案为浮点型,精确到小数点后两位
思路
- 从命令行获取文件的绝对路径
- 读取指定路径的文件,以只读方式打开
- 将文本转化成向量
- 计算余弦相似度
- 输出相似度
- 将相似度输出到文件
- 异常处理
四.实现
读取文件模块
def readfile(path):
try:
with open(path, 'r', encoding='gb18030', errors='ignore') as file:
text = file.read()
except:
print("文件读取错误,请检查文件路径是否正确")
return False
return text
将文本转化成向量
def calculate_similarity(text1, text2):
#将文本转换为向量表示
vector1 = text_to_vector(text1)
vector2 = text_to_vector(text2)
return cosine_similarity(vector1, vector2)
计算余弦相似度模块
def cosine_similarity(vec1, vec2):
dot_product = sum(vec1[key] * vec2.get(key, 0) for key in vec1)
magnitude1 = sqrt(sum(val ** 2 for val in vec1.values()))
magnitude2 = sqrt(sum(val ** 2 for val in vec2.values()))
return dot_product / (magnitude1 * magnitude2)
写入文件模块
def writefile(path,text):
try:
with open(path, 'w', encoding='gb18030', errors='ignore') as file:
file.write(text)
except:
print("文件写入错误,请检查文件路径是否正确")
return False
return True
五.性能测试
Profile分析
测试结果如下图:

调用图:

可知计算模块花销最大
对此进行改进优化,优化find_duplicates循环
再测试
如图:

调用图:

略微提高了速度
六.单元测试
使用了python的unittest单元测试框架

对每一个模块进行测试,并且添加了异常处理
当路径错误时

正常时

覆盖率为72%

未覆盖的代码为异常处理以及命令行获取参数

七.异常处理
- 运用try语句实现
主要用于检查文件路径
def readfile(path):
try:
with open(path, 'r', encoding='gb18030', errors='ignore') as file:
text = file.read()
except:
print("文件读取错误,请检查文件路径是否正确")
return False
return text
八.注意事项
main.py文件必须通过命令行输入参数或通过test.py调用,否则将会报错。