软件工程第二次作业
一,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 覆盖率测试结果
六,计算模块部分异常处理说明
当无法读取到正常文件时,系统会主动报错并提示用户重新检查输入内容。