个人项目
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023 |
|---|---|
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/homework/13324 |
| 这个作业的目标 | 学习使用git进行版本管理,学习使用性能分析图改进代码,学习测试方法 |
Github地址 https://github.com/ggjsjykh/3123004464
PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时 (分钟) | 实际耗时 (分钟) |
|---|---|---|---|
| · Planning | · 计划 | 30 | 25 |
| · Estimate | · 估计这个任务需要多少时间 | 380 | 600 |
| · Development | · 开发 | 240 | 300 |
| · Analysis | · 需求分析 (包括学习新技术) | 120 | 80 |
| · Design Spec | · 生成设计文档 | 20 | 10 |
| · Design Review | · 设计复审 | 30 | 30 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
| · Design | · 具体设计 | 20 | 25 |
| · Coding | · 具体编码 | 180 | 200 |
| · Code Review | · 代码复审 | 10 | 10 |
| · Test | · 测试 (自我测试,修改代码,提交修改) | 120 | 40 |
| · Reporting | · 报告 | 30 | 40 |
| · Test Report | · 测试报告 | 30 | 30 |
| · Size Measurement | · 计算工作量 | 10 | 15 |
| · Postmortem & Process Improvement Plan | · 事后总结,并提出过程改进计划 | 30 | 30 |
| · In total | · 合计 | 1180 | 1470 |
计算模块接口的设计和实现
对于论文查重,我首先想到了LCS算法,但是它存在时间复杂度高,占用内存空间大的缺点,于是通过学习新技术,学习到较为简单但精度低,对文本顺序敏感度不高的jaccard相似度,所以想到了先计算文本的minhash签名的jaccard相似度,将重复度低的文本先筛掉,再将剩下的文本采用LCS算法计算相似度。
calculate_similarity函数流程图

先用jaccard相似度对文本进行快速的相似度筛选,再运用LCS算法对相似度大于设置的阈值的文本进行更加精准的计算。
性能分析图


由于单纯采用LCS时,程序运行时间过长,所以根据上述思路采用minhash结合的方式优化了计算方法,由性能图可见,消耗最大的函数是LCS计算函数longest_common_subsequence。
单元测试
剩余的测试代码保存在GitHub仓库中testmain.py里面

测试数据采用标点符号+文本,计算jaccard_similarity 函数中jaccard相似度计算是否正确

通过设计jaccard相似度阈值以上以下的不同测试用例,验证calculate_similarity 函数中的jaccard阈值是否有效,以及lcs函数是否正常运算
测试覆盖率运行结果

覆盖率高,测试有效。
异常捕获及处理
1. 文件不存在异常

当尝试读取一个不存在的文件时,程序应捕获 FileNotFoundError 异常,提示用户文件不存在,然后退出程序
2. 文件编码错误异常

当尝试读取一个编码不是 UTF-8 的文件时,程序应捕获 UnicodeDecodeError 异常,并提示用户文件编码错误,然后退出程序。
3. 空文件异常
当读取的文件内容为空时,程序应能正确处理空字符串,避免后续计算中出现错误。
4.写入结果异常
当尝试写入结果到文件时,如果遇到错误(例如文件不可写),程序应捕获异常并提示用户,然后退出程序。

浙公网安备 33010602011771号