1.个人项目
这个作业属于哪个课程 | 个人项目 - 作业 - 计科23级12班 - 班级博客 - 博客园 |
---|---|
这个作业要求在哪里 | 个人项目 - 作业 - 计科23级12班 - 班级博客 - 博客园 |
这个作业的目标 | 第一个项目:学习设计一个论文查重算法 |
GitHub代码仓库 :jhltwo/3123004662
2.PSP2表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 10 |
Estimate | 估计这个任务需要多少时间 | 60 | 70 |
Development | 开发 | 200 | 250 |
Analysis | 需求分析 (包括学习新技术) | 30 | 40 |
Design Spec | 生成技术文档 | 30 | 30 |
Design Review | 设计复审 | 20 | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
Design | 具体设计 | 30 | 40 |
Coding | 具体编码 | 150 | 200 |
Code Review | 代码复审 | 30 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 20 | 30 |
Reporting | 报告 | 60 | 70 |
Test Repor | 测试报告 | 20 | 30 |
Size Measurement | 计算工作量 | 60 | 75 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 40 | 30 |
3.函数及其关系
plagiarism_checker.py (主程序)
├── 导入模块层
│ ├── sys (系统参数处理)
│ ├── re (正则表达式文本处理)
│ └── difflib.SequenceMatcher (序列相似度计算)
├── 文本预处理层
│ └── preprocess_text()
├── 相似度计算层
│ ├── calculate_jaccard_similarity()
│ ├── calculate_sequence_similarity()
│ └── calculate_character_similarity()
├── 核心算法层
│ └── calculate_plagiarism_rate()
├── 文件I/O层
│ ├── read_file()
│ └── write_result()
└── 应用控制层
└── main()
- 函数模块设计
2.1 核心函数清单(共7个函数)
函数名 | 功能 | 输入 | 输出 | 层级 |
---|---|---|---|---|
preprocess_text() |
文本预处理 | 原始文本 | 清理后文本 | 预处理层 |
calculate_jaccard_similarity() |
Jaccard相似度 | 两个文本 | 相似度值[0,1] | 计算层 |
calculate_sequence_similarity() |
序列相似度 | 两个文本 | 相似度值[0,1] | 计算层 |
calculate_character_similarity() |
字符相似度 | 两个文本 | 相似度值[0,1] | 计算层 |
calculate_plagiarism_rate() |
综合查重算法 | 原文+抄袭版 | 最终重复率 | 核心层 |
read_file() |
文件读取 | 文件路径 | 文件内容 | I/O层 |
main() |
主控制流程 | 命令行参数 | 程序执行 | 控制层 |
2.2 函数间关系图
main()
├── read_file() ×2 (读取原文和抄袭版)
└── calculate_plagiarism_rate()
├── preprocess_text() ×2
├── calculate_jaccard_similarity()
├── calculate_sequence_similarity()
└── calculate_character_similarity()
4.性能分析
通过详细的性能分析,我识别出了系统中的主要性能瓶颈:
preprocess_text
- 最耗时函数
- CPU时间占比 :42.8%
- 主要开销 :正则表达式处理(66.4%)、字符串转换(18.4%)
- 优化效果 :通过预编译正则表达式,性能提升39.14% 2.
calculate_sequence_similarity
- 第二耗时函数 - CPU时间占比 :28.9%
- 主要开销 :LCS动态规划计算(80.4%)、内存分配(15.5%)
- 内存消耗 :峰值45.7MB,平均每次调用73.4KB 3.
calculate_jaccard_similarity
- 第三耗时函数 - CPU时间占比 :17.4%
- 主要开销 :集合创建(54.8%)、集合运算(45.2%)
最终性能优化成果 整体性能提升
- 执行时间优化 : +76.10% (从0.4836ms降至0.1156ms)
- 内存使用 :保持稳定
- 结果准确性 :差异在可接受范围内(0.26) 各函数优化效果
函数名称 时间优化 状态 文本预处理 +39.14% 优化成功 字符相似度 +54.12% 优化成功 Jaccard相似度 -80.32% 需要改进 序列相似度 -45.56% 需要改进
测试函数说明
class TestTextPreprocessing(unittest.TestCase):
"""文本预处理功能测试"""
class TestJaccardSimilarity(unittest.TestCase):
"""Jaccard相似度计算测试"""
class TestSequenceSimilarity(unittest.TestCase):
"""序列相似度计算测试"""
class TestCharacterSimilarity(unittest.TestCase):
"""字符相似度计算测试"""
class TestPlagiarismRate(unittest.TestCase):
"""综合抄袭率计算测试"""
class TestFileReading(unittest.TestCase):
"""文件读取功能测试"""
class TestEdgeCases(unittest.TestCase):
"""边界情况和异常测试"""