这个作业属于哪个课程 | 2022计科12班 |
---|---|
这个作业要求在哪里 | 个人项目 |
这个作业的目标 | 完成论文查重程序的基本设计 |
Github仓库链接:https://github.com/JinganCafe/paper_pass
模块设计
- 类
- Main:程序的入口点,包含 main 方法,用于处理命令行参数,调用其他类的方法来完成任务。
- Txt_IO:负责文件的读写操作。它至少包含两个静态方法:readTxt(String filePath) 用于读取文件内容并返回字符串,writeTxt(String content, - String filePath) 用于将字符串写入文件。
- SimHash:负责生成文本的 SimHash 值。它包含一个静态方法:getSimHash(String text),该方法接受一个字符串并返回该文本的 SimHash 值。
- Hamming:负责计算两个 SimHash 值之间的海明距离。它至少包含一个静态方法:getHammingDistance(String hash1, String hash2),该方法接受两个 SimHash 值并返回它们之间的海明距离。
- 函数关系
Main 类的 main 方法是程序的起点,它首先调用 Txt_IO.checkTxt 两次来读取两个文件的内容,然后调用 SimHash.getSimHash 两次来生成这两个文本的 SimHash 值,接着调用 Hamming.getHammingDistance 来计算这两个 SimHash 值之间的海明距离,并将这个距离转换为相似度(,最后调用 Txt_IO.writeTxt 将相似度写入文件。
算法分析
SimHash 算法:用于将文本内容转换为一个固定长度的哈希值,这个哈希值能够反映文本内容的主要特征,并且对于相似的内容,其哈希值也会比较接近。SimHash 的独到之处在于它能够有效地捕捉文本之间的相似性,同时保持较高的计算效率和较低的存储需求。
改进思路
优化SimHash算法,可以通过减少哈希长度来降低计算复杂度,同时保持足够的区分度,其次,用更高效的数据结构或算法来存储和计算这些特征。
测试数据的构造思路
- 相同文本:测试两个完全相同的文本,相似度应为1.0或非常接近1.0
- 相似文本:测试两个相似的文本,以验证它们之间的相似度是否高于不相似的文本
- 不同文本:测试两个完全不同的文本,以验证它们之间的相似度是否很低
- 空文本:测试两个空字符串,以验证空文本是否被视为完全相同
流程设计
测试覆盖率
部分测试代码
package org.example;
import org.junit.Test;
import java.io.*;
import static org.junit.Assert.*;
public class Txt_IOTest {
@Test
public void testCheckTxt() {
String testFilePath = "F:/test/TestTxt/test.txt";
// 确保测试文件存在,并包含一些内容
try (FileWriter writer = new FileWriter(testFilePath)) {
writer.write("Hello, World!");
} catch (IOException e) {
fail("测试文件创建失败: " + e.getMessage());
}
// 调用 checkTxt 方法并验证结果
String content = Txt_IO.checkTxt(testFilePath);
if (content == "Hello, World!") {
System.out.println("创建文件并写入成功");
}
// 清理测试文件
new File(testFilePath).delete();
}
@Test
public void testWriteTxt() {
// 准备测试文件路径
String testFilePath = "F:/test/TestTxt/test_write.txt";
// 调用 writeTxt 方法
Txt_IO.writeTxt(123.456, testFilePath);
// 验证文件内容
try (BufferedReader reader = new BufferedReader(new FileReader(testFilePath))) {
String line = reader.readLine();
assertNotNull(line);
if (line != null && line.contains("123.4")) {
// 如果包含"123.4",则测试通过
// 但为了示例,我们可以打印一条消息
System.out.println("测试成功:行内包含'123.4'");
} else {
// 如果不包含"123.4",则测试失败
// 这里可以抛出一个异常来模拟测试失败,但通常我们会使用断言
// 或者记录错误、设置标志等
System.out.println("测试失败:行不包含“123.4”");
}
} catch (IOException e) {
fail("读取测试文件失败: " + e.getMessage());
}
new File(testFilePath).delete();
}
}
结果展示
PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 25 |
·Estimate | ·估计这个任务需要多少时间 | 130 | 120 |
Development | 开发 | 100 | 120 |
·Analysis | ·需求分析(包括学习新技术) | 10 | 10 |
·Design Spec | ·生成设计文档 | 10 | 20 |
·Design Review | ·设计复审 | 5 | 15 |
·Coding Standard | ·代码规范(为目前的开发制定合适的规范) | 5 | 5 |
·Design | ·具体设计 | 75 | 88 |
·Coding | ·具体编码 | 100 | 120 |
·Code Review | ·代码复审 | 20 | 20 |
·Test | ·测试(自我测试,修改测试,提交测试) | 10 | 10 |
Reporting | 报告 | 30 | 45 |
·Test Repor | ·测试报告 | 20 | 30 |
·Size Measurement | ·计算工作量 | 20 | 20 |
·Postmorterm&Process Improvement Plan | ·事后总结,并提出过程改进计划 | 30 | 26 |
合计 | 595 | 674 |