个人项目

主管作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/homework/13136
这个作业的目标 实现自己的第一个个人项目,增强对项目开发的理解

github链接

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语言进行开发,鉴于未积累过经验,过程十分跌宕,每有想法实现却总是遇到障碍,类如添加依赖,添加类的声明,添加包,
种种原因困扰最终选择了大道至简最粗暴的方法,毕竟得先提交了再说嘛,希望在以后慢慢的磨练中能快速掌握多种语言的开发,并做到高效

posted @ 2024-03-13 20:13  翻滚的车厘子  阅读(22)  评论(0编辑  收藏  举报