个人项目
第一次个人编程作业 — 论文查重项目
| github链接 | https://github.com/Eazinchen/3123004262/tree/master |
|---|---|
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience |
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/13477 |
| 这个作业的目标 | 设计一个论文查重程序,并进行性能分析与测试 |
PSP 表格(预估/实际耗时)
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 35 | 40 |
| Estimate | 估计这个任务需要多少时间 | 5 | 5 |
| Development | 开发 | 210 | 220 |
| Analysis | 需求分析 (包括学习新技术) | 25 | 40 |
| Design Spec | 生成设计文档 | 10 | 5 |
| Design Review | 设计复审 | 15 | 15 |
| Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
| Design | 具体设计 | 40 | 60 |
| Coding | 具体编码 | 80 | 90 |
| Code Review | 代码复审 | 20 | 15 |
| Test | 测试(自我测试,修改代码,提交修改) | 25 | 20 |
| Reporting | 报告 | 35 | 40 |
| Test Report | 测试报告 | 10 | 10 |
| Size Measurement | 计算工作量 | 5 | 5 |
| Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 10 | 5 |
| 合计 | 615 | 540 |
一、项目简介
本项目实现了一个中文论文查重算法,能够比较原文论文与抄袭版论文之间的相似度,并输出相似度到指定文件。
算法核心为 中文分词 + Tfidf 向量化 + 余弦相似度计算,在处理中文文本时通过停用词过滤提高相似度的准确性。
二、程序实现
1. 主要功能模块
-
tokenize(text)
- 功能:分词、去停用词
- 输入:文本字符串
- 输出:处理后的词列表
-
compute_similarity(text1, text2)
- 功能:将文本转为 Tfidf 向量并计算余弦相似度
- 输入:原文文本和抄袭文本
- 输出:相似度浮点数(0~1)
-
main.py
- 功能:从命令行读取文件路径,调用
compute_similarity,并将结果写入答案文件 - 使用方法:
python main.py [原文文件] [抄袭版文件] [答案文件]
- 功能:从命令行读取文件路径,调用
2. 改进措施
-
文本预处理
- 使用 jieba 分词
- 去停用词,减少无意义词影响
-
性能优化
- TfidfVectorizer 替代手写词频矩阵
- sklearn 内部优化余弦相似度计算
- 可用 cProfile + snakeviz 分析性能瓶颈
三、计算模块部分异常处理说明
-
文件路径异常
- 设计目标:确保程序在输入文件不存在或路径错误时,提示用户并安全退出
- 示例处理:
try: with open(file_path, 'r', encoding='utf-8') as f: content = f.read() except FileNotFoundError: print(f"错误:文件 {file_path} 不存在") exit(1)
-
空文本异常
- 设计目标:避免原文或抄袭文本为空导致计算相似度报错
- 示例处理:
if not text1.strip() or not text2.strip(): print("错误:原文或抄袭文本为空") exit(1)
-
编码异常
- 设计目标:处理文件读取时的编码问题,保证 UTF-8 文本正常解析
- 示例处理:
try: content = open(file_path, 'r', encoding='utf-8').read() except UnicodeDecodeError: print(f"错误:文件 {file_path} 编码错误,请使用 UTF-8 编码") exit(1)
-
异常输入参数
- 设计目标:确保命令行输入参数正确数量
- 示例处理:
import sys if len(sys.argv) != 4: print("用法: python main.py [原文文件] [抄袭文件] [答案文件]") exit(1)
四、性能分析
- 工具:Python 内置 cProfile + snakeviz 可视化
- 主要耗时函数:
- jieba.lcut() 占大部分时间
- TfidfVectorizer.fit_transform()
- 改进结果:
- 文本量较大时,性能比原始手写版本提升约 50% 以上
- 单次短文本相似度计算耗时约 0.002 秒
五、单元测试
- 使用 pytest 完成 10 个测试用例
- 测试覆盖面:
- 完全相同文本
- 轻微修改文本
- 完全不同文本
- 空文本情况
- 长文本与短文本
- 标点符号差异
- 测试命令:
pytest -v
浙公网安备 33010602011771号