Github链接
https://github.com/lsw11322/lsw11322/tree/main/3121004744/paper_check
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/CSGrade21-12 |
|---|---|
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/CSGrade21-12/homework/13014 |
| 这个作业的目标 | 实现论文查重,学会编写测试单元 |
PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 20 | 30 |
| · Estimate | · 估计这个任务需要多少时间 | 20 | 30 |
| Development | 开发 | 530 | 590 |
| · Analysis | · 需求分析 (包括学习新技术) | 90 | 120 |
| · Design Spec | · 生成设计文档 | 20 | 10 |
| · Design Review | · 设计复审 | 30 | 20 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
| · Design | · 具体设计 | 60 | 60 |
| · Coding | · 具体编码 | 180 | 150 |
| · Code Review | · 代码复审 | 20 | 20 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 120 | 200 |
| Reporting | 报告 | 130 | 180 |
| · Test Report | · 测试报告 | 60 | 90 |
| · Size Measurement | · 计算工作量 | 30 | 30 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 40 | 60 |
| ·合计 | 680 | 820 |
模块接口设计与实现过程
- 接口设计

| 函数 | 功能 |
|---|---|
| Sring readTxt(String txtPath) | 传入文本路径,用字符串返回文本内容 |
| void writeTxt(double sim, String txtPath) | 传入相似度以及文本路径,将相似度的值输出到文本 |
| String getHash(String str) | 传入字符串,返回字符串对应Hash值 |
| String getSimHash(String str) | 传入字符串,返回字符串对应SimHash值 |
| int getHammingDistance(String simHash1, String simHash2) | 传入两文本的SimHash值,返回海明距离 |
| double getSimilarity(int distance) | 传入海明距离,返回两文本相似度 |
- 关键函数流程图

性能分析
-
性能分析图


-
改进思路
由上图知,外部包提供的类被频繁调用,因此可以选择性能更好的外部包分词器
模块部分单元测试展示
-
测试覆盖率

-
HammingUtils类测试
public class HammingUtilsTest {
@Test
public void getHammingDistance() {
String str0 = IOUtils.readTxt("D:\\SoftwareProject\\hk1\\src\\main\\resources\\orig.txt");
String str1 = IOUtils.readTxt("D:\\SoftwareProject\\hk1\\src\\main\\resources\\orig_0.8_add.txt");
int distance = HammingUtils.getHammingDistance(SimHashUtils.getSimHash(str0), SimHashUtils.getSimHash(str1));
System.out.println("海明距离:" + distance);
}
@Test
//获取海明距离失败测试
public void getHammingDistanceFailTest() {
String str0 = "1010101010";
String str1 = "1010101";
System.out.println(HammingUtils.getHammingDistance(str0, str1));
}
@Test
public void getSimilarityTest() {//测试getSimilarity
String str0 = IOUtils.readTxt("D:\\SoftwareProject\\hk1\\src\\main\\resources\\orig.txt");
String str1 = IOUtils.readTxt("D:\\SoftwareProject\\hk1\\src\\main\\resources\\orig_0.8_add.txt");
int distance = HammingUtils.getHammingDistance(SimHashUtils.getSimHash(str0), SimHashUtils.getSimHash(str1));
double similarity = HammingUtils.getSimilarity(distance);
System.out.println("str0和str1的汉明距离: " + distance);
System.out.println("str0和str1的相似度:" + similarity);
}
}
- 测试结果

异常处理说明
- 异常处理
//读取文件内容并返回装有内容的字符串
public static String readTxt(String txtPath){
StringBuilder str = new StringBuilder();
String strLine;
// 将 txt文件按行读入 str中
File file = new File(txtPath);
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(file);
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
// 字符串拼接
while ((strLine = bufferedReader.readLine()) != null) {
str.append(strLine);
}
// 关闭资源
inputStreamReader.close();
bufferedReader.close();
fileInputStream.close();
} catch (IOException e) {
//打印异常信息
e.printStackTrace();
}
return str.toString();
}
- 单元测试样例
@Test
//测试IOUtils类能否在读入路径不存在的文件时抛出异常信息
public void readTxtFailTest() {
String str = IOUtils.readTxt("D:\\SoftwareProject\\hk1\\src\\test\\resources\\meiyou.txt");
}
- 测试结果
