个人项目
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/CSGrade22-34 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13229 |
这个作业的目标 | 了解PSP,编写代码和测试完成论文查重的个人项目 |
这次作业的github链接:https://github.com/SSTTwin/3222004598
一、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(mins) | 实际耗时(mins) |
---|---|---|---|
Planning | 计划 | 30 | 20 |
Estimate | 估计这个任务需要多少时间 | 10 | 10 |
Development | 开发 | 360 | 380 |
Analysis | 需求分析(包括学习新技术) | 60 | 100 |
Design Spec | 生成设计文档 | 20 | 30 |
Design Review | 设计复审 | 50 | 30 |
Coding | 代码规范(为目前的开发制定合适的规范) | 30 | 20 |
Design | 具体设计 | 60 | 50 |
Coding | 具体编码 | 300 | 320 |
Code Review | 代码复审 | 40 | 30 |
Test | 测试 | 100 | 250 |
Reporting | 报告 | 100 | 100 |
Test Repor | 测试报告 | 30 | 60 |
Size Measurement | 计算工作量 | 30 | 25 |
Postmortem & Process Lmprovement plan | 事后总结,并提出过程改进计划 | 20 | 30 |
合计 | 1240 | 1455 |
二、计算模块接口的设计与实现过程:
1. 定义模糊匹配函数:
- fuzzy_match函数接受一个pattern和一个sentences列表作为输入。
- 使用difflib.SequenceMatcher计算pattern和每个sentence之间的相似度。
- 如果相似度大于0.6,将句子和相似度添加到matches列表中。
- 函数返回匹配的结果和最后一个计算的相似度。
2. 主程序:
- 读取原文和待检测文章的路径。
- 读取文件内容并进行预处理,将文本内容转换为字符串。
- 调用模糊匹配函数,对待检测文章进行匹配,并获取相似度。
- 输出匹配结果和相似度。
3. 读取文件:
- 从用户那里获取两个文件的路径。
- 打开文件并逐行读取,去掉每行的前后空白字符。
- 将每一行添加到temp和temp_1列表中,直到文件结束。
- 读取完成后,将所有行合并为一个字符串result和result_1。
4.模糊匹配和结果输出:
- 将result_1设为要匹配的模式。
- 调用 fuzzy_match 函数来计算待检测文章 pattern 与 sentences 中每个句子的相似度。matches 存储相似的结果及其相似度,Sim_num 存储相似度的阈值。
- 打印匹配结果和相似度。
- 将最后一个计算的相似度写入到Result.txt文件中。
三、结果输出:
四、计算模块接口部分的性能改进:
改进思路:
- 改进 fuzzy_match 函数的返回值:
fuzzy_match 函数现在返回的相似度是最后一个匹配的相似度,但它应该返回所有匹配的相似度列表。 - 优化文件处理:
使用 with 语句来自动管理文件的打开和关闭,避免手动关闭文件带来的潜在问题。 - 避免重复调用 fuzzy_match:
不需要多次调用 fuzzy_match,一次调用就可以获得匹配结果和相似度列表。 - 处理文件读取:
文件内容的读取逻辑可以优化为一次性读取全部内容,并在内存中处理,避免逐行读取的复杂性。 - 改进文件写入:
文件写入应处理结果格式,以便于后续使用。
计算模块部分单元测试展示:
import unittest
import time
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, "Expected exactly one match.")
self.assertIn(self.original_text, matches[0][0], "Match should contain the original text.")
self.assertGreaterEqual(matches[0][1], self.similarity_threshold, "Similarity should be greater than or equal to the threshold.")
def test_performance(self):
# 测试性能是否有所改进
start_time = time.time()
# 执行模糊匹配
fuzzy_match(self.pattern, [self.original_text] * 1000) # 重复1000次以模拟大量数据
end_time = time.time()
# 检查执行时间是否合理
self.assertLess(end_time - start_time, 10, "Performance test failed: Execution time exceeded 10 seconds.")
if __name__ == '__main__':
unittest.main()
TestFuzzyMatch 是一个继承自 unittest.TestCase 的测试类。test_fuzzy_match 方法验证了函数的正确性,而 test_performance 方法检查了函数的性能