第一次个人编程作业

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

GitHub:
820831320/3118005409

PSP

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

接口设计

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

  • 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逻辑报错

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值