作业所属班级 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024 备注
作业要求 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering2024/homework/13136
作业目标 实现查重功能,学会PSPA表格
  • psp表格
PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 90 90
· Estimate · 估计这个任务需要多少时间 10 16
Development 开发 360 450
· Analysis · 需求分析 (包括学习新技术) 100 60
· Design Spec · 生成设计文档 18 40
· Design Review · 设计复审 10 5
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 20 5
· Design · 具体设计 40 60
· Coding · 具体编码 125 60
· Code Review · 代码复审 20 15
· Test · 测试(自我测试,修改代码,提交修改) 60 60
Reporting 报告 40 45
· Test Repor · 测试报告 20 30
· Size Measurement · 计算工作量 10 5
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 10 10
合计 835 680 951
  • 需求分析
    题目:论文查重

描述如下:

设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。

原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:

从命令行参数给出:论文原文的文件的绝对路径。
从命令行参数给出:抄袭版论文的文件的绝对路径。
从命令行参数给出:输出的答案文件的绝对路径。
我们提供一份样例,课堂上下发,上传到班级群,使用方法是:orig.txt是原文,其他orig_add.txt等均为抄袭版论文。

注意:答案文件中输出的答案为浮点型,精确到小数点后两位

  • 程序执行顺序
  • 主要算法(simHash算法)
    1.分词
    2.Hash
    3.加权
    4.合并
    5.降维
    简单的说,海明距离可以理解为,两个二进制串之间相同位置不同值的个数。举个例子,[1,1,1,0,0,0]和[1,1,1,1,1,1]的海明距离就是3。

在处理大规模数据的时候,我们一般使用64
位的SimHash,正好可以被一个long型存储。这种时候,海明距离在3以内就可以认为两个文本是相似的。

  • 单元测试
    原文为orig.txt,抄袭文本为所有txt文本;测试两次
    package se.test;

import org.testng.annotations.Test;
import se.main.Hamming;
import se.main.SimHash;
import se.main.TXT_IO;

public class A_main_test
{

@Test
public void origAndDelTest(){
    String str0 = TXT_IO.readTxt("txt/orig.txt");
    String str1 = TXT_IO.readTxt("txt/orig_0.8_del.txt");
    String ansFileName = "txt/ansAndDelTest.txt";
    double ans = Hamming.getSimilarity(SimHash.getSimHash(str0), SimHash.getSimHash(str1));
    System.out.println("查重率:"+ans*100+"%");
    TXT_IO.writeTxt(ans, ansFileName);
}





@Test
public void origAndDis15Test(){
    String str0 = TXT_IO.readTxt("txt/orig.txt");
    String str1 = TXT_IO.readTxt("txt/orig_0.8_dis_15.txt");
    String ansFileName = "txt/ansAndDis15Test.txt";
    double ans = Hamming.getSimilarity(SimHash.getSimHash(str0), SimHash.getSimHash(str1));
    System.out.println("查重率:"+ans*100+"%");
    TXT_IO.writeTxt(ans,ansFileName);
}

}

  • 测试结果


  • 程序分析
    该程序不适合短文本的查重,对于核心算法也不够精确,容易产生误差