源码地址:GitHub
1、计算模块接口的设计与实现过程
大概流程图
过程实现
-
先利用jieba.posseg.cut()进行分词,将文本切分为数个以空格分开的词组并将其存于列表中,再将俩目标列表,运用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、总结
- 一开始看到题目的时候人都是懵的,完全不知道如何下手,只能不停地百度百度百度,然后又看了几个同学的博客,借鉴一下他们实现的方法和工具,才渐渐有了思路,每次打代码,浏览器总是会不知不觉就打开了几十个窗口,实现了套娃式学习,面向百度编程...
- 这同时也反映出了自己知识储备量不够, 很多东西都只是知其然,对于其中的原理,并没有真正理解,通过此次的作业,也是给自己敲响了警钟吧。