个人项目

这个作业属于哪个课程 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文件中。

三、结果输出:

image

四、计算模块接口部分的性能改进:

改进思路:

  • 改进 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 方法检查了函数的性能

posted @ 2024-09-14 13:33  SSTwin  阅读(18)  评论(0编辑  收藏  举报