作业所属班级 | 软件工程2024 |
---|---|
作业要求 | 查重系统 |
作业目标 | 实现论文查重 |
该项目的GitHub仓库链接
本系统采用scanner输入器输入文本路径和查重文本路径,最后控制台输出查重率
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | |
Estimate | 估计这个任务需要多少时间 | 40 | |
Development | 开发 | 720 | |
Analysis | · 需求分析 (包括学习新技术) | 60 | |
Design Spec | 生成设计文档 | 120 | |
Design Review | 设计复审 | 20 | |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | |
Design | 具体设计 | 110 | |
Coding | 具体编码 | 360 | |
Code Review | 代码复审 | 40 | |
Test | · 测试(自我测试,修改代码,提交修改) | 120 | |
Reporting | 报告 | 25 | |
Test Repor | · 测试报告 | 25 | |
Size Measurement | 计算工作量 | 25 | |
Postmortem & Process improvement Plan | 事后总结,并提出过程改进计划 | 50 | |
合计 | 1745 |
思路
打算先从目标文本中读取文件,将文件转换为字符串类型存储在List中,最后在通过算法实现查重比对
1.接口设计
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
public class FileToString {
public String fileToString(String File) throws IOException {
String paperContent = FileUtils.readFileToString(new File(File), "UTF-8");
return paperContent;
}
}
通过此方法输入两个文本路径
public String preprocess(String content) {
// TODO: 实现论文内容的预处理操作
return return content.replaceAll("[\\p{Punct}]", "");
}
通过此方法接收文本,并且采用正则表达式进行去除标点符号的操作
点击查看代码
public double calculateSimilarity(String paperContent, String databaseContent) {
JaccardSimilarity js=new JaccardSimilarity();
return js.apply(paperContent, databaseContent);
}
点击查看代码
public static void main(String[] args) {
try {
// 读取待检测的论文内容
String paperContent = FileUtils.readFileToString(new File("C:/Users/86157/Desktop/orig.txt"), "UTF-8");
// 读取数据库中的论文内容
String databaseContent = FileUtils.readFileToString(new File("C:/Users/86157/Desktop/orig_0.8_add.txt"), "UTF-8");
// 预处理论文内容(例如去除标点符号、停用词等)
String processedPaperContent = preprocess(paperContent);
String processedDatabaseContent = preprocess(databaseContent);
// 计算相似度
double similarityScore = calculateSimilarity(processedPaperContent, processedDatabaseContent);
System.out.println(similarityScore);
} catch (IOException e) {
e.printStackTrace();
}
}
2.单元测试
点击查看代码
ackage com.example.demo;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class calculateSimilarityTest {
private calculateSimilarity CalculateSimilarity=new calculateSimilarity();
@Test
public void testCalculateSimilarity(){
double a=CalculateSimilarity.CalculateSimilarity("fadukhu","vihauhkl");
System.out.println(a);
}
}
点击查看代码
package com.example.demo;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class preprocessTest {
private preprocess pr=new preprocess();
@Test
public void testpreprocess(){
String a=pr.preprocess("GAFILHJ,VIUDALJ...");
System.out.println(a);
}
}
点击查看代码
import java.io.IOException;
import java.util.Scanner;
import com.example.demo.calculateSimilarity;
import com.example.demo.preprocess;
public class search {
public static void main(String[] args) {
try {
// 读取待检测的论文内容
System.out.println("请输入文件路径");
Scanner sc=new Scanner(System.in);
String paperContents= sc.next();
System.out.println("请输入查重文件路径");
String databaseContents=sc.next();
FileToString file=new FileToString();
String paperContent=file.fileToString(paperContents);
String databaseContent= file.fileToString(databaseContents);
// 读取数据库中的论文内容
preprocess Preprocess = new preprocess();
calculateSimilarity CalculateSimilarity=new calculateSimilarity();
// 预处理论文内容(例如去除标点符号、停用词等)
String processedPaperContent = Preprocess.preprocess(paperContent);
String processedDatabaseContent = Preprocess.preprocess(databaseContent);
// 计算相似度
double similarityScore = CalculateSimilarity.CalculateSimilarity(processedPaperContent, processedDatabaseContent);
System.out.println(similarityScore);
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.异常处理
主要异常来源于文件读取,用throw抛出异常。且输入文件路径的格式出错时也会报错