个人项目

这个作业属于哪个课程 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.写入结果异常

当尝试写入结果到文件时,如果遇到错误(例如文件不可写),程序应捕获异常并提示用户,然后退出程序。

posted @ 2025-03-08 21:56  ykh1  阅读(36)  评论(0)    收藏  举报