个人项目:论文查重

这篇具有很好参考价值的文章主要介绍了个人项目:论文查重。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这个作业属于哪个课程 软件工程2024
这个作业要求在哪里
个人项目
这个作业的目标 了解软件项目开发的整体流程,实现自己的个人项目,学习单元测试、性能优化和 git 操作,学会使用 PSP 表格

 
Github地址点击此处,进入我的仓库

一、项目需求

题目:论文查重

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

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

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

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

  • 从命令行参数给出:论文原文的文件的绝对路径。

  • 从命令行参数给出:抄袭版论文的文件的绝对路径。

  • 从命令行参数给出:输出的答案文件的绝对路径。

 
提供的样例:orig.txt是原文,其他orig_add.txt等均为抄袭版论文。样例下载地址
 
答案文件中输出的答案为浮点型,精确到小数点后两位
 

二、设计和实现

1、整体流程

个人项目:论文查重

2、类和函数

方法 描述
Main main() 主程序入口
TxtUtils readFile(String filePath)
writeFile(double fileElem, String filePath)
从目标文件路径中读取文件内容
将结果写入指定文件
HashUtils getHash(String str)
getSimHash(String str)
传入 String ,计算出它的 hash 值,并以字符串形式输出
传入 String ,计算出它的 simHash 值
HammingUtils calculateHammingDistance(String simHash1, String simHash2)
calculateSimilarity(String simHash1, String simHash2)
计算两个 SimHash 值的海明距离
输入两个 simHash 值,输出相似度
ExceptionUtils ExceptionUtils(String message) 处理文本过短异常

3、关键算法

simHash算法和海明距离实现论文查重

三、性能改进

性能分析图:
个人项目:论文查重
 
Memory占用图:
个人项目:论文查重
byte类、String类和HashMap类占用较,byte类、String类主要来自于simHash值和海明距离的计算,HashMap类主要来自于使用分词器分词需要用到Map进行词频映射,可从此处改进。

四、单元测试

1. 读写 txt 文件的模块测试

思路:测试读取成功、读取失败、写入成功、写入失败的情况

代码:

public class TxtUtilsTest {
    @Test
    public void readTest() {
        // 路径存在 读取成功
        String str = TxtUtils.readFile("D:/test/orig.txt");
        String[] strings = str.split(" ");
        for (String string : strings) {
            System.out.println(string);
        }
    }
    @Test
    public void readTestErr() {
        // 路径不存在 读取失败
        String str = TxtUtils.readFile("D:/test/orig111.txt");
        String[] strings = str.split(" ");
        for (String string : strings) {
            System.out.println(string);
        }
    }
    @Test
    public void writeTest() {
        // 路径存在 写入成功
        double[] elem = {0.12, 0.23, 0.34, 0.45, 0.56,0.99,0.88};
        for (double v : elem) {
            TxtUtils.writeFile(v, "D:/test/answer.txt");
        }
    }
    @Test
    public void writeTestErr() {
        //路径错误 写入失败
        double[] elem = {0.12, 0.23, 0.34, 0.45, 0.56,0.99,0.88};
        for (double v : elem) {
            TxtUtils.writeFile(v, "QQ:/test//answer.txt");
        }
    }
}

测试结果:

个人项目:论文查重

代码覆盖率:

个人项目:论文查重

 
2. hash 模块测试

代码:

public class HashUtilsTest {
    @Test
    public void getHashTest() {
        // 短文本
        String[] strings = {"画画" , "多大" , "GG" , "火" , "阿凡达ya" , "版"};
        for (String string : strings) {
            String strHash = HashUtils.getHash(string);
            if (strHash != null) {
                System.out.println(strHash.length());
            }
            System.out.println(strHash);
        }
    }
    @Test
    public void getSimHashTest0() {
        // 短文本
        String str = "好";
        System.out.println(HashUtils.getSimHash(str));
    }
    @Test
    public void getSimHashTest() {
        // 长文本
        String str0 = TxtUtils.readFile("D:/test/orig.txt");
        String str1 = TxtUtils.readFile("D:/test/orig_0.8_add.txt");
        System.out.println(HashUtils.getSimHash(str0));
        System.out.println(HashUtils.getSimHash(str1));
    }
}

测试结果:

个人项目:论文查重

代码覆盖率:

个人项目:论文查重

 
3. 计算海明距离模块测试

代码:

public class HammingUtilsTest {
    @Test
    public void hammingDistanceTest0() {
        String str0 = "10101100";
        String str1 = "11001111";
        int distance = HammingUtils.calculateHammingDistance(str0,str1);
        double similarity = HammingUtils.calculateSimilarity(str0,str1);
        System.out.println("海明距离为:" + distance);
        System.out.println("相似度为:" + similarity);
    }
    @Test
    public void hammingDistanceTest1() {
        // 长度不等
        String str0 = "10101100";
        String str1 = "110011";
        int distance = HammingUtils.calculateHammingDistance(str0,str1);
//        double similarity = HammingUtils.calculateSimilarity(str0,str1);
        System.out.println("海明距离为:" + distance);
//        System.out.println("相似度为:" + similarity );
    }
    @Test
    public void hammingDistanceTest2() {
        String str0 = TxtUtils.readFile("D:/test/orig.txt");
        String str1 = TxtUtils.readFile("D:/test/orig_0.8_add.txt");
        int distance = HammingUtils.calculateHammingDistance(Objects.requireNonNull(HashUtils.getSimHash(str0)), Objects.requireNonNull(HashUtils.getSimHash(str1)));
        double similarity = HammingUtils.calculateSimilarity(HashUtils.getSimHash(str0),HashUtils.getSimHash(str1));
        System.out.println("海明距离为:" + distance);
        System.out.println("相似度为:" + similarity);
    }

    @Test
    public void hammingDistanceTest3() {
        String str0 = TxtUtils.readFile("D:/test/orig.txt");
        String str1 = TxtUtils.readFile("D:/test/orig_0.8_del.txt");
        int distance = HammingUtils.calculateHammingDistance(Objects.requireNonNull(HashUtils.getSimHash(str0)), Objects.requireNonNull(HashUtils.getSimHash(str1)));
        double similarity = HammingUtils.calculateSimilarity(HashUtils.getSimHash(str0),HashUtils.getSimHash(str1));
        System.out.println("海明距离为:" + distance);
        System.out.println("相似度为:" + similarity);
    }

    @Test
    public void hammingDistanceTest4() {
        String str0 = TxtUtils.readFile("D:/test/orig.txt");
        String str1 = TxtUtils.readFile("D:/test/orig_0.8_dis_1.txt");
        int distance = HammingUtils.calculateHammingDistance(Objects.requireNonNull(HashUtils.getSimHash(str0)), Objects.requireNonNull(HashUtils.getSimHash(str1)));
        double similarity = HammingUtils.calculateSimilarity(HashUtils.getSimHash(str0),HashUtils.getSimHash(str1));
        System.out.println("海明距离为:" + distance);
        System.out.println("相似度为:" + similarity);
    }
}

测试结果:

个人项目:论文查重

代码覆盖率:

个人项目:论文查重

 

4.主测试 MainTest

代码:

public class MainTest {
    @Test
    public void mainTestAll() {
        String[] args = new String[6];
        args[0] = "D:/test/orig.txt";
        args[1] = "D:/test/orig_0.8_add.txt";
        args[2] = "D:/test/orig_0.8_del.txt";
        args[3] = "D:/test/orig_0.8_dis_1.txt";
        args[4] = "D:/test/orig_0.8_dis_10.txt";
        args[5] = "D:/test/orig_0.8_dis_15.txt";
        String answerPath = "D:/test/answerAll.txt";
        for (int i=1; i< args.length;i++){
            double answer = HammingUtils.calculateSimilarity(HashUtils.getSimHash(TxtUtils.readFile(args[0])),HashUtils.getSimHash(TxtUtils.readFile(args[i])));
            TxtUtils.writeFile(answer, answerPath);
        }
    }

    @Test
    public void mainTeatSame() {
        String str = "D:/test/orig.txt";
        String answerPath = "D:/test/answerSame.txt";
        double answer = HammingUtils.calculateSimilarity(HashUtils.getSimHash(TxtUtils.readFile(str)),HashUtils.getSimHash(TxtUtils.readFile(str)));
        TxtUtils.writeFile(answer,answerPath);
    }
}

测试结果:

个人项目:论文查重

代码覆盖率:

个人项目:论文查重

结果文件:
个人项目:论文查重
个人项目:论文查重
个人项目:论文查重
 

五、异常处理

  1. 文本长度太短时,HanLp无法取得关键字,需要抛出异常。
 // 文本长度太短  HanLp无法取关键字
        try{
            if(str.length() < 200) throw new ExceptionUtils("文本过短!");
        }catch (ExceptionUtils e){
            e.printStackTrace();
            return null;
        }
public class ExceptionUtils extends RuntimeException {
        // 构造函数:仅带消息参数
        public ExceptionUtils(String message) {
            super(message);
        }
}

测试:

public class ExceptionUtilsTest {
    @Test
    public void exceptionTest(){
        //str.length()<200
        System.out.println(HashUtils.getSimHash("世界这么大"));
    }
    @Test
    public void exceptionTest0(){
        //长文本
        String str = TxtUtils.readFile("D:/test/orig.txt");
        System.out.println(HashUtils.getSimHash(str));
    }
}

个人项目:论文查重

 

  1. 判断命令行输入参数的数量
if (args.length != 3) {
            System.out.println("请提供正确的参数:[原文文件] [抄袭版论文的文件] [答案文件]");
            return;
        }

 文章来源地址https://www.toymoban.com/news/detail-839710.html

六、附录

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

到了这里,关于个人项目:论文查重的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何打造属于自己的个人IP?

    在当今信息爆炸的时代,个人 IP 已经成为人们在网络世界中的独特标签。无论是在职场上、创业中,还是在社交生活中,拥有个人 IP 的人都能脱颖而出,吸引更多的关注和机会。那么,如何打造属于自己的个人 IP 呢? 首先,找到自己的定位。 在打造个人 IP 的过程中,定位

    2024年02月14日
    浏览(39)
  • 个人IP打造全过程:如何打造出属于自己的个人IP?

    随着互联网的快速发展,个人IP已经逐渐成为一个热门话题。拥有自己的个人IP可以为你带来更多的机会和收益,让你在竞争激烈的市场中脱颖而出。但是,要想打造自己的个人IP并不是一件容易的事情。本文将为你介绍如何打造属于自己的个人IP。#IP#   一、了解自己 首先,

    2024年02月16日
    浏览(46)
  • 100套安卓(Android)毕业设计(带论文)、大作业、现成作品(Android Studio)Android毕业设计项目,源码+论文

    1,基于Android 语音朗读书籍管理系统 毕业设计 2,基于Android图书管理系统   毕业设计 3,基于 Android系统蓝牙通信呼吸检测设备管理系统  4,基于Android+java后台管理挂号系统  毕业设计 5,基于Android系统的JT808协议传输定位信息系统 毕业设计 6,基于Android生鲜食品管理系统

    2024年02月05日
    浏览(49)
  • 查重论文如何修改 智能写作

    大家好,小发猫降重今天来聊聊查重论文如何修改 智能写作,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 标题:查重论文如何修改:七个实用步骤助你过关 在完成论文初稿后,我们通常会使用查重工具来检

    2024年04月16日
    浏览(46)
  • 论文如何避免高AI查重率

    大家好,小发猫降重今天来聊聊论文如何避免高AI查重率,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 论文如何避免高AI查重率 在学术研究中,论文的质量和原创性至关重要。然而,随着人工智能技术的快速

    2024年03月14日
    浏览(59)
  • 教学论文查重 ai写作

    大家好,今天来聊聊教学论文查重 ai写作,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 教学论文查重:确保学术诚信的重要环节 在学术界,论文查重是维护学术诚信和保护知识产权的关键手段。随着技术的

    2024年01月25日
    浏览(55)
  • 「AIGC」如何助力个人创意,打造属于你的独特时代?

    当今时代,人工智能(AI)不仅仅是科幻电影中的概念,也已经广泛应用于各行各业。其中,AI在创意领域的应用越来越受到关注。从AI生成的诗歌、绘画、音乐等作品的出现,到AI辅助创意产生的创意设计、广告营销等领域的应用,都为我们展示了AI在创意领域的无限可能。 AI生

    2024年02月11日
    浏览(53)
  • 论文查重的方法步骤 智能写作

    大家好,今天来聊聊论文查重的方法步骤 智能写作,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 论文查重的方法步骤 在学术界,论文查重是保证学术诚信和论文质量的重要环节。为了帮助大家更好地了解论

    2024年02月01日
    浏览(42)
  • 论文查重是查哪些 智能写作

    大家好,今天来聊聊论文查重是查哪些 智能写作,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 论文查重是查哪些 一、背景介绍 在学术领域,论文查重是保证学术诚信和论文质量的重要环节。通过对论文进

    2024年01月21日
    浏览(39)
  • 论文查重率怎么查看 智能写作

    大家好,今天来聊聊论文查重率怎么查看 智能写作,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 论文查重率怎么查看 一、背景介绍 在学术领域,论文的原创性和诚信度是每个作者必须重视的方面。为了防

    2024年02月02日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包