zoukankan      html  css  js  c++  java
  • 第一次个人编程作业

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

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

  • 相关阅读:
    jQuery 获取jsp页面中用iframe引入的jsp页面中的值
    spring事务管理
    mysql中将多行数据合并成一行数据
    C语言字符串格式化输出
    gdb无法单步调试
    Linux系统glibc库版本信息查看
    gcc编译命令行依赖库的指定顺序
    HDFS的基础与操作
    搭建Kubernetes容器集群管理系统
    如何在 CentOS 里下载 RPM 包及其所有依赖包
  • 原文地址:https://www.cnblogs.com/shuishangzhizhou/p/13727632.html
Copyright © 2011-2022 走看看