个人项目
主管作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/ |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/homework/13136 |
这个作业的目标 | 实现自己的第一个个人项目,增强对项目开发的理解 |
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
· Planning | · 计划 | 60 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 60 | 30 |
Development | 开发 | 1060 | 1000 |
· Analysis | · 需求分析 (包括学习新技术) | 300 | 330 |
· Design Spec | · 生成设计文档 | 30 | 30 |
· Design Review | · 设计复审 | 40 | 40 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 20 |
· Design | · 具体设计 | 120 | 100 |
· Coding | · 具体编码 | 240 | 240 |
· Code Review | · 代码复审 | 60 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 240 | 180 |
Reporting | · 报告 | 140 | 120 |
· Test Repor | · 测试报告 | 60 | 60 |
· Size Measurement | · 计算工作量 | 30 | 30 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 50 | 30 |
总计 | 1260 | 1150 |
模块接口的设计与实现过程
-
主程序流程:从命令行获取三文件路径参数——>调用getSimilarity.calculateSimilarity()对待检测文本进行内容的读取以及文本字符串的转换——>
调用getSimilarity.lcsLength()对待检测文本字符串进行求最大子序列数,最大子序列数除以待检测文本最大字符数得出重复率——>调用resultInput.writeResultToFile(),
将计算所得重复率写入指定文件; -
papercheck类:内含主函数接口,接受命令行所给参数并调用getSimilarity类计算得出文本相似度
并调用resultInput类将相似度写入指定文件 -
getSimilarity类:设计calculateSimilarity()方法求两文本相似度,先使用FileReader类读取两文本内容随后用BufferReader类逐行获取有效文本,
接着将文本内容转换为字符串型,并调用lcsLength()方法利用动态规划法求出两字符串的最大子序列数,最后将最大子序列数除以两文本间的最大字符数得出相似度; -
resultInput类:设计writeResultToFile()方法,使用FileWriter类指向指定路径的答案文件,将相似度写入答案文件当中;
模块接口部分的性能改进
在calculateSimilarity()中,这里我们采用了最大子序列来求相似度,但由于动态规划法的嵌套双循环语句,时间复杂度为字符数量的平方级,耗时过长,可通过余弦相似度的方法来解决,
通过BreakIterator类实现文本的分句,再通过添加IK分词器工具类实现对句子的分词,以及后续的统计词频,向量化等实现余弦相似度的计算,可减小时间复杂度,鉴于第一次使用java开发,
碍于工具类等的安装使用以及不熟练,这里只用最大子序列求取相似度;
模块部分单元测试展示
-
papercheck类:
-
getSimilarity类:
-
resultInput类:
覆盖率:
模块部分异常处理说明
在*papercheck类的main函数中,设置了输入绝对路径参数的检测,若参数规格不符合要求系统报错;
总结
第一次使用Java语言进行开发,鉴于未积累过经验,过程十分跌宕,每有想法实现却总是遇到障碍,类如添加依赖,添加类的声明,添加包,
种种原因困扰最终选择了大道至简最粗暴的方法,毕竟得先提交了再说嘛,希望在以后慢慢的磨练中能快速掌握多种语言的开发,并做到高效