个人项目

| 这个作业属于哪个课程 | 网工194-软件工程 |
| ---- | ---- | ---- |
|这个作业要求在哪里| 完成个人项目并测试|
|这个作业的目标| 实现论文查重算法,学会使用PSP表格,学会 Git commit 规范,学会使用单元测试|

一、GitHub

个人项目

二、P2P表格

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

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

1、接口设计

CommandParse创建Article对象加载原始论文和待检测论文,并使用ArticleCompare.compare进行比较
论文特征在Article构造函数中计算过程,将文章中所有可能存在的双字词的hash值作为特征保存到排序集合中

ArticleCompare.compare:
由于特征是以整数形式从小到大排序存储到集合中的,采用双指针法,计算2个整数集合共同元素的个数

2、关键算法

收集分词的集合是一个以分词字符串(String word)为Key,分词频数数组(int[2] count)为Value的HashMap(HashMap<String,int[]> wordMap),其中count[0]代表articleA的分词频数,count[1]则代表articleB的分词频数。
simhash算法
程序首先输入抄袭论文和原版论文的绝对路径,并且通过SimHash算法获取两个论文相应的Simhash对象hash1和hash2。得到hash1和hash2之后,取出两者的数字指纹传入getDistance方法中,通过逐位比较两个指纹的二进制数据,统计其中相似之处并返回一个整数dis以表示两个数字指纹中总共相似的地方。最后通过dis/hashbit求出论文的相似率

四、计算模块接口部分的性能分析改进

使用SonarLint改进代码质量
无报错:

使用JProfier分析性能

占用时间最多的函数展示:

由分析可得Article构造函数中计算特征的过程占用时间最多,并且使用正则表达式分割逗号句号和分割双字词使用时间较多。

五、计算模块部分单元测试展示

测试命令行对输入参数错误的处理:

测试某个目录下所有文件查重率,测试是否成功从文件中读取文章和是否成功创建输出文件:

单元测试覆盖率截图:

正常测试截图:

项目运行结果截图

六、计算模块部分异常处理说明

在命令行没有输入足够参数:

比对文件为空文档时:

输入文档的路径出错:

七、总结

本次项目难度比上次大得多,花的时间也多。本次作业中也遇到了许多问题,比如java和javac的版本问题,github的登陆问题和jar的乱码问题等。其中有的解决了有的由于时间问题只换了个治标不治本的方法,比如此次GitHub的提交远程提交不了就只在官网中上传代码文件。通过此次作业明白自己的代码能力和阅读能力还有待提高,在以后会多花时间在这上面。

posted @ 2021-09-19 18:11  F日尧  阅读(38)  评论(0)    收藏  举报