作业概述

这个作业属于哪个课程 软件工程
这个作业要求在哪里 个人项目
这个作业的目标 论文查重

Github

https://github.com/JieZhongZhang/3121005324.java

PSP表格

psp2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟
Planing 计划 20 18
Estimate 估计这个任务需要多少时间 20 18
Development 开发 610 720
Analysis 需求分析 (包括学习新技术) 90 120
Design Spec 生成设计文档 30 50
Design Review 设计复审 30 30
Coding Standard 代码规范 (为目前的开发制定合适的规范) 40 30
Design 具体设计 120 90
Coding 具体编码 240 300
Code Review 代码复审 30 40
Test 测试(自我测试,修改代码,提交修改) 60 90
Reporting 报告 100 110
Test Repor 测试报告 40 60
Size Measurement 计算工作量 20 20
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 40 30
合计 760 878

需求分析

1.题目

设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
要求输入输出采用文件输入输出,规范如下:
从命令行参数给出:论文原文的文件的绝对路径。
从命令行参数给出:抄袭版论文的文件的绝对路径。
从命令行参数给出:输出的答案文件的绝对路径。

2.需求分析

1.读写txt文件(原论文与抄袭版论文)

2.运用simhash+海明距离算法计算文本相似度

3.将相似度以浮点型(精确到小数点后两位)输入到答案文件中

4.异常处理

3.开发环境
编程语言:Java
IDE:IntelliJ IDEA 2021
性能分析工具:JProfiler
依赖的外部jar包:汉语言处理包

具体设计

模块设计

方法:
simHash:计算文本的simhash值
1.利用Hanlp分词
2.将每一个分词hash为一组固定长度的数列
3.建立一个长度为128的整数数组
4.最后对数组进行判断,大于0的记为1,小于等于0的记为0,得到一个128位的simhash值.

hash:计算关键词的Hash值

hammingDistance:对两个文档的simhash值每一位进行异或运算,计算海明距离

getSemblance:利用海明距离计算重复率

readString:文件读取

代码设计与实现

MainPaperCheck类

存放main方法调用其他方法。

读取对应文件,将文件内容转化为字符串形式;调用getSimHash方法得出SimHash值,再计算出海明距离和相似度;将相似度以浮点型小数写入指定文件;退出程 序。

SimHashUtils类

用于计算SimHash值。

getHash方法

使用MD5获得传入的String类型字符串的Hash值,并以字符串形式返回。

getSImHash方法

计算SimHash值,并以字符串形式输出。

HammingUtils类

计算海明距离,并利用海明距离计算相似度,其公式为1-海明距离/128。

TxtOUtils类

调用Java.io包提供的接口,实现txt文件的读写。

ShortStringException类

处理异常。

流程图

测试代码

public class PlagiarismCheck {
public static void main(String[] args) {
String str0 = IOUtils.read(args[0]);
String str1 = IOUtils.read(args[1]);
String resultFileName = args[2];
String simHash0 = SimHashUtils.getSimHash(str0);
String simHash1 = SimHashUtils.getSimHash(str1);
double similarity = HammingUtils.getSimilarity(simHash0, simHash1);
IOUtils.write(similarity, resultFileName);
}
}

性能测试