这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/homework/13136 |
这个作业的目标 | 完成论文查重的个人项目,包括使用PSP评估,设计模块,编写代码并进行单元测试,最后提交到github上 |
作业github链接:https://github.com/LinSYYY/3222004596
一、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(mins) | 实际耗时(mins) |
---|---|---|---|
Planning | 计划 | 30 | 20 |
Estimate | 估计这个任务需要多少时间 | 10 | 10 |
Development | 开发 | 360 | 400 |
Analysis | 需求分析(包括学习新技术) | 60 | 120 |
Design Spec | 生成设计文档 | 30 | 30 |
Design Review | 设计复审 | 30 | 20 |
Coding | 代码规范(为目前的开发制定合适的规范) | 20 | 25 |
Design | 具体设计 | 60 | 50 |
Coding | 具体编码 | 300 | 360 |
Code Review | 代码复审 | 40 | 30 |
Test | 测试 | 180 | 280 |
Reporting | 报告 | 120 | 120 |
Test Repor | 测试报告 | 60 | 60 |
Size Measurement | 计算工作量 | 30 | 25 |
Postmortem & Process Lmprovement plan | 事后总结,并提出过程改进计划 | 30 | 30 |
合计 | 1360 | 3067 |
二、计算模块接口的设计与实现过程:
1. 模糊匹配函数:
- 函数名:
fuzzy_match(pattern, sentences)
- 参数:
pattern
:待匹配的模式字符串。sentences
:原文本组成的列表。
- 返回值:
- 匹配结果的列表,每个元素是一个元组,包含匹配的句子和相似度。
- 相似度的数值。
2. 主程序:
- 读取原文和待检测文章的路径。
- 读取文件内容并进行预处理,将文本内容转换为字符串。
- 调用模糊匹配函数,对待检测文章进行匹配,并获取相似度。
- 输出匹配结果和相似度。
3. 文件写入函数:
- 函数名:
write_similarity_to_file(similarity)
- 参数:
similarity
:相似度的数值。
- 功能: 将相似度写入文件。
关键步骤描述:
- 确定算法的输入和输出。
- 描述算法的主要步骤和流程,包括循环、条件判断等。
- 指出算法中的关键数据结构和操作。
三、计算模块接口部分的性能改进:
改进思路:
1.减少重复计算相似度:在代码中多次调用fuzzy_match(pattern, sentences),可以将其计算结果保存下来,避免重复计算。
2.文件读取优化:可以采用更高效的文件读取方式,例如使用with open()语句来自动关闭文件,或者一次性读取整个文件内容。
3.批量处理:考虑对待检测文章进行分段处理,而不是一次性处理整篇文章。这样可以减少内存消耗并提高算法效率。
4.代码优化:对于模糊匹配阈值的设定,可以根据实际情况进行调整,以提高匹配的准确性或效率。
计算模块部分单元测试展示:
import unittest
class TestFuzzyMatch(unittest.TestCase):
def setUp(self):
# 构造测试数据
self.original_text = "This is a sample original text."
self.test_text = "This is a sample test text."
self.pattern = "sample"
self.similarity_threshold = 0.6
def test_fuzzy_match(self):
# 测试模糊匹配函数的正确性
matches, similarity = fuzzy_match(self.pattern, [self.original_text])
# 检查返回结果是否符合预期
self.assertEqual(len(matches), 1) # 应该只有一个匹配
self.assertEqual(matches[0][0], "sample original text.") # 匹配的句子应该是原始句子中的一部分
self.assertGreaterEqual(matches[0][1], self.similarity_threshold) # 相似度应该大于等于设定的阈值
def test_performance(self):
# 测试性能是否有所改进
import time
start_time = time.time()
# 执行模糊匹配
fuzzy_match(self.pattern, [self.original_text] * 1000) # 重复1000次以模拟大量数据
end_time = time.time()
# 检查执行时间是否减少,表示性能有所改进
self.assertLess(end_time - start_time, 10) # 假设执行时间不超过10秒
if __name__ == '__main__':
unittest.main()
在上面的单元测试中,构造了两个测试用例:
test_fuzzy_match
:测试模糊匹配函数的正确性,包括返回结果是否符合预期。
test_performance
:测试性能是否有所改进,即模糊匹配函数是否在处理大量数据时执行时间减少。