第一次个人编程作业

这个作业属于课程 软件工程
这个作业的要求在哪里 个人项目作业
这个作业的目标是 完成论文查重程序

GitHub:
820831320/3118005409

PSP

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

接口设计

一共设计了五个函数进行程序运行
函数为:

  • is_blank
  • re_jieba_han()
  • count()
  • merge_word()
  • change()
  • cosine_similarity()

程序流程图

re_jieba_han()

在这里插入图片描述

通常情况下会对文档先进行一遍提取分词,然后再对文档中的标点符号使用re模块函数进行去除标点符号。

该函数在读取的时候就直接选择性读取``

结果减少了对文档的操作时间,提高效率

性能分析

性能图

在这里插入图片描述
其中整个程序中最消耗时间的是 change () 函数,

函数改进仅对 re_jieba_han () 进行了性能优化

优化前

在这里插入图片描述
函数对文档先进行了提取,再进行标点符号的清除

优化后

在这里插入图片描述
直接进行筛选读取

单元测试

程序代码覆盖率

在这里插入图片描述

测试 re_jieba_han ()

测试样例及其结果

  • 在这里插入图片描述
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 在这里插入图片描述
  • 在这里插入图片描述

十个测试用例同时测试了包含汉字、数字、英语以及特殊标点符号的文件,函数成功运行

代码覆盖率:
在这里插入图片描述

测试 count ()

沿用上一次是的结果测试该函数

在这里插入图片描述
成功生成字典,并且词频统计正确

代码覆盖率:

在这里插入图片描述

测试 cosine_similarity ()

在这里插入图片描述
测试算法函数,需要输入两个列表作为两个文本的转化向量来进行计算测试,所以设计了自动生成列表函数并通过循环自动测试十次

def create_vec():
    a = rd.randint(0,10,(5,5))
    a2 = a.reshape(25, order='C')
    return a2

def cosine_similarity(x, y, norm=False):
    
    assert len(x) == len(y), "len(x) != len(y)"
    zero_list = [0] * len(x)
    if (x == zero_list).all() or (y == zero_list).all():
        return float(1) if x == y else float(0)

    res = np.array([[x[i] * y[i], x[i] * x[i], y[i] * y[i]] for i in range(len(x))])
    cos = sum(res[:, 0]) / (np.sqrt(sum(res[:, 1])) * np.sqrt(sum(res[:, 2])))

    return 0.5 * cos + 0.5 if norm else cos

if __name__ == '__main__':
    i = 1
    while i < 11:
        vec1 = create_vec()
        vec2 = create_vec()
        result = cosine_similarity(vec1,vec2)
        print("第 %d 次测试" %i)
        print("这是向量1",vec1)
        print("这是向量2",vec2)
        i = i+1
        print(result)

代码覆盖率:

在这里插入图片描述

异常处理

对空文件的异常处理

当输入的两个文件中有一个为空文件,即停止程序并提醒文件为空
在这里插入图片描述
在这里插入图片描述

总结

使用PSP感受

对于PSP一开始看着感觉很虚,似乎是随便填的,主要是第一次规范的填写自己的时间花在了那里,让人难以捉摸。但是这个确实可以让自己明白自己的大概花在了哪里,能有针对性的提升

jieba算法

结巴算法中有 jieba.cut()jieba.lcut(),他们的区别是jieba.cut() 生成的是一个生成器,需要通过循环来把分好的词一个一个取出来放入列表里,但是 jieba.lcut() 可以直接得到一个列表,这一次使用的是jieba.cut()

Numpy中关于列表的条件判别

当使用 if x == zero_list or y == zero_list 时 x,y ,zero_list三个列表长度一样的时候可能出现判别模糊,因为 x == zero_list 可能数值上不相等但是逻辑上相等。因此可能需要使用a.any() 或者 a.all()来判别
即:if (x == zero_list).all() or (y == zero_list).all():

具体参考 Python-numpy逻辑报错

posted @ 2020-09-25 01:40  三块半  阅读(144)  评论(0编辑  收藏  举报