论文查重

这个作业属于哪个课程 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 值并返回它们之间的海明距离。
  1. 函数关系
    Main 类的 main 方法是程序的起点,它首先调用 Txt_IO.checkTxt 两次来读取两个文件的内容,然后调用 SimHash.getSimHash 两次来生成这两个文本的 SimHash 值,接着调用 Hamming.getHammingDistance 来计算这两个 SimHash 值之间的海明距离,并将这个距离转换为相似度(,最后调用 Txt_IO.writeTxt 将相似度写入文件。

算法分析

SimHash 算法:用于将文本内容转换为一个固定长度的哈希值,这个哈希值能够反映文本内容的主要特征,并且对于相似的内容,其哈希值也会比较接近。SimHash 的独到之处在于它能够有效地捕捉文本之间的相似性,同时保持较高的计算效率和较低的存储需求。

改进思路

优化SimHash算法,可以通过减少哈希长度来降低计算复杂度,同时保持足够的区分度,其次,用更高效的数据结构或算法来存储和计算这些特征。

测试数据的构造思路

  1. 相同文本:测试两个完全相同的文本,相似度应为1.0或非常接近1.0
  2. 相似文本:测试两个相似的文本,以验证它们之间的相似度是否高于不相似的文本
  3. 不同文本:测试两个完全不同的文本,以验证它们之间的相似度是否很低
  4. 空文本:测试两个空字符串,以验证空文本是否被视为完全相同

流程设计

测试覆盖率

部分测试代码

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
posted @ 2024-09-12 11:30  静安Chow  阅读(37)  评论(0编辑  收藏  举报