个人项目—论文查重

news/2024/9/18 3:48:28/文章来源:https://www.cnblogs.com/tanliye/p/18409192

个人项目———论文查重

这个作业属于哪个课程 计科12班
这个作业的要求在哪里 作业要求
这个作业的目标 实现论文查重,给定原文件和抄袭的文件,输出二者的相似度到答案文件中

GitHub链接:github

1.题目要求

题目:论文查重

描述如下:

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

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

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

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

2.项目开发

2.1开发环境:

语言:JAVA

编译器:JDk-21

工具:IntelliJ IDEA

2.2项目结构

2.3项目模块介绍

  • Abnormal---------处理各种异常类
  • calcuture_Utils--主要算法的实现
  • In_Out_Utils-----文件的输入和输出
  • main-------------启动类主函数
  • test-------------对其他各种类的测试

2.4项目的设计与实现过程(流程图)

2.5主要算法

①simhash算法:使用HanLP从文本中提取关键词,并储存在列表,遍历列表的关键词,使用MD5算法对每个关键词计算hash值,并对结果进行加权,与减权处理,再通过降维处理得到文本的simhash值。

实现代码:

点击查看代码
public class Calculate_SimHash {public static String gethash(String text){try {//首先创建对象,指定使用MD5算法MessageDigest messageDigest = MessageDigest.getInstance("MD5");//将字符串转换为UTF-8编码的字节数组,计算哈希值,以二进制字符串形式返回return new BigInteger(1, messageDigest.digest(text.getBytes(StandardCharsets.UTF_8))).toString(2);}catch (Exception e){//抛出异常throw new RuntimeException("操作失败",e);}}//设计方法——计算文本的simHash值public static String getSimHash(String text) throws Abnormal_TextShort {//验证文本是否过短,过短则抛出异常if(text.length() < 100) throw new Abnormal_TextShort("文本长度过短");//初始化整形数组作为特征向量int[] eigenvector = new int[128];//使用HanLP从文本中提取关键词,并储存在列表中List<String> keywords = HanLP.extractKeyword(text, text.length());int size = keywords.size();System.out.println("关键字的数量:" + size);int i = 0;//初始化一个计数器//遍历每个关键词,根据权重调整for(String keyword : keywords){//获取关键词的Hash值,并将其转换为一个对象//System.out.println(keyword);//System.out.println(gethash(keyword));StringBuilder keywordHash = new StringBuilder(gethash(keyword));//如果关键字的哈希值长度小于128,则在默末尾用0补齐if(keywordHash.length() < 128){int temp = 128 - keywordHash.length();for(int j = 0; j < temp; j++){keywordHash.append("0");}}//加权for(int j = 0; j < eigenvector.length; j++){//如果当前位是1,则根据位置进行加权,否则根据位置减权if(keywordHash.charAt(j) == '1'){eigenvector[j] += (10 - (i / (size / 10)));}else{eigenvector[j] -= (10 - (i / (size / 10)));}}i++;}//遍历特征向量每个元素根据正负值来构建转化为SimHashStringBuilder simHash = new StringBuilder();for(int element : eigenvector){simHash.append(element > 0 ? "1" : "0");//System.out.println(element);}return simHash.toString();}
}
②similarity算法:对于得到的两个文本的simhash值,计算二者的海明距离,并通过海明距离代入公式得到进计算相似度。

实现代码:

点击查看代码
package com.Calculate_Utils;public class Calculate_Similarity {public static int getHammingDistance(String simHash1, String simHash2){//设计方法——通过hash值来计算海明距离int Haiming_distance = 0;if(simHash1.length()!=simHash2.length()){return -1;} else {for(int i = 0; i < simHash1.length(); i++){//循环比较二者的字符if(simHash1.charAt(i) != simHash2.charAt(i)) {//遍历二者字符,如果不同,距离加一Haiming_distance += 1;}}}System.out.println("海明距离为:" + Haiming_distance);//输出海明距离return Haiming_distance;}public static double getSimilarity(String simHash1, String simHash2){//计算海明距离int distance = getHammingDistance(simHash1, simHash2);//通过海明距离计算相似度System.out.println("相似度为:" + (100 - (double)(distance * 100) / 128));return (100 - (double)(distance * 100) / 128);}
}

2.6异常处理

本项目对三种异常进行捕捉处理分别为:
①读取和写入文件发生错误的异常。
②提供路径参数小于三个(即原文件,抄袭文件,答案文件)的异常。
③输入的文本过短的异常。

3.项目类测试

3.1读文件File_Input.java的测试

测试结果:

3.2写文件File_Output.java的测试

测试结果:


3.3simhash算法的测试

测试结果:

3.4主函数main.java的测试

测试结果:


3.5传入的参数过少的异常测试

测试结果:

3.6文本过短的异常测试

测试结果:

3.7文件不存在的异常测试

测试结果:

4.性能分析(本项目采用了JProfiler来分析)


5.PSP表格

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/795765.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一款用于Redis漏洞的利用工具

Hack分享吧声明 该公众号分享的安全工具和项目均来源于网络,仅供安全研究与学习之用,如用于其他用途,由使用者承担全部法律及连带责任,与工具作者和本公众号无关。工具介绍 @yuyan-sec使用golang写的一款Redis漏洞利用工具。 注意:主从复制会清空数据,主从复制会清空数据…

AGC007F Shik and Copying String

涉及知识点:Ad-hoc,贪心 题意 Link 给出两个长度相同的字符串 \(S,T\),定义一次操作为: 从头至尾处理每一位,每位可以变成上一位,或者不变。 求最少对 \(S\) 进行多少次操作使得 \(S=T\)。 思路 引理 可以发现,一次操作其实类似于选择一些点 \(l\),从左到右覆盖它后面的…

全网最适合入门的面向对象编程教程:47 Python函数方法与接口-回调函数Callback

回调函数是编程中一种非常常见的模式,用于将函数作为参数传递给其他函数或方法。这种模式在 Python 中广泛应用于事件处理、异步编程、函数式编程等场景。全网最适合入门的面向对象编程教程:47 Python 函数方法与接口-回调函数 Callback摘要: 回调函数是编程中一种非常常见的…

如何把一个吃灰的 Kindle 设置成一个墨水屏幕的时钟 All In One

如何把一个吃灰的 Kindle 设置成一个墨水屏幕的时钟 All In One Kindle 电子书如何把一个吃灰的 Kindle 设置成一个墨水屏幕的时钟 All In OneKindle 电子书https://www.bilibili.com/video/BV1nY4y1e7gC/?t=375 demosKindle Paperwhite 7 电子书阅读器(4GB)Kindle Paperwhi…

基于小波神经网络的数据分类算法matlab仿真

1.程序功能描述 基于小波神经网络的数据分类算法。输入为5个特征值,输出为判断(是,否)。拿50组数据对本算法作为训练组,后30组数据作为验证组。这里,我们首先调用数据,然后对50组数据进行训练,然后对30组数据进行识别测试。 2.测试软件版本以及运行结果展示MATL…

基于GWO灰狼优化的CNN-LSTM的时间序列回归预测matlab仿真

1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)LR = Alpx(1); numHiddenUnits1 = floor(Alpx(2))+1;% 定义隐藏层中LSTM单元的数量 numHiddenUnits2 = floor(Alpx(3)…

代码整洁之道--读书笔记(8)

代码整洁之道简介: 本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更…

java学习9.11

IDEA里导入mybatis,lombok等依赖成功连接好数据库。 并将MYSQL数据库同时用navicat连接便利创建表等操作。设计实体类student并在数据库设计好表接下来就是如何实现在数据库里的增删改查 设计接口类mapper,将操作简化最后能正常运行实现功能。 总的来说这一块内容,刚开始学,…

LOJ4222 「IOI2024」马赛克上色 题解

题目描述 给定长为 \(n\) 、下标从零开始的 \(01\) 序列 \(x,y\) ,保证 \(x_0=y_0\) 。 令 \(col_{0,j}=x_j,col_{i,0}=y_i\) ,对 \(\forall 1\le i\lt n,1\le j\lt n\) , \(col_{i,j}=[col_{i-1,j}=0\and col_{i,j-1}=0]\) 。 \(q\) 次询问,给定 \(u,d,l,r\) ,求 \(\sum_…

2024 必收藏✨免费手机铃声下载网站大公开

最推荐的方式,当然是在线网站了。1.北岛铃声网 https://www.beidaols.cn/优点:免费下载:用户可以免费获取各种手机铃声,无需支付费用。 铃声多样:提供了丰富的铃声选择,满足不同用户的个性化需求。 教程详细:提供了详细的设置苹果铃声的教程,对于不熟悉苹果手机设置的…

原神蒙德-Typora模板

基于Newsprint主题开发的一种Typora模板新建模板 打开Typora - 文件 - 偏好设置 - 外观 - 打开主题文件夹 找到其中的 Newsprint (应该有一个文件夹+一个css,都要) ,拷贝副本,重命名(我命名的是“custom”),一定要这一步,不然后期更新的时候会覆盖 修改 打开其中的 cu…

学习日历-2024/9/11

LinkList集合 底层数据结构时双链表,查询慢,首尾操作的速度是极快的,所以多了很多的首尾操作在使用迭代器或者增强for循环遍历集合的过程中,不要使用集合的方法去添加或者删除元素即可 SQL DML-添加数据 1.给指定字段添加数据 INSERT INTO 表名(字段名1,字段名2,...) VALUES(值…