第一次个人编程作业

这个作业属于哪个课程 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
posted @ 2024-03-10 22:50  柠筱  阅读(166)  评论(0编辑  收藏  举报