首页 > 编程语言 >个人项目:Java实现论文查重

个人项目:Java实现论文查重

时间:2023-09-14 19:55:23浏览次数:62  
标签:查重 Java double 论文 List 文档 words IDF public

Java实现简易论文查重

软件工程 https://edu.cnblogs.com/campus/gdgy/CSGrade21-12
作业要求 个人项目
作业目标 学习PSP表格,简易实现论文查重功能
github链接 https://github.com/HelpmeOOUT/RWL/tree/main/3121005006

PSP

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

需求

题目:论文查重

描述如下:

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

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

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

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

模块接口

算法模块

方法 说明
public class TfIdf 计算文本中词集的Tf(词频),Idf(逆文本频率指数),及Tf-Idf并以数组形式返回
public class CosAlgorithm implements CheckAlgorithm 使用余弦定理计算相似度

具体代码
TfIdf算法
TF指词语在文档中出现的频率,即该词语在文档中出现的次数除以文档的总词语数。TF的值越大,表示词语在文档中的重要性越高。

IDF指词语的逆文档频率,即该词语在整个文档集中出现的频率的倒数。IDF的值越大,表示词语在整个文档集中的重要性越低。

TF-IDF的计算公式为 TF-IDF = TF * IDF。通过计算词语在文档中的TF值和在整个文档集中的IDF值,可以得到词语的TF-IDF值。TF-IDF值越大,表示该词语在当前文档中的重要性越高,并且在整个文档集中的共性越低。

public class TfIdf {

public static double countTf(String word, List<String> words){int tf = 0;
    for (String s:words) {
        tf += word.equals(s) ? 1 : 0;
    }
    return tf;
}


public static List<Double> countTfs(List<String> words){
    ArrayList<Double> tfs = new ArrayList<>();
    for (String s:words) {
        tfs.add(countTf(s, words));
    }
    return tfs;
}


public static double countIdf(String word, List<List<String>> papers){
    double paperContainingWord = 0;
    for(List<String> words : papers) {
        paperContainingWord += words.contains(word) ? 1 : 0;
    }
    return Math.log(papers.size() / paperContainingWord);
}


public static List<Double> countIdfs(List<String> words, List<List<String>> papers){
    List<Double> idfs = new ArrayList<>();
    for(String word : words) {
        idfs.add(countIdf(word, papers));
    }
    return idfs;
}


public static double countTfIdf(double tf, double idf){
    return tf * idf;
}


public static List<Double> countTfIdfs(List<String> words, List<List<String>> papers){
    List<Double> tfIdfs = new ArrayList<>();

    List<Double> tfs = countTfs(words);
    List<Double> idfs = countIdfs(words, papers);
    for(int i=0;i<tfs.size();i++){
        tfIdfs.add(TfIdf.countTfIdf(tfs.get(i), idfs.get(i)));
    }
    return tfIdfs;
}
}

余弦相似度算法
在文本相似度计算中,通常将文本表示为词频向量或TF-IDF向量,然后使用余弦定理相似度来计算文本之间的相似度。通过比较不同文本之间的相似度,可以实现文本匹配、推荐系统和文本聚类等任务。

public class CosAlgorithm implements CheckAlgorithm {
    public double check() {
    return 0;
}


public double check(List<Double> v1, List<Double> v2){
    //点积
    double dotProduct = 0.0;
    double normA = 0.0;
    double normB = 0.0;
    for (int i = 0; i < Math.min(v1.size(), v2.size()); i++) {
        dotProduct += v1.get(i) * v2.get(i);
        normA += Math.pow(v1.get(i), 2);
        normB += Math.pow(v2.get(i), 2);
    }
    //模积
    double magnitude = (Math.sqrt(normA) * Math.sqrt(normB));
    return magnitude-0<0.0000001 ? 1 : dotProduct / magnitude;
}
}

运行结果

原文

copy

结果

模块接口部分的性能改进



调用最多的是分词依赖相关的char[]和分词后的处理String

模块部分异常处理说明

标签:查重,Java,double,论文,List,文档,words,IDF,public
From: https://www.cnblogs.com/HelpmeOOUT/p/17698864.html

相关文章

  • java功能需要
    1.上传图片功能需要pom文件阿里云oss依赖<!--阿里云oss文件存储依赖--><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version></dependency>app......
  • Java生成Json字符串
    publicclassTest01{publicstaticvoidmain(String[]args){//StringBuilderresponseMsg=newStringBuilder();//responseMsg.append("");//responseMsg.append("");//System.out.println(responseMsg.leng......
  • 无涯教程-JavaScript - IF函数
    描述如果条件为TRUE,则IF函数返回一个值,如果条件为FALSE,则返回另一个值。语法IF(logical_test,value_if_true,[value_if_false])争论Argument描述Required/Optionallogical_testTheconditionyouwanttotest.Requiredvalue_if_trueThevaluethatyouwan......
  • 【Java入门】交换数组中两个元素的位置
    在Java中,交换数组中的两个元素是基本的数组操作。下面我们将详细介绍如何实现这一操作,以及在实际应用中这种技术的重要性。一、使用场景在编程中,我们经常需要交换数组中的两个元素。例如,当我们需要对数组进行排序或者在某种算法中需要交换元素的位置。这种操作在数据结构、算法、......
  • 如何写论文的 abstract摘要和introduction背景介绍
    摘要是题目的扩展、简介是摘要的扩展、正文是简介的扩展,逻辑紧密,环环紧扣。无论是摘要、简介还是正文,围绕的核心都是一个点:题目,突出的是工作内容+创新点。其实无论是核心还是sci,写科技文就像是写八股文,套路都是一样的。下面提供一点写摘要和背景介绍的思路和建议。如何写abstract......
  • 【Java入门】交换数组中两个元素的位置
    在Java中,交换数组中的两个元素是基本的数组操作。下面我们将详细介绍如何实现这一操作,以及在实际应用中这种技术的重要性。一、使用场景在编程中,我们经常需要交换数组中的两个元素。例如,当我们需要对数组进行排序或者在某种算法中需要交换元素的位置。这种操作在数据结构、算法......
  • 百度地图GL javascript API 如何绘制流动箭头的线?
    要使用百度地图GLJavaScriptAPI绘制流动箭头线,可以使用Polyline和Symbol样式来实现。下面是一个示例代码://创建地图实例varmap=newBMapGL.Map("mapContainer");map.centerAndZoom(newBMapGL.Point(116.404,39.915),11);//创建折线varpoints=[newBMapG......
  • 什么是 JavaScript?它是如何工作的?可以用它做什么
    什么是JavaScript?JavaScript是一种编程语言,最初由BrendanEich于1995年在NetscapeCommunicationsCorporation工作时开发。最初名为“Livescript”,后来更名为“JavaScript”。用JavaScript编写的命令可以直接执行,无需任何编译或准备。因此,JavaScript与其他编程语言有很......
  • Java集成开发环境(IDE)-IntelliJ IDEA 2023 mac+win版
    IntelliJIDEA是一款由JetBrains开发的集成开发环境(IDE),用于Java、Kotlin和其他编程语言的开发。它是一款功能强大、灵活且易于使用的IDE,被广泛认为是Java开发的首选工具之一。→→↓↓载IntelliJIDEA2023mac/win版 首先,IntelliJIDEA2023引入了更强大的代码分析和智能提......
  • java项目log4j配置
    1.添加maven依赖<dependencies><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>&l......