第一次个人编程作业

这个作业属于哪个课程 计科22级12班
这个作业要求在哪里 个人项目
这个作业的目标 尝试开发一个论文查重的项目,并进行单元测试

作业github链接

1|0需求分析

题目:论文查重

描述如下:

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

  • 原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
  • 抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。

要求输入输出采用文件输入输出,规范如下:

  • 命令行参数给出:论文原文的文件的绝对路径
  • 命令行参数给出:抄袭版论文的文件的绝对路径
  • 命令行参数给出:输出的答案文件的绝对路径

我们提供一份样例,课堂上下发,上传到班级群,使用方法是:orig.txt是原文,其他orig_add.txt等均为抄袭版论文。

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

2|0PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 10 10
· Estimate · 估计这个任务需要多少时间 10 10
Development 开发 760 821
· Analysis · 需求分析 (包括学习新技术) 60 36
· Design Spec · 生成设计文档 60 40
· Design Review · 设计复审 20 10
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 10 15
· Design · 具体设计 60 50
· Coding · 具体编码 300 360
· Code Review · 代码复审 30 30
· Test · 测试(自我测试,修改代码,提交修改) 120 200
Reporting 报告 40 30
· Test Repor · 测试报告 20 20
· Size Measurement · 计算工作量 20 10
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 20 20
· 合计 770 831

3|0接口的设计与实现

1|0代码组织

  • 项目结构
作用
Main.java 提供程序入口,调用其他类
File_IO.java 读写文件
SimHash.java 计算simHash值
Hamming.java 计算相似度
ShortStringException.java 文章过短时的异常处理

1|0算法关键

该程序运用了SimHash算法,利用海明距离比较内容之间的相似度。SimHash是用来处理海量文本去重的算法。主要思想是降维,算出海明距离来确定文本的相似度,海明距离越小,相似度越低。

4|0性能分析

1|0总览

1|0方法调用次数

5|0单元测试展示

1|0测试Main

点击查看代码
class MainTest { /** * 测试原文件和其他抄袭文件(包括自己)的相似度 */ @Test public void origAndOrigTest(){ String str0 = File_IO.readFile("D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\orig.txt"); String str1 = File_IO.readFile("D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\orig.txt"); String ansFileName = "D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\ansAndOrigTest.txt"; double ans = Hamming.getSimilarity(SimHash.getSimHash(str0), SimHash.getSimHash(str1)); System.out.println("查重率:"+ans*100+"%"); File_IO.writeFile(ans, ansFileName); } @Test public void origAndAddTest(){ String str0 = File_IO.readFile("D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\orig.txt"); String str1 = File_IO.readFile("D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\orig_0.8_add.txt"); String ansFileName = "D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\ansAndAddTest.txt"; double ans =Hamming.getSimilarity(SimHash.getSimHash(str0), SimHash.getSimHash(str1)); System.out.println("查重率:"+ans*100+"%"); File_IO.writeFile(ans, ansFileName); } @Test public void origAndDelTest(){ String str0 = File_IO.readFile("D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\orig.txt"); String str1 = File_IO.readFile("D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\orig_0.8_del.txt"); String ansFileName = "D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\ansAndDelTest.txt"; double ans = Hamming.getSimilarity(SimHash.getSimHash(str0), SimHash.getSimHash(str1)); System.out.println("查重率:"+ans*100+"%"); File_IO.writeFile(ans, ansFileName); } @Test public void origAndDis1Test(){ String str0 = File_IO.readFile("D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\orig.txt"); String str1 = File_IO.readFile("D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\orig_0.8_dis_1.txt"); String ansFileName = "D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\ansAndDis1Test.txt"; double ans = Hamming.getSimilarity(SimHash.getSimHash(str0), SimHash.getSimHash(str1)); System.out.println("查重率:"+ans*100+"%"); File_IO.writeFile(ans, ansFileName); } @Test public void origAndDis10Test(){ String str0 = File_IO.readFile("D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\orig.txt"); String str1 = File_IO.readFile("D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\orig_0.8_dis_10.txt"); String ansFileName = "D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\ansAndDis10Test.txt"; double ans = Hamming.getSimilarity(SimHash.getSimHash(str0), SimHash.getSimHash(str1)); System.out.println("查重率:"+ans*100+"%"); File_IO.writeFile(ans, ansFileName); } @Test public void origAndDis15Test(){ String str0 = File_IO.readFile("D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\orig.txt"); String str1 = File_IO.readFile("D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\orig_0.8_dis_15.txt"); String ansFileName = "D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\ansAndDis15Test.txt"; double ans = Hamming.getSimilarity(SimHash.getSimHash(str0), SimHash.getSimHash(str1)); System.out.println("查重率:"+ans*100+"%"); File_IO.writeFile(ans,ansFileName); } }

1|0测试读写文件File_IO

点击查看代码
class File_IOTest { /** * 正常读写情况 */ @Test void testReadFile() { // 路径存在,正常读取 String str = readFile("D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\orig.txt"); String[] strings = str.split(" "); for (String string : strings) { System.out.println(string); } } @Test void testWriteTxt() { // 路径存在,正常写入 double[] elem = {0.1, 0.2, 0.3, 0.4, 0.5}; for (int i = 0; i < elem.length; i++) { writeFile(elem[i], "D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\ansAndOrigTest.txt"); } } /** * 异常读情况 */ @Test public void readTxtFailTest() { // 路径不存在,读取失败 String str = readFile("D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\nullTest.txt"); } }

1|0测试SimHash

点击查看代码
class SimHashTest { /** * 测试GetHash */ @Test void testGetHash() { String[] strings = {"你", "好", "GDUT", "我爱编程", "软件工程"}; for (String string : strings) { String stringHash = SimHash.getHash(string); System.out.println(stringHash.length()); System.out.println(stringHash); } } /** * 测试GetSimHash */ @Test void testGetSimHash() { String str0 = File_IO.readFile("D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\orig.txt"); String str1 = File_IO.readFile("D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\orig_0.8_add.txt"); System.out.println(SimHash.getSimHash(str0)); System.out.println(SimHash.getSimHash(str1)); } }

1|0测试Hamming

点击查看代码
class HammingTest { /** * 测试GetHammingDistance正常情况 */ @Test void testGetHammingDistance() { String str0 = File_IO.readFile("D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\orig.txt"); String str1 = File_IO.readFile("D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\orig_0.8_add.txt"); int distance = Hamming.getHammingDistance(SimHash.getSimHash(str0), SimHash.getSimHash(str1)); System.out.println("海明距离:" + distance); System.out.println("相似度: " + (100 - distance * 100 / 128) + "%"); } /** * 测试GetHammingDistance异常情况 */ @Test void testGetHammingDistanceFail() { String str0 = "1010"; String str1 = "1111"; System.out.println(Hamming.getHammingDistance(str0, str1)); } /** * 测试GetSimilarity */ @Test void testGetSimilarity() { String str0 = File_IO.readFile("D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\orig.txt"); String str1 = File_IO.readFile("D:\\LJun521\\3222004682\\论文查重\\src\\测试文本\\orig_0.8_add.txt"); int distance = Hamming.getHammingDistance(SimHash.getSimHash(str0), SimHash.getSimHash(str1)); double similarity = Hamming.getSimilarity(SimHash.getSimHash(str0), SimHash.getSimHash(str1)); System.out.println("str0和str1的海明距离: " + distance); System.out.println("str0和str1的相似度:" + similarity); } }

1|0代码覆盖率


__EOF__

本文作者LLLLJun
本文链接https://www.cnblogs.com/LLLLJ/p/18403620.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   LLLLJun  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示