标题: 使用java实现简易论文查重
表头:
| 课程地址 | [广东工业大学-软件工程-计科21级12班] https://edu.cnblogs.com/campus/gdgy/CSGrade21-12 |
|---|---|
| 作业要求 | https://edu.cnblogs.com/campus/gdgy/CSGrade21-12/homework/13014 |
| 作业目标 | 了解论文查重机理; Git与GitHub的链接使用; |
1.代码仓库
https://github.com/wcng010/wcng010
2.PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
| · Planning | · 计划 | 20 | 15 |
| · Estimate | · 估计这个任务需要多少时间 | 500 | 450 |
| Development | · 开发 | 300 | 240 |
| · Analysis | · 需求分析 (包括学习新技术) | 120 | 80 |
| · Design Spec | · 生成设计文档 | 50 | 45 |
| · Design Review | · 设计复审 | 20 | 20 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 15 |
| · Design | · 具体设计 | 30 | 20 |
| · Coding | · 具体编码 | 30 | 45 |
| · Code Review | · 代码复审 | 20 | 25 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 20 | 15 |
| Reporting | · 报告 | 30 | 35 |
| · Test Repor | · 测试报告 | 20 | 10 |
| · Size Measurement | · 计算工作量 | 15 | 20 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 25 | 25 |
| · 合计 | 1220 | 1060 |
3.计算模块接口实现和实现过程
实现目标:模拟实现论文查重功能
实现流程:
- 1.通过IO功能读取txt文件中的信息生成字符串。
- 2.使用StandardTokenizer.segment对读取的字符串进行分词操作(定义字符串中每个词的词性)。
- 3.使用SimHash算法,对分词后的字符串进行权重对比,计算出两文的海明距离。
- 4.最后通过海明距离得出查重比。
核心算法:SimHash的实现
- 1.对需要比较的文本进行分词,提取特征向量,并对特征向量进行权重(weight)设置。
- 2.通过hash函数计算各个特征向量的hash值。hash值为二进制数0 1 组成的n-bit签名。
- 3.在hash值的基础上,给所有特征向量进行加权,即 W = Hash * weight ,且遇到1则hash值和权值正相乘,遇到0则hash值和权值负相乘。
- 4.将各个特征向量的加权结果累加,变成一个序列串。
- 5.对于n-bit签名的累加结果,如果大于0则置1,否则置0,从而得到该语句的simhash值。
- 6.最后根据不同语句simhash的海明距离来判断它们的相似度。
模块分析:
-
IO模块:
![]()
-
相似度计算模块:
![]()
4.计算模块接口部分的性能改进
内存分析图:

由上图可知,int类型和字典占据了绝大多数内存,前者是由于传入的文本被转化为特征的向量和导致,后者是超频词的设置(需要记录所有词出现次数)。
5.计算模块的单元测试展示
IO模块测试:


计算模块测试:


主模块测试


主程序测试

代码覆盖率

6.计算模块部分异常处理说明:
- 处理输入错误:
![]()
- IO异常处理:
![]()
- 处理计算错误:
![]()





浙公网安备 33010602011771号