软工第二次作业

第二次作业

github地址:https://github.com/Z13516631589/ztw/tree/main/3123004417

一、预估时长

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 - -
· Estimate ・估计这个任务需要多少时间 30 -
Development 开发 - -
· Analysis ・需求分析(包括学习新技术) 60 -
· Design Spec ・生成设计文档 45 -
· Design Review ・设计复审 30 -
· Coding Standard ・代码规范(为目前的开发制定合适的规范) 20 -
· Design ・具体设计 50 -
· Coding ・具体编码 120 -
· Code Review ・代码复审 40 -
· Test ・测试(自我测试,修改代码,提交修改) 90 -
Reporting 报告 - -
· Test Repor ・测试报告 60 -
· Size Measurement ・计算工作量 20 -
· Postmortem & Process Improvement Plan ・事后总结,并提出过程改进计划 40 -
・合计 605 -

二、计算模块接口的设计与实现过程

一、代码组织结构

本论文查重工具采用模块化函数设计(非类结构),核心围绕文本处理与相似度计算流程拆解为多个单一职责函数,各模块通过数据传递协作。具体结构如下:

1. 文件操作模块

  • read_file(file_path):读取文件内容,支持多编码自动识别
  • write_result(file_path, similarity):将相似度结果写入目标文件

2. 文本预处理模块

  • segment_text(text):对文本进行分词、清洗(过滤标点/空白)

3. 特征提取模块

  • calculate_tf(words):计算词频(Term Frequency)
  • calculate_idf(corpus):计算逆文档频率(Inverse Document Frequency)
  • get_tfidf_vector(words, tf, idf):生成 TF-IDF 向量

4. 相似度计算模块

  • cosine_similarity(vec1, vec2):计算两向量余弦相似度
  • calculate_similarity(original_text, copied_text):串联流程计算文本相似度

5. 主控制模块

  • main():解析命令行参数,调度各模块执行

函数关系
main() → 调用 read_file() 获取文本 → 调用 calculate_similarity() 核心计算 → 调用 write_result() 输出结果。
calculate_similarity() 内部依次调用 segment_text()calculate_tf()calculate_idf()get_tfidf_vector()cosine_similarity(),形成完整计算链。

二、关键函数流程图(以main.py为例)

Snipaste_2025-09-22_20-14-23

三、算法关键说明

1. 核心原理:基于TF-IDF + 余弦相似度的文本匹配算法

  • TF-IDF:将文本转化为量化向量,既考虑词在单篇文档中的出现频率(TF),又通过逆文档频率(IDF)降低通用词(如“的”“是”)的权重,突出关键词。
  • 余弦相似度:通过计算两向量夹角的余弦值衡量文本相似性,值越接近1表示越相似。

2. 关键步骤:

  • 分词阶段使用jieba库实现中文精准分词,同时过滤无意义符号。
  • IDF计算采用平滑公式 log((总文档数+1)/(词出现的文档数+1)) + 1,避免零值导致的权重失效。
  • 向量相似度计算时通过集合操作合并两文本的所有词,确保稀疏向量的完整对比。

3. 独到之处

  • 多编码兼容:文件读取时自动尝试utf-8/gbk/gb2312/ansi等编码,解决中文文本常见的编码错误问题。
  • 鲁棒性处理:针对空文本、极端短文本等边缘情况设计特殊逻辑(如两空文本相似度为1),避免计算异常。
  • 轻量高效:无需训练模型,通过纯数学计算实现相似度评估,兼顾准确率与性能,适合中小规模文本快速比对。
  • 可扩展性:各函数模块化设计,可独立替换(如替换segment_text为更优分词算法,或用BM25替代TF-IDF)。

三、模块部分单元测试展示

模块测试代码为test_main.py,测试覆盖率如图

Snipaste_2025-09-22_20-58-29

这套代码的测试覆盖率可达到90%以上

四、计算模块部分异常处理说明

文件读取编码异常

  • 设计目标:当文件编码不是常见的utf-8、gbk、gb2312、ansi时,能提示错误并退出程序,避免因编码问题导致程序异常终止且无提示。
  • 单元测试样例:构造一个使用特殊编码(如iso-8859-1)的文件,调用read_file函数,预期程序输出错误提示并退出。

文件写入异常

  • 设计目标:当写入结果文件时出现权限不足、磁盘空间不足等问题时,能捕获异常并提示用户,保证程序的健壮性。
  • 单元测试样例:设置一个无写入权限的文件路径,调用write_result函数,预期程序输出写入错误提示。

五、使用方法

① 安装依赖:

bash

pip install -r requirements.txt

② 运行程序(比较orig.txt和copy.txt,结果保存到result.txt):

bash

python main.py orig.txt copy.txt result.txt

741d951a-721d-4ba4-9cca-293e83b0933e

5b3b6a75-9fa0-4e3d-88e6-43e8e5e5ab58

③ 运行单元测试:

bash

python -m unittest test_main.py -v

PSP 实际耗时记录

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 - -
· Estimate ・估计这个任务需要多少时间 30 25
Development 开发 - -
· Analysis ・需求分析(包括学习新技术) 60 70
· Design Spec ・生成设计文档 45 50
· Design Review ・设计复审 30 25
· Coding Standard ・代码规范(为目前的开发制定合适的规范) 20 15
· Design ・具体设计 50 45
· Coding ・具体编码 120 130
· Code Review ・代码复审 40 35
· Test ・测试(自我测试,修改代码,提交修改) 90 100
Reporting 报告 - -
· Test Repor ・测试报告 60 75
· Size Measurement ・计算工作量 20 15
· Postmortem & Process Improvement Plan ・事后总结,并提出过程改进计划 40 40
・合计 605 625
posted @ 2025-09-22 23:01  ztw578  阅读(13)  评论(0)    收藏  举报