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

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

时间:2023-09-15 19:45:16浏览次数:33  
标签:查重 Java int 论文 List System t1 60 import

项目Github仓库链接

这个作业属于哪个课程 软件工程
这个作业要求在哪里 个人项目
这个作业的目标 实现论文查重的功能,并测试项目运行情况和性能等

一、PSP表格

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

二、计算模块接口的设计与实现过程

本项目使用了HanLP包对文本进行分词,基于余弦相似度的方法计算两个文本的相似度。

模块接口

1.txtOperation类

函数 功能
List Read(String path) 读取文件内容
void Write(String path,float result) 将内容写入文件
int[] Counter(List split_article,List merge) 统计词语在文本中的频率

2.WordsCut类

函数 功能
List splitWords(String s1) 对文本进行分词
List Merge(List s1, List s2) 将存储分词的两个表合并

3.CosineSimilarity类

函数 功能
float getSimilarity(int[] number1,int[] number2) 计算两个向量的余弦定理值并返回

4.main类

函数 功能
void main(String[] args) 调用项目的接口

模块设计

  首先通过txtOperation类中的Read函数获取两个文本,然后使用WordsCut类中的splitWords函数对两个文本进行分词,并对两个文
本的分词结果求并集,以并集为基础统计各个词语的频率并将其作为向量的特征值,最后使用CosineSimilarity类中的函数求两个向量的余弦值,
由于当两个向量的夹角越接近0°时,余弦值越接近1,所以计算结果越接近1,表示两个文本的内容越相似。

获得余弦相似度的代码

点击查看代码
 public static float getSimilarity(int[] number1,int[] number2){
        float square1=0,square2=0,product=0;
        for(int i=0;i<number1.length;i++){
            //两个向量的点乘
            product+=number1[i]*number2[i];
            //分别计算两个向量的平方和
            square1 += (float) Math.pow(number1[i], 2);
            square2 += (float) Math.pow(number2[i], 2);
        }
        //返回两个向量的余弦值
        return (float) (product / (Math.sqrt(square1) * Math.sqrt(square2)));
    }

三、计算模块接口部分的性能改进

总览

内存

分析

  占用内存最多的三个分别为int型数组和两个分词类。int数组用于表示两个文本代表的向量,由于分词数与文本量呈正相关,因此字数越多消耗性能越多,
通过减少对int数组的反复读取可以一定程度上减少性能损耗。

四、计算模块部分单元测试展示

1.txtOperation类测试模块

通过打开正确文件、错误格式文件、错误路径文件的方式测试能否正常读写文件;通过对手动输入的字符串进行词频统计完成对counter函数的测试。

点击查看代码
package test;

import com.Words.txtOperation;
import org.junit.Test;

import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import static org.junit.Assert.*;

public class txtOperationTest extends txtOperation {

    @Test
    public void read() throws IOException {
        //正常读取
        List<String> t1=Read("F:\\program\\c\\software\\txt\\1.txt");
        System.out.println(t1);
        //读取不存在的文件
        List<String> t2=Read("F:\\program\\c\\software\\txt\\111.txt");
        //读取错误格式的文件
        List<String> t3=Read("F:\\program\\c\\software\\txt\\");
    }

    @Test
    public void write() throws IOException {
        Write("F:\\program\\c\\software\\txt\\3.txt",(float)1.11);
    }

    @Test
    public void counter() {
        List<String> t1=new ArrayList<>();
        t1.add("aa");    t1.add("aa");    t1.add("ab");    t1.add("bb");
        List<String> t2=new ArrayList<>();
        t2.add("aa");    t1.add("a");    t1.add("ab");    t1.add("bb");
        int[] a=Counter(t1,t2);
        System.out.println(Arrays.toString(a));
    }
}

2.WordsCut类测试模块

通过手动输入的字符串测试分词函数能否正常完成分词。

点击查看代码
package test;

import com.Words.WordsCut;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

import static org.junit.Assert.*;

public class WordsCutTest extends WordsCut {

    @Test
    public void testSplitWords() {
        String t="这是一个用于测试中文分词函数的语句。";
        System.out.println(splitWords(t));
        t="This is a test aim to test the SplitWords Function of English.";
        System.out.println(splitWords(t));
    }

    @Test
    public void testmerge() {
        String t1="这是第一个字符串";
        List<String>s1=splitWords(t1);
        String t2="This is the second string";
        List<String>s2=splitWords(t2);
        System.out.println(Merge(s1,s2));
    }
}

3.CosineSimilarity类测试模块

通过手动输入不同向量的方式测试函数能否正确计算出余弦值。

点击查看代码
package test;

import com.Words.CosineSimilarity;
import org.junit.Test;

import static org.junit.Assert.*;

public class CosineSimilarityTest extends CosineSimilarity {

    @Test
    public void testGetSimilarity() {
        //计算余弦值并返回
        int t1[]={1,0};
        int t2[]={1,0};
        System.out.println(getSimilarity(t1,t2));
        int t3[]={1,0};
        int t4[]={0,1};
        System.out.println(getSimilarity(t3,t4));
        int t5[]={1,1};
        int t6[]={2,3};
        System.out.println(getSimilarity(t5,t6));
        int t7[]={1,5,5};
        int t8[]={1,6,2};
        System.out.println(getSimilarity(t7,t8));
        int t9[]={7,2,8,9};
        int t0[]={1,0,5,6};
        System.out.println(getSimilarity(t9,t0));
    }
}

测试结果

测试覆盖率

五、计算模块部分异常处理说明

1.输入不存在txt文件的地址

点击查看代码
 try {
            //打开path路径的文件
            File read = new File(path);
            InputStreamReader reader = new InputStreamReader(new FileInputStream(read));
            BufferedReader r = new BufferedReader(reader);
            String line = r.readLine();
            //循环读取每一行的文字并加入到表中
            while (line != null) {
                article.add(line);
                line = r.readLine();
            }
        } catch (IOException e) {
            System.out.println("文件打开失败,请检查文件路径是否正确");
        }

运行结果:

标签:查重,Java,int,论文,List,System,t1,60,import
From: https://www.cnblogs.com/asterismzz/p/17703762.html

相关文章

  • 无涯教程-JavaScript - LOOKUP函数
    描述需要查看单个行或一列并从第二行或第二列的同一位置查找值时,请使用LOOKUP函数。使用"查找"功能搜索一行或一列。使用VLOOKUP函数可搜索一行或一列,或搜索多行和多列(如表)。它是LOOKUP的改进版本。有两种使用LOOKUP的方法-矢量形式−UsethisformofLOOKUPtosearc......
  • 跟狂神学Java第一次写博客
    MarkDown学习标题字体helloworld!//前后加*helloworld!//前后加**helloworld!//前后加***helloworld!//前后加~~引用一个>选择狂神说分割线三个***或三个---图片感叹号加中括号(中括号写图片名字)加小括号(小括号写图片路径)超链接一个中括号(中括号写超链接名......
  • Java---数组
    学完之后需要实现这两个问题:#生成六个1-33之间的随机数,要求不重复+特殊号码(生成彩票)#数组扩容:先定义一个十个长度的数组,写一个方法用于向数组里面存值,每次只存入一个,反复的调用存值的这个方法,当存入的值超过十个以后,数组长度自动扩充用于存放后面的数据。创建数组本质上还......
  • 无涯教程-JavaScript - INDIRECT函数
    描述INDIRECT函数返回由文本字符串指定的引用。如果您在Excel公式中键入引用B1,则Excel会理解这引用了单元格B1。但是,Excel无法将文本字符串"B1"理解为引用。因此,如果单元格引用采用文本字符串的形式,则需要使用INDIRECT函数将其转换为实际的单元格引用。立即判断引用以显......
  • 在 Java 中自定义反序列化:实现可序列化接口
    实现可串行化接口的功能Serialized接口用于管理Java默认序列化机制使用的序列化和反序列化过程。Java虚拟机(JVM)通过该类的Serialized接口实现来指示该类是否具有可序列化和反序列化的能力。该接口不仅有利于序列化,而且还使开发人员可以自由地更改默认的反序列化行为。由......
  • java RSA 私钥解密、公钥解密
    importorg.apache.commons.codec.binary.Base64;importsun.security.rsa.RSAPrivateCrtKeyImpl;importorg.bouncycastle.util.encoders.Hex;importjavax.crypto.Cipher;importjava.io.ByteArrayOutputStream;importjava.security.Key;importjava.security.KeyFactory......
  • Web阶段:第三章:JavaScript语言
    《JavaScript语言精粹》点击下载,密码:synuJavaScript介绍:1.Javascript语言诞生主要是完成页面的数据验证。2.它运行在客户端,需要运行浏览器来解析执行JavaScript代码。3.JS是Netscape网景公司的产品,最早取名为LiveScript;为了吸引更多java程序员。更名为javascript。4.JS是弱类型......
  • 论文解读 | 基于视觉的水果采摘机器人识别与定位方法研究进展
    原创|文BFT机器人01背景在复杂的农业环境中,利用机器视觉及其相关算法可以提高收割机器人的效率、功能性、智能化和远程互动性。对于水果采摘机器人系统来说,主要的挑战包括免提导航和水果定位,以及大多数果园中常见的崎岖地形和大型障碍物。这些挑战会在移动采摘机器人穿越地形时在......
  • 无涯教程-JavaScript - GETPIVOTDATA函数
    描述GETPIVOTDATA函数返回存储在数据透视表报表中的数据。您可以使用它从数据透视表报表中检索摘要数据,前提是该摘要数据在报表中可见。您可以通过以下方式快速输入一个简单的GETPIVOTDATA公式:在要向其返回值的单元格中键入=(等号),然后在"数据透视表"报表中单击包含要返回的......
  • Java特性有哪些
    Java特性:安全性,分布式,简单性,可移植性,面向对象,高性能,多线程,健壮性。具体的链接如下:JAVA的特性和优势-知乎(zhihu.com){之前的随笔因为观感不好与影响查阅速度被我删除了}......