第一次个人编程作业
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/ |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/homework/13136 |
这个作业的目标 | 熟悉个人软件开发流程、熟悉各类工具的使用,学会用工具评估程序质量并优化程序 |
github链接:https://github.com/w0coder/3122004625
设计与实现:
程序总共分为两个部分,读取数据和计算相似度。本次采用的是基于词频统计的余弦相似度的算法,所用语言为C++。
这两个部分可以分出来3个函数:
读取文件的函数、统计词频的函数、计算余弦相似度的函数。
读取文件的函数直接用cpp的文件读写流读取。
统计词频则需要维护一个哈希表,其中以词为键,出现的次数为值,中文的词并不容易区分,所有直接计算每个字的个数,而英文的词则可以简单的用相连的字母粗略的表示一个词。
计算余弦相似度则利词字频统计函数得出的两张哈希表进行计算,遍历两张哈希表,更具所组成的词频向量,计算它们的点积。
性能改进:
从下图可以看出,性能主要消耗在词频统计时哈希表的维护,其中主要是哈希表的插入和查找消耗大。
而基于词频的算法本身就需要遍历所有的字词,统计时必然开销较大,暂时没想到优化方法。
开销最大的函数:
单元测试展示:
计算部分的测试:
通过两个字符串,模拟文本输入的信息,选择不同的字符串进行统计词频和计算相似度的操作。
用例构造:测试边缘的计算-最左边最右边为特殊符号或中文或英文或数字的字符串;同样的词顺序调换,测试结果是否和理论符合;部分删减的测试;部分字词(不包括英文符号)替换的测试;(测试用例在该函数前的注释中)
样例测试结果:
综合测试直接在cmd中输入参数,依据 exe文件绝对路径 原文文件绝对路径 其他文件绝对路径 输出文件绝对路径 的格式输入相关参数。
部分参数取自保存到TestTxt\MyTxt文件中的文本文件,该文件夹中的文件是从B站同一up主的不同图文中复制粘贴的,其中测试了同一片文章自己比较,不同文章一一比较的结果,并写入了同文件夹中的ans.txt文件中,相似度如下:
部分参数取自保存到TestTxt\MyTxt_01文件中的文本文件,该文件夹中的文本随机取自B站上的图文,输出结果在同目录的ans.txt文件中,相似度如下:
异常处理说明:
当输入的文件绝对路径不正确时,报错并结束程序。
计算余弦相似度时,向量的模的平方过大时可能会溢出,计算时采用double,溢出后并未处理。
文件过大,字数过多时,未处理。
文件编码格式不兼容时,未处理。
附录:
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 40 | 60 |
· Estimate | · 估计这个任务需要多少时间 | 40 | 60 |
Development | 开发 | 990 | 705 |
· Analysis | · 需求分析 (包括学习新技术) | 240 | 180 |
· Design Spec | · 生成设计文档 | 60 | 40 |
· Design Review | · 设计复审 | 30 | 20 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 15 |
· Design | · 具体设计 | 90 | 60 |
· Coding | · 具体编码 | 240 | 270 |
· Code Review | · 代码复审 | 60 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 120 | 90 |
Reporting | 报告 | 150 | 130 |
· Test Repor | · 测试报告 | 60 | 70 |
· Size Measurement | · 计算工作量 | 45 | 30 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 45 | 30 |
· 合计 | 1060 | 895 |