| 工程概论 | ?班级的链接 |
|---|---|
| 作业要求 | ?作业要求的链接 |
| 作业目标 | 设计一个论文查重项目,并学习使用PSP表格和commit规范 |
? 作业 github链接 -> 202121331004
? 一、PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 10 | 10 |
| · Estimate | 估计这个任务需要多少时间 | 10 | 10 |
| Development | 开发 | 240 | 190 |
| · Analysis | · 需求分析 (包括学习新技术) | 40 | 40 |
| · Design Spec | · 生成设计文档 | 30 | 30 |
| · Design Review | · 设计复审 | 20 | 20 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 10 |
| · Design | · 具体设计 | 40 | 30 |
| · Coding | · 具体编码 | 60 | 40 |
| · Code Review | · 代码复审 | 10 | 10 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 20 | 10 |
| Reporting | 报告 | 20 | 15 |
| · Test Repor | · 测试报告 | 10 | 5 |
| · Size Measurement | · 计算工作量 | 5 | 5 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 5 | 5 |
| · 合计 | 270 | 215 |
? 二、计算模块接口的设计与实现过程
代码组织
- 接口:
- jieba中文分词组件(详情)
- re 过滤标点符号
- gensim 构造词汇-频率hash表
- 分为三个模块:
- 处理文件模块
- 计算余弦相似度模块
- 测试模块
关键代码说明
- 将文章的句子进行分词组成一个词汇-次数hash表;
- 记录每个词汇出现的次数,将这些次数列出来得到一个向量;
- 将两篇文章得到的向量进行余弦定理相似度计算即可得到两篇文章的相似度。
关键代码流程图

? 三、计算模块接口部分的性能改进
性能分析
- 性能统计部分

- 调用关系图

? 四、计算模块部分单元测试展示
部分单元测试代码
print("请输入原论文的文件路径:")
path1 = input()
print("请输入抄袭论文的文件路径")
path2 = input()
res_path = "F:\\py_code\\Luokon\\202121331004\\test\\res.txt"
# 处理文章,返回过滤符号并分词的列表
txt1 = deal_file(path1)
txt2 = deal_file(path2)
# 计算余弦相似度并写入结果文件
ans = cosine_similarity(txt1, txt2)
print("两篇文章的相似度:%.2f" %ans)
file = open(res_path, 'w', encoding='utf-8')
file.write("两篇文章的相似度:%.2f" %ans)
file.close()
测试思路
- 写入两篇相似的文章的文件路径计算得出其相似度输出:
可以看到两篇文章相似度较大

- 将同一篇文章进行比较,看到相似度为 1

测试覆盖率图

? 五、计算模块部分异常处理说明
-
打开文件异常:当读取文件失败时抛出异常
# 读取文件 try: with open(path, encoding='utf-8') as f: line = f.readline() while line != '': s = s + line line = f.readline() f.close() except Exception: print("读入文件异常")- 测试:

- 测试:
-
写入文件异常:当写入结果出现错误时抛出异常
try: file = open(res_path, 'w', encoding='utf-8') file.write("两篇文章的相似度:%.2f" % ans) file.close() except Exception: print("写入文件异常")- 测试

- 测试