软件工程第二次作业
一,github链接:https://github.com/mmt-hub/3123004483
二,PSP表格
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience |
|---|---|
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13477 |
| 这个作业的目标 | <设计一个论文查重系统,并进行性能分析与测试> |
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 30 | 50 |
| · Estimate | · 估计这个任务需要多少时间 | 30 | 50 |
| Development | 开发 | 360 | 380 |
| · Analysis | · 需求分析(包括学习新技术) | 120 | 90 |
| · Design Spec | · 生成设计文档 | 30 | 40 |
| · Design Review | · 设计复审 | 30 | 40 |
| · Coding Standard | · 代码规范(为目前的开发制定合适的规范) | 20 | 20 |
| · Design | · 具体设计 | 40 | 50 |
| · Coding | · 具体编码 | 60 | 70 |
| · Code Review | · 代码复审 | 20 | 30 |
| · Test | · 测试(自我测试,修改测试,提交修改) | 40 | 40 |
| Reporting | 报告 | 80 | 90 |
| · Test Report | · 测试报告 | 30 | 40 |
| · Size Measurement | · 计算工作量 | 20 | 20 |
| · Postmortem & Process improvement Plan | · 事后总结,并提出修改过程改进计划 | 30 | 30 |
| 合计 | 470 | 520 |
三,计算模块接口的设计与实现过程
3.1 主要函数
read_file(file_path):读取文本文件并进行基础清洗
tokenize(text):将中文文本转换为分词序列
get_tfidf_vectors(text1, text2):将两个文本转换为TF-IDF特征向量
cosine_similarity(vec1, vec2):计算两个向量的余弦相似度
main():程序执行的总体控制和调度
3.2 函数关系图

3.3 主要算法设计
3.3.1 TF-IDF向量转换:
文本数值化:将文字转换为计算机可处理的数字向量。
关键词提取:通过词频(TF)和逆文档频率(IDF)识别重要词汇。
内容权重分配:给重要词汇更高权重,常见词汇更低权重。
3.3.2 余弦相似度:
方向比较:衡量两个向量在方向上的相似性,忽略长度影响。
文本匹配:计算两篇文档在内容主题上的相似程度。
归一化输出:提供0-1范围内的标准化相似度得分。
四,计算模块接口部分的性能改进
4.1 初始代码的性能分析图

4.2 修改内容
4.2.1 简化 IDF 计算:
原公式 idf = np.log(2.0 / (df + 1)) 每次都要调用一次 C 库对数函数,在万级词汇量下累计耗时可观。改成纯代数式 idf = 3.0 / (df + 1)——既消除 log,又把“2”换成“3”让结果范围与原来近似,无需再归一化。
4.2.2 预分配数组:
原代码用 vector1.append(tf * idf) 动态增长列表,Python 层每追加一次都要检查容量、可能重新分配并拷贝数据。修改后,一次性申请好连续内存,后续按索引写入,复杂度从均摊 O(n) 变成严格 O(n)。
4.3 修改后的性能分析图

五,计算模块部分单元测试展示
5.1 测试函数:test_tokenize_punct_only
测试目标:验证纯标点文本的分词结果,确保常见中文标点被单独切出。
构造测试数据思路:仅使用常见的中文标点的场景。
测试代码:

5.2测试函数:test_read_file_ok
测试目标:验证 read_file 在读取到带引号类标点时会自动去除这些符号。
构造测试数据思路:mock 的数据本身不带任何引号,确保 read_file 内部的“去引号”逻辑正确。

5.3 覆盖率测试结果

六,计算模块部分异常处理说明
当无法读取到正常文件时,系统会主动报错并提示用户重新检查输入内容。

浙公网安备 33010602011771号