第一次编程作业
1.需求
1.1题目
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:
从命令行参数给出:论文原文的文件的绝对路径。
从命令行参数给出:抄袭版论文的文件的绝对路径。
从命令行参数给出:输出的答案文件的绝对路径。
1.2分析
1.读写txt文件(原论文与抄袭版论文)
2.运用simhash+海明距离算法计算文本相似度
3.将相似度以浮点型(精确到小数点后两位)输入到答案文件中
4.异常处理
2.开发环境
- 编程语言:Java
- IDE:IntelliJ IDEA Community Edition 2022.2.2
- 性能分析工具:JProfiler
- 依赖的外部jar包:
2.1结构
2.2总体设计
3.代码实现及设计
3.0 核心算法
3.1 MainPaperCheck类
存放main方法调用其他方法。
读取对应文件,调用getSimHash方法得出SimHash值,再计算出海明距离和相似度;将相似度写入文件;退出程序。
3.2 SimHashUtils类
用于计算SimHash值。
3.2.1 getHash方法
使用MD5获得传入的String类型字符串的Hash值,并以字符串形式返回。
3.2.2 getSImHash方法
计算SimHash值,并以字符串形式输出。
3.3 HammingUtils类
计算海明距离,并利用海明距离计算相似度,其公式为1-海明距离/128。
3.4 TxtOUtils类
调用Java.io包提供的接口,实现txt文件的读写。
3.5 ShortStringException类
处理异常。
4.测试
4.1性能分析
4.2模块测试
4.2.1 MainTest
利用样例中的五个“抄袭”txt与原版txt进行相似度测试,分别得出它们与原版的相似度并输入到指定txt中。
异常处理:原版txt与自身进行相似度测试,最终结果为1(即完全一致)。
部分测试代码如下:
public void origAndAllTest(){
String[] str = new String[6];
str[0] = TxtIOUtils.readTxt("C:/Users/28765/JAVA/test/orig.txt");
str[1] = TxtIOUtils.readTxt("C:/Users/28765/JAVA/test/orig_0.8_add.txt");
str[2] = TxtIOUtils.readTxt("C:/Users/28765/JAVA/test/orig_0.8_del.txt");
str[3] = TxtIOUtils.readTxt("C:/Users/28765/JAVA/test/orig_0.8_dis_1.txt");
str[4] = TxtIOUtils.readTxt("C:/Users/28765/JAVA/test/orig_0.8_dis_10.txt");
str[5] = TxtIOUtils.readTxt("C:/Users/28765/JAVA/test/orig_0.8_dis_15.txt");
String ansFileName = "C:/Users/28765/JAVA/test/ansAll.txt";
for(int i = 0; i <= 5; i++){
double ans = HammingUtils.getSimilarity(SimHashUtils.getSimHash(str[0]), SimHashUtils.getSimHash(str[i]));
TxtIOUtils.writeTxt(ans, ansFileName);
}
}
@Test
public void origAndOrigTest(){
String str0 = TxtIOUtils.readTxt("C:/Users/28765/JAVA/test/orig.txt");
String str1 = TxtIOUtils.readTxt("C:/Users/28765/JAVA/test/orig.txt");
String ansFileName = "C:/28765/JAVA/Desktop/test/ansOrigAndOrigTest.txt";
double ans = HammingUtils.getSimilarity(SimHashUtils.getSimHash(str0), SimHashUtils.getSimHash(str1));
TxtIOUtils.writeTxt(ans, ansFileName);
}
测试结果:
测试计算两个文本的海明距离和相似度并输出。
5.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 20 | 70 |
Development | 开发 | 610 | 720 |
· Analysis | · 需求分析 (包括学习新技术) | 90 | 120 |
· Design Spec | · 生成设计文档 | 30 | 50 |
· Design Review | · 设计复审 | 30 | 60 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 40 | 30 |
· Design | · 具体设计 | 120 | 90 |
· Coding | · 具体编码 | 500 | 800 |
· Code Review | · 代码复审 | 30 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 90 |
Reporting | 报告 | 100 | 110 |
· Test Report | · 测试报告 | 40 | 60 |
· Size Measurement | · 计算工作量 | 20 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 40 | 90 |
合计 | 1750 | 2400 |