软工作业2:论文查重
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/ |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13229 |
这个作业的目标 | 通过开发个人项目,实现项目单元测试 |
一、GitHub链接
二、PSP表格
PSP2.1 | Personal Software ProcessStages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 44 |
Estimate | 估计这个任务需要多少时间 | 300 | 450 |
Development | 开发 | 120 | 150 |
Analysis | 需求分析(包括学习新技术) | 40 | 60 |
Design Spec | 生成设计文档 | 30 | 45 |
Design Review | 设计复审 | 20 | 25 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 15 | 15 |
Design | 具体设计 | 60 | 80 |
Coding | 具体编码 | 120 | 180 |
Code Review | 代码复审 | 15 | 10 |
Test | 测试(自我测试,修改代码,提交修改) | 30 | 40 |
Reporting | 报告 | 80 | 95 |
Test Repor | 测试报告 | 15 | 15 |
Size Measurement | 计算工作量 | 5 | 5 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 10 | 10 |
合计 | 590 | 774 |
三、开发环境
编译语言:Java 17
IDE:Intellij IDEA 2021
单元测试:JUnit 4.12
性能分析工具:JProfiler 9.2
四、计算模块接口的设计与实现过程
需求
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
实现原理
通过SimHash算法并结合实际的代码来实现,通过对不同文本的SimHash值进而比较“海明距离”,从而判断两个文本的相似度。
设计流程图示
类及其方法
App:main方法
1.从命令行输入的路径读取文件,调用IOtxt将文件的内容转化为字符串
2.得出 simHash 值
3.由 simHash 值求出相似度
4.把相似度写入结果文件中
5.退出程序
IOtxt:读写txt文件的类
1.readTxt:读取txt文件
2.writeTxt:写入txt文件
HamMingUtils:计算海明距离的类
1.getHammingDistance:输入两个 simHash 值,计算出它们的海明距离 distance
2.getSimilarity:由simHash 值和海明距离 distance 计算出相似度。
SimilarityHash:计算SimHash值的类
1.通过外部包 HanLP的方法extractKeyword去出关键词
2.getHash得出哈希值
3.加权、合并
4.降维
TxtException:处理txt文件错误信息的类
五、性能分析
Overview
函数调用
分析:占用最多的是hanlp包提供的接口,和开辟内存空间如数组、字符串、浮点数。整体程序逻辑较为简单,各个函数及方法耗时较短。
六、单元测试
String path1="D:\\rgcs\\orig.txt";//原文
String path2="D:\\rgcs\\orig_0.8_add.txt";
String path3="D:\\rgcs\\orig_0.8_del.txt";
String path4="D:\\rgcs\\orig_0.8_dis_1.txt";
String path5="D:\\rgcs\\orig_0.8_dis_10.txt";
String path6="D:\\rgcs\\orig_0.8_dis_15.txt";
@Test// 把原文和其他文章对比
public void Test1(){
try {
String[] str = new String[6];
str[0] = IOtxt.readTxt(path1);
str[1] = IOtxt.readTxt(path2);
str[2] = IOtxt.readTxt(path3);
str[3] = IOtxt.readTxt(path4);
str[4] = IOtxt.readTxt(path5);
str[5] = IOtxt.readTxt(path6);
String ansFileName = "D:\\rgcs\\output\\ans1.txt";//输出路径
for(int i = 0; i <= 5; i++){
double ans= HamMingUtils.getSimilarity(SimilarityHash.getSimHash(str[0]), SimilarityHash.getSimHash(str[i]));
String result="查重率:"+ans;
IOtxt.writeTxt(result, ansFileName);
}
}catch (Exception err){
System.out.println(err);
}
}
测试结果
覆盖率
七、异常处理
@Test //把原文和其他文章对比
public void Test1(){
try {
String[] str = new String[6];
str[0] = IOtxt.readTxt(path1);
str[1] = IOtxt.readTxt(path2);
str[2] = IOtxt.readTxt(path3);
str[3] = IOtxt.readTxt(path4);
str[4] = IOtxt.readTxt(path5);
str[5] = IOtxt.readTxt(path6);
String ansFileName = "D:\\rgcs\\output\\ans1.txt";//输出路径
for(int i = 0; i <= 5; i++){
double ans= HamMingUtils.getSimilarity(SimilarityHash.getSimHash(str[0]), SimilarityHash.getSimHash(str[i]));
String result="查重率:"+ans;
IOtxt.writeTxt(result, ansFileName);
}
}catch (Exception err){
System.out.println(err);
}
}
@Test //原文与原文对比,查重率百分之百
public void Test2(){
try {
String str0 = IOtxt.readTxt(path1);
String str1 = IOtxt.readTxt(path1);
String ansFileName = "D:\\rgcs\\output\\ans2.txt";
double ans = HamMingUtils.getSimilarity(SimilarityHash.getSimHash(str0), SimilarityHash.getSimHash(str1));
String result="查重率:"+ans;
IOtxt.writeTxt(result, ansFileName);
}catch (Exception err){
System.out.println(err);
}
}
@Test //正常读写(文件内容差距大)
public void Test3(){
try {
String str0 = IOtxt.readTxt(path1);
String str1 = IOtxt.readTxt(path5);
String ansFileName = "D:\\rgcs\\output\\ans3.txt";
double ans = HamMingUtils.getSimilarity(SimilarityHash.getSimHash(str0), SimilarityHash.getSimHash(str1));
String result="查重率:"+ans;
IOtxt.writeTxt(result, ansFileName);
}catch (Exception err){
err.printStackTrace();
System.out.println("写入路径错误!");
}
}
@Test //正常读写(文件内容差距小)
public void Test4(){
try {
String str0 = IOtxt.readTxt(path3);
String str1 = IOtxt.readTxt(path4);
String ansFileName = "D:\\rgcs\\output\\ans4.txt";
double ans = HamMingUtils.getSimilarity(SimilarityHash.getSimHash(str0), SimilarityHash.getSimHash(str1));
String result="查重率:"+ans;
IOtxt.writeTxt(result, ansFileName);
}catch (Exception err){
err.printStackTrace();
System.out.println("写入路径错误!");
}
}