个人项目
Java论文查重系统
| 这个作业属于哪个课程 | [网络1934-软件工程](首页 - 网工1934-软件工程 - 广东工业大学 - 班级博客 - 博客园 (cnblogs.com)) |
|---|---|
| 这个作业的要求在哪里 | [作业要求](个人项目 - 作业 - 网工1934-软件工程 - 班级博客 - 博客园 (cnblogs.com)) |
| 这个作业的目标 | 设计一个论文查重算法,给出一个原文文件和一个在一个在这份原文上经过了增删改的抄袭论文的文件,在答案文件中输出其重复率 |
[github连接](Light-DG/Light-DG (github.com))
PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | ||
| · Estimate | · 估计这个任务需要多少时间 | 590 | 600 |
| Development | 开发 | ||
| · Analysis | · 需求分析 (包括学习新技术) | 110 | 100 |
| · Design Spec | · 生成设计文档 | 30 | 40 |
| · Design Review | · 设计复审 | 30 | 30 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 20 |
| · Design | · 具体设计 | 70 | 80 |
| · Coding | · 具体编码 | 110 | 130 |
| · Code Review | · 代码复审 | 30 | 30 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 90 | 90 |
| Reporting | 报告 | ||
| · Test Repor | · 测试报告 | 30 | 40 |
| · Size Measurement | · 计算工作量 | 15 | 10 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 50 | 30 |
| · 合计 | 585 | 600 |
计算模块接口的设计与实现过程
读写文本的模块 ReadOrWriteTextUtils
- 通过调用java的File,BufferedReader,FileWriter等api来读写文件。
- 函数:String readTxt(String txtPath),void writeTxt(String text,String txtPath)。
SimHash模块 SimHashHelper
- getHash:将传入的String转为hash值,通过MD5获取。
- getSimHash:传入String,计算出它的SimHash值。其中先调用getHash获取hash值。
- SimHash算法:
- 分词,通过调用第三方库HanLP来实现分词。
- 获取hash值。
- 加权,合并
- 降维
海明模块距离 HammingUtils
函数:
1. getHammingDistance: 输入两个simHash值,计算它们的海明距离。
2. getSimilarity: 调用getHammingDistance来获得distance,在根据distance来获得相似度。
main模块
主要流程:
1. 从命令行输入的路径名读取对应的原文和抄袭文,并转化为字符串
2. 有字符串转化为simHash值
3. 通过simHash值求出相似度。
4. 将结果写入文件中。
计算模块接口部分的性能改进
OverView

内存

计算模块部分单元测试
读写txt文件模块的测试
@Test
void readTxt() {
String str = ReadOrWriteTextUtils.readTxt("D:/test/orig.txt");
String[] strings = str.split(" ");
for (String string : strings) {
System.out.println(string);
}
}
@Test
void writeTxt() {
String[] ret = new String[]{"0.5","0,75","0.99"};
for (int i = 0; i < ret.length; i++) {
ReadOrWriteTextUtils.writeTxt(ret[i], "D:/test/ans.txt");
}
}
@Test
void readTxtFail() {
String str = ReadOrWriteTextUtils.readTxt("D:/test/orig.txt");
String[] strings = str.split(" ");
for (String string : strings) {
System.out.println(string);
}
}

SimHashHelper测试
@Test
void getHash() {
String[] strings = {"今天","是","星期天","天气","晴","今天晚上","我要去","看电影"};
for (String string : strings) {
String stringHash = SimHashHelper.getHash(string);
System.out.println(stringHash.length());
System.out.println(stringHash);
}
}
@Test
void getSimHash() {
String str0 = ReadOrWriteTextUtils.readTxt("D:/test/orig.txt");
String str1 = ReadOrWriteTextUtils.readTxt("D:/test/orig_0.8_add.txt");
System.out.println(SimHashHelper.getSimHash(str0));
System.out.println(SimHashHelper.getSimHash(str1));
}

HammingUtils测试
@Test
void getHammingDistance() {
String str0 = ReadOrWriteTextUtils.readTxt("D:/test/orig.txt");
String str1 = ReadOrWriteTextUtils.readTxt("D:/test/orig_0.8_add.txt");
int distance = HammingUtils.getHammingDistance(SimHashHelper.getSimHash(str0), SimHashHelper.getSimHash(str1));
System.out.println("海明距离:" + distance);
System.out.println("相似度: " + (100 - distance * 100 / 128) + "%");
}

Main测试
@org.junit.jupiter.api.Test
void main() {
String[] str = new String[6];
str[0] = ReadOrWriteTextUtils.readTxt("D:/test/orig.txt");
str[1] = ReadOrWriteTextUtils.readTxt("D:/test/orig_0.8_add.txt");
str[2] = ReadOrWriteTextUtils.readTxt("D:/test/orig_0.8_del.txt");
str[3] = ReadOrWriteTextUtils.readTxt("D:/test/orig_0.8_dis_1.txt");
str[4] = ReadOrWriteTextUtils.readTxt("D:/test/orig_0.8_dis_10.txt");
str[5] = ReadOrWriteTextUtils.readTxt("D:/test/orig_0.8_dis_15.txt");
String ansFileName = "D:/test/ansAll.txt";
for(int i = 0; i <= 5; i++) {
double ans = HammingUtils.getSimilarity(SimHashHelper.getSimHash(str[0]), SimHashHelper.getSimHash(str[i]));
String ret = "覆盖率"+ans;
ReadOrWriteTextUtils.writeTxt(ret, ansFileName);
}
}
覆盖率

模块部分异常处理
HanLP提取关键字要求文本不能太短
try{
if(str.length() < 200) throw new ShortStringException("文本过短!");
}catch (ShortStringException e){
e.printStackTrace();
return null;
}
public class ShortStringException extends Exception{
public ShortStringException() {
super();
}
public ShortStringException(String message) {
super(message);
}
}
测试结果

浙公网安备 33010602011771号