第一次个人编程作业

源码地址:GitHub

1、计算模块接口的设计与实现过程

大概流程图

过程实现

  • 先利用jieba.posseg.cut()进行分词,将文本切分为数个以空格分开的词组并将其存于列表中,再将俩目标列表,运用Jaccard系数计算出两个文本的相似度。

  • Jaccard相似系数计算公式:

    Jaccard原理

  • 样例:

    如果比较集合X与Y的Jaccard相似系数,只比较Xn和Xn中相同的个数,公式如下:
    如集合A={1,2,3,4};B={3,4,5,6};
    那么他们的Jaccard(X,Y)=len{3,4}/len{1,2,3,4,5,6}=1/3;

2、计算模块接口部分的性能测试

运行时间

  • 使用pycharm自带的性能分析工具测试该程序,可以看出运行一个样例所用的时间需要5.724秒,其中对文本的分词方法占用了近80%的运行时间,若是要进行优化,应该对分词方法进行进一步优化。

分词函数时间

3、计算模块部分单元测试展示

  • 单元测试方面用的是Python自带的unittest,同时看同学博客了解到还有BeautifulReport这种好东西,索性就用上了;总共十个测试,结果如下:

    单元测试

  • 实现代码:

    from BeautifulReport import BeautifulReport
    import unittest
    import main
    import sys
    import testError
    
    class TestFunction(unittest.TestCase):
       @classmethod
       def setUp(self):
          print("开始测试")
       @classmethod
       def tearDown(self):
          print("测试结束")
          
       def text_self(self):
          print("正在读取orig.txt")
          a = main.SimilarityMethod(r'sim_0.8orig.txt', r'sim_0.8orig.txt')
          print('%.2f'%a.JaccardSim(a.str_a,a.str_b))
    
       def text_add(self):
          print("正在读取orig_0.8_add.txt")
          a = main.SimilarityMethod(r'sim_0.8orig.txt', r'sim_0.8orig_0.8_add.txt')
          print('%.2f'%a.JaccardSim(a.str_a,a.str_b))
    
       def text_del(self):
          print("正在读取orig_0.8_del.txt")
          a = main.SimilarityMethod(r'sim_0.8orig.txt', r'sim_0.8orig_0.8_del.txt')
          print('%.2f'%a.JaccardSim(a.str_a,a.str_b))
          
       def text_dis_1(self):
          print("正在读取orig_0.8_dis_1.txt")
          a = main.SimilarityMethod(r'sim_0.8orig.txt', r'sim_0.8orig_0.8_dis_1.txt')
          print('%.2f'%a.JaccardSim(a.str_a,a.str_b))
          
       def text_dis_3(self):
          print("正在读取orig_0.8_dis_3.txt")
          a = main.SimilarityMethod(r'sim_0.8orig.txt', r'sim_0.8orig_0.8_dis_3.txt')
          print('%.2f'%a.JaccardSim(a.str_a,a.str_b))
          
       def text_dis_7(self):
          print("正在读取orig_0.8_dis_7.txt")
          a = main.SimilarityMethod(r'sim_0.8orig.txt', r'sim_0.8orig_0.8_dis_7.txt')
          print('%.2f'%a.JaccardSim(a.str_a,a.str_b))    
             
       def text_dis_10(self):
          print("正在读取orig_0.8_dis_10.txt")
          a = main.SimilarityMethod(r'sim_0.8orig.txt', r'sim_0.8orig_0.8_dis_10.txt')
          print('%.2f'%a.JaccardSim(a.str_a,a.str_b))
          
       def text_dis_15(self):
          print("正在读取orig_0.8_dis_15.txt")
          a = main.SimilarityMethod(r'sim_0.8orig.txt', r'sim_0.8orig_0.8_dis_15.txt')
          print('%.2f'%a.JaccardSim(a.str_a,a.str_b))
                
       def text_mix(self):
          print("正在读取orig_0.8_mix.txt")
          a = main.SimilarityMethod(r'sim_0.8orig.txt', r'sim_0.8orig_0.8_mix.txt')
          print('%.2f'%a.JaccardSim(a.str_a,a.str_b))
          
       def text_rep(self):
          print("正在读取orig_0.8_rep.txt")
          a = main.SimilarityMethod(r'sim_0.8orig.txt', r'sim_0.8orig_0.8_rep.txt')
          print('%.2f'%a.JaccardSim(a.str_a,a.str_b))
    
    
    if __name__ == '__main__':
       tests = unittest.TestSuite()
       tests.addTest(TestFunction('text_self'))
       tests.addTest(TestFunction('text_add'))
       tests.addTest(TestFunction('text_del'))
       tests.addTest(TestFunction('text_dis_1'))
       tests.addTest(TestFunction('text_dis_3'))
       tests.addTest(TestFunction('text_dis_7'))
       tests.addTest(TestFunction('text_dis_10'))
       tests.addTest(TestFunction('text_dis_15'))
       tests.addTest(TestFunction('text_mix'))
       tests.addTest(TestFunction('text_rep'))
       runner = BeautifulReport(tests)  
       runner.report(
        description='Similarity测试报告',  # => 报告描述
        filename='texts.html',  # => 生成的报告文件名
        log_path='.'  # => 报告路径
    )
    
  • 单元测试代码覆盖率:

    代码覆盖率

4、计算模块部分异常处理

  • 设计了两种异常情况:

    1)所给出的文件不存在时:

    class TextNoExistError(MyError):        #文件不存在
        def __init__(self, file_a):
            self.fa = file_a
        def __str__(self):
            return self.fa+ "该文件不存在!
    

    文件不存在异常

​ 2)所给出的文件内容为空时:

class TextEmptyError(MyError):          #文件无内容
    def __init__(self, file_a):
        self.fa = file_a
    def __str__(self):
        return self.fa+ "该文件啥都没有!"

文件空异常

5、PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 30
Estimate 估计这个任务需要多少时间 40 40
Development 开发 360 480
Analysis 需求分析 (包括学习新技术) 480 540
Design Spec 生成设计文档 40 60
Design Review 设计复审 40 30
Coding Standard 代码规范 (为目前的开发制定合适的规范) 60 50
Design 具体设计 40 40
Coding 具体编码 60 80
Code Review 代码复审 30 30
Test 测试(自我测试,修改代码,提交修改) 200 240
Reporting 报告 40 60
Test Repor 测试报告 30 20
Size Measurement 计算工作量 30 20
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 20 30
合计 1500 1750

6、总结

  • 一开始看到题目的时候人都是懵的,完全不知道如何下手,只能不停地百度百度百度,然后又看了几个同学的博客,借鉴一下他们实现的方法和工具,才渐渐有了思路,每次打代码,浏览器总是会不知不觉就打开了几十个窗口,实现了套娃式学习,面向百度编程...
  • 这同时也反映出了自己知识储备量不够, 很多东西都只是知其然,对于其中的原理,并没有真正理解,通过此次的作业,也是给自己敲响了警钟吧。
原文地址:https://www.cnblogs.com/bergscl/p/13679169.html