Gordy_Li

Hello, everyone!

第一次个人作业

个人第一次编程作业

这个作业属于哪个课程 班级链接
这个作业要求在哪里 作业链接
这个作业的目标1 论文查重算法设计
这个作业的目标2 学习PSP表格
这个作业的目标3 单元测试
这个作业的目标4 Profile性能分析
这个作业的目标5 Git管理

代码链接(Python)


  • 写在前面的话:本次作业使用Python完成。
  • Github链接
  • 可运行的exe文件已发布至仓库的release包内

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 45
· Estimate · 估计这个任务需要多少时间 30 45
Development 开发 180 345
· Analysis · 需求分析 (包括学习新技术) 20 20
· Design Spec · 生成设计文档 15 30
· Design Review · 设计复审 15 15
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 5 10
· Design · 具体设计 20 50
· Coding · 具体编码 60 150
· Code Review · 代码复审 15 20
· Test · 测试(自我测试,修改代码,提交修改) 30 45
Reporting 报告 75 85
· Test Repor · 测试报告 15 20
· Size Measurement · 计算工作量 10 15
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 50 50
· 合计 570 945

计算模块接口的设计与实现过程

整体流程

  1. 建立了一个Text类和两个函数(get_word_vector和cos_dist)
  2. 创建Text实例,调用Text类中的get_word_list函数分割字符串(这里程序可以选择两种分割字符串的方法,一种是调用re包逐字分割,另一种是使用jieba包逐词分割),并返回列表
  3. 使用get_word_vector函数将字符列表转换为向量
  4. 使用余弦相似度函数(cos_dist)计算两个字符列表的余弦相似度

工程截图

一共有三个文件,main.py文件,test.py文件和text.py文件

1、整体流程

2、函数方法

  • main函数:主函数

  • get_word_list函数:将字符串转换为字符列表

  • get_word_vector 函数:将字符列表转换为向量

  • cos_dist函数:计算余弦相似度(核心算法)

3、核心算法

余弦相似度:

性能分析

这里使用专业版pycharm内置的profile进行性能分析

容易看出,获取字符列表向量的操作占了程序大部分的时间(输入输出的时间除外)

原因是get_word_vector中获取向量需要使用双重for循环:

def get_word_vector(word_list1, word_list2):
    key_word = list(set(word_list1 + word_list2))
    # 给定形状和类型的用0填充的矩阵存储向量
    word_vector1 = np.zeros(len(key_word))
    word_vector2 = np.zeros(len(key_word))
    # 计算词频
    # 依次确定向量的每个位置的值
    for i in range(len(key_word)):
        # 遍历key_word中每个词在句子中的出现次数
        for j in range(len(word_list1)):
            if key_word[i] == word_list1[j]:
                word_vector1[i] += 1
        for k in range(len(word_list2)):
            if key_word[i] == word_list2[k]:
                word_vector2[i] += 1
    return word_vector1, word_vector2

异常处理与单元测试

1.异常处理说明

对每种异常的情况进行提示并且返回特定的值,方便测试模块中的assertEqual方法进行验证

路径错误

文件为空

2. test模块测试

  • 测试正常读取

  • 测试错误读取

调用unittest包编写了10个测试用例,主要对出现不存在路径和空文件的情况进行测试。

3.代码覆盖率

使用coverage包生成覆盖率报告

结果展示

jieba包逐词分割

re包逐字分割

posted @ 2021-09-19 18:10  Gordy_Li  阅读(53)  评论(0编辑  收藏  举报