• 第一次个人编程作业


    源码地址: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、总结

    • 一开始看到题目的时候人都是懵的,完全不知道如何下手,只能不停地百度百度百度,然后又看了几个同学的博客,借鉴一下他们实现的方法和工具,才渐渐有了思路,每次打代码,浏览器总是会不知不觉就打开了几十个窗口,实现了套娃式学习,面向百度编程...
    • 这同时也反映出了自己知识储备量不够, 很多东西都只是知其然,对于其中的原理,并没有真正理解,通过此次的作业,也是给自己敲响了警钟吧。
  • 相关阅读:
    使用匿名内部类和lamda的方式创建线程
    匿名内部类与lamda表达式
    机器学习中数据量多少与模型过拟合欠拟合之间的关系
    设计模式和java实现
    八大排序算法汇总——java实现
    java多线程并发编程中的锁
    java NIO
    网络通信引擎ICE的使用
    机器学习算法汇总大梳理
    处理样本不均衡数据
  • 原文地址:https://www.cnblogs.com/bergscl/p/13679169.html
Copyright © 2020-2023  润新知