个人项目 ———Java实现论文查重算法
个人项目 ———Java实现论文查重算法
作业要求
| 这个作业属于哪个课程 | 工程概论 |
|---|---|
| 这个作业要求在哪里 | 个人项目 |
| 这个作业的目标 | 学习GitHub项目开发,了解PSP表格 |
🌟 需求
题目:论文查重
描述如下:
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:
从命令行参数给出:论文原文的文件的绝对路径。
从命令行参数给出:抄袭版论文的文件的绝对路径。
从命令行参数给出:输出的答案文件的绝对路径。
我们提供一份样例,课堂上下发,上传到班级群,使用方法是:orig.txt是原文,其他orig_add.txt等均为抄袭版论文。
注意:答案文件中输出的答案为浮点型,精确到小数点后两位
🌟 开发环境
- 操作系统:macOS13.3.1 (a)
- 语言: Java
- JDK: JDK8
- IDE: IntelliJ IDEA 2023.1 (Ultimate Edition)
1、PSP表格
| PSP2.1 | Personal Software Process Stages | 预计耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 30 | 40 |
| · Estimate | · 估计这个任务需要多少时间 | 200 | 180 |
| Development | 开发 | 100 | 120 |
| · Analysis | · 需求分析 (包括学习新技术) | 120 | 100 |
| · Design Spec | · 生成设计文档 | 40 | 30 |
| · Design Review | · 设计复审 | 20 | 30 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 20 |
| · Design | · 具体设计 | 40 | 30 |
| · Coding | · 具体编码 | 80 | 60 |
| · Code Review | · 代码复审 | 40 | 60 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 30 | 40 |
| Reporting | 报告 | 30 | 40 |
| · Test Repor | · 测试报告 | 20 | 20 |
| · Size Measurement | · 计算工作量 | 30 | 20 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
| · 合计 | 830 | 820 |
2、GitHub链接
https://github.com/makacpeng/makacpeng/tree/main/202121331069/PaperReview
3、计算模块接口的设计与实现过程
3.1 实现算法知识了解
- simHash
simHash也称为相似hash,是一种特殊的信息指纹,常用来比较文章的相似度。通过特征将文本分词,为每个词加上权重;再通过hash算法获取每个词的hash值;随后将hash加权,合并,降维得到simHash值 - 海明距离
将不同文本最终转换的两个simHash值对比,差异的位数即为“海明距离” - hanLp依赖
<dependency>
<groupId>com.hankcs</groupId>
<artifactId>hanlp</artifactId>
<version>portable-1.5.4</version>
</dependency>
3.2 工具类设计
| 类名 | 功能 |
|---|---|
| HammingUtil | 计算两个simHash值的海明距离 |
| shortStringException | 处理文本过短异常 |
| simHashUtil | 计算simHash |
| txtOIUtil | 读写txt文件操作| |
3.3 算法依靠
引用糊涂工具包的TokenizerEngine,查重率cos值具体计算公式如下:

- 汉语言处理包依赖
![]()
4、计算模块接口部分的性能改进
通过JProflier性能分析,为了更清晰的看到运行情况,我们运行一千次来扩张区分点:

同时观察实时内存中类的使用情况:

我们可以看到,hanlp大量使用,因为需要依靠hanlp对文本进行划分,同时HashMap也被频繁使用,那是因为需要通过hash值来测算
5、计算模块部分单元测试展示
- 测试类模块
![]()
- 测试结果
![]()
- 测试类覆盖率
![]()
6、计算模块部分异常处理说明
文本过短时,HanLp无法正常获取关键字,实现shortStringException异常类处理异常
public class shortStringException extends Exception{
public shortStringException(String message) {
super(message);
}
}
异常情况:






浙公网安备 33010602011771号