个人项目(软件工程第二次作业)
这个作业属于哪个课程 | 软件工程2024 |
---|---|
这个作业的要求在哪里 | 作业要求的链接 |
这个作业的目标 | 了解个人项目开发流程,学习在GitHub上传代码文件, |
GitHub链接
需求
题目:论文查重
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
- 原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
- 抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求
- 从命令行参数给出:论文原文的文件的绝对路径。
- 从命令行参数给出:抄袭版论文的文件的绝对路径。
- 从命令行参数给出:输出的答案文件的绝对路径。
计算模块接口的设计与实现过程
用python的库来简化开发流程,如jieba,sklearn,re等
jieba
利用jieba对中文进行分词用于计算文本相似度用处很大,支持四种分词模式
sklearn
余弦相似度在计算文本相似度等问题中有着广泛的应用,scikit-learn中提供了方便的调用方法
re
去除文本中的标点符号、空格和换行符,是文本在计算余弦相似度时更精准
调用逻辑
程序的主要逻辑为 读取文件路径->读取文件文本并去除标点符号->将文本转化为向量->计算余弦相似度->返回值以两位小数百分比的格式写入输出文件
计算模块接口的性能
通过VizTracer来测试性能
程序总运行用时为 1 s 138 ms 270 us 600 ns
其中tokenize模块两次调用用时分别为 414 ms 670 us 400 ns 和 60 ms 218 us 40 ns
性能较低
改进方法
- jieba调用jieba.cut()方法的性能较低,可以寻找更高效的分词方法,或者添加停用词减少程序工作量
计算模块测试
测试思路
逐个模块测试功能是否正常运行,最后创建临时文件测试输出结果是否符合预期
分词函数展示
def tokenize(text):
return list(jieba.cut(deletepunct(text)))
分词模块测试代码
def test_tokenize(self):#测试简单文本的分词
txt="广东工业大学软件工程"
expected_result=['广东','工业','大学','软件工程']
result=tokenize(txt)
self.assertEqual(result,expected_result)
coverage工具检验
测试覆盖率基本为100%,未测试部分以做好异常处理
异常处理
当输入路径有误是,会自动退出并打印使用指导
if len(sys.argv) != 4:
print("输入格式为: python main.py <原文路径> <对比文路径> <输出路径>")
sys.exit(1)
PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 80 |
Estimate | 估计这个任务需要多少时间 | 60 | 60 |
Development | 开发 | 120 | 180 |
Analysis | 需求分析 (包括学习新技术) | 60 | 90 |
Design Spec | 生成设计文档 | 30 | 20 |
Design Review | 设计复审 | 20 | 30 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 40 |
Design | 具体设计 | 60 | 90 |
Coding | 具体编码 | 100 | 180 |
Code Review | 代码复审 | 30 | 40 |
Test | 测试(自我测试,修改代码,提交修改) | 30 | 60 |
Reporting | 报告 | 30 | 50 |
Test Report | 测试报告 | 30 | 20 |
Size Measurement | 计算工作量 | 20 | 20 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 30 |
总计 | 710 | 990 |