个人项目——论文查重

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

项目概述

这个项目属于哪个课程 软件工程
作业要求 论文查重
作业的目标 学习使用PSP表格,学习commit规范
参考文献 《SimHash算法原理》、《查重算法》

0. Gitcode链接

git仓库地址
作业位于git仓库的master分支里的DuplicateCheckTest里

1.PSP表格

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

2.题目描述

题目:论文查重

描述如下:

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

3.算法实现基本思路

论文查重系统源码,git

论文查重系统源码,git

3.1simHash算法原理

  1. 分词:现在有很多可供使用的包来进行文本的分词,本篇所使用的分词器是IKAnalysis,需要安装 IKAnalyzer2012_u6.jar包

  2. hash:通过hash函数计算各个特征向量(这里为划分好的词)的hash值,hash值为二进制数01组成的n-bit签名。

  3. 加权:权重:就是词频;把第2步生成的hash值从左至右与权重进行运算;如果该bit的数值为1,则将权重赋给该位;如果该bit的数值为0,则将权重的负值赋给该位。example:“我”,hash = 101011,weight(词频) = 5;则加权后的结果为:5 -5 5 -5 5 5;

  4. 合并:经过上述的三个步骤,我们可以得到全部词(word)的加权hash值,此时需要将全部的加权后的hash值进行累加;

  5. 降维:将第四步计算出来的序列串变为01串;具体规则:如果该位的数值>0,则置为1;反之则置为0.

  6. 海明距离(Hamming Distance):在信息编码中,两个合法代码对应位上编码不同的位数称为码距,又称海明距离;

论文查重系统源码,git

3.2余弦定理查找相似度

(1)找出两篇文章的关键词;

(2)每篇文章各取出若干个关键词,合并成一个集合,计算每篇文章对于这个集合中的词的词频

(3)生成两篇文章各自的词频向量;

(4)计算两个向量的余弦相似度,值越大就表示越相似。

论文查重系统源码,git

借鉴于:《SimHash算法原理》《查重算法》

4.模块接口部分

类名 实现方法
MainText(查重主程序类) main方法
MyException(异常处理类) cast(异常抛出方法)
HammingUtils(海明距离模块工具类) getHammingDistance(计算海明距离)、getSimilarity(输出相似度)
SimHashUtils(SimHash模块工具类) getHash(计算哈希值)、getSimHash(计算simHash值)
TxtIOUtils(txt文件读写工具类) readTxt(读取txt文本内容)、writeTxt(向txt文件输出文本)

论文查重系统源码,git

5.执行结果

论文查重系统源码,git

6.代码测试

6.1测试代码分析

6.1.1TxtIOUtilsTest测试

package utils;

import CommonText.utils.TxtIOUtils;
import org.junit.Test;


public class TxtIOUtilsTest {


    @Test
    public void readNotTxtTest(){
        String str = TxtIOUtils.readTxt("D:\\新建文件夹\\git\\pa\\src\\main\\java\\com\\will\\exception\\TooShortException.java");
        System.out.println(str);
    }    //文件类型不是txt类型


    @Test
    public void readTxtTest() {
        String str = TxtIOUtils.readTxt("F:\\DeskTop\\查重测试文件\\orig.txt");
        String[] strings = str.split(" ");
        for (String string : strings) {
            System.out.println(string);
        }
    }    //路径存在,正常读取


    @Test
    public void writeTxtTest() {
        TxtIOUtils.writeTxt("今天我好想你呀,好烦",
                "F:\\DeskTop\\查重测试文件\\textWrite.txt");
    }    //路径存在,正常写入


    @Test
    public void readTxtFailTest() {
        String str = TxtIOUtils.readTxt("D:/test/none.txt");
    }    //路径不存在,读取失败


    @Test
    public void writeTxtFailTest() {
        TxtIOUtils.writeTxt("今天我好想你呀,好烦",
                "D:/test/none.txt");
    }
}    //路径错误,写入失败


论文查重系统源码,git

测试代码主要分成3部分

  1. 文件格式问题
  2. 文件路径问题
  3. 文件是否支持中文(UTF-8)的格式

6.1.2HammingUtilsTest测试

package utils;

import CommonText.utils.HammingUtils;
import CommonText.utils.SimHashUtils;
import CommonText.utils.TxtIOUtils;
import org.junit.Test;


public class HammingUtilsTest {

    @Test
    public void getHammingDistanceTest() {
        String str0 = TxtIOUtils.readTxt("F:\\DeskTop\\查重测试文件\\orig.txt");
        String str1 = TxtIOUtils.readTxt("F:\\DeskTop\\查重测试文件\\orig_0.8_add.txt");
        int distance = HammingUtils.getHammingDistance(SimHashUtils.getSimHash(str0), SimHashUtils.getSimHash(str1));
        System.out.println("海明距离:" + distance);
        System.out.println("相似度: " + (100 - distance * 100 / 128) + "%");
    }    //获取海明距离


    @Test
    public void getHammingDistanceFailTest() {
        // 测试str0.length()!=str1.length()的情况
        String str0 = "10101010";
        String str1 = "1010101";
        System.out.println(HammingUtils.getHammingDistance(str0, str1));
    }    //获取海明距离失败测试


    @Test
    public void getSimilarityTest() {
        String str0 = TxtIOUtils.readTxt("F:\\DeskTop\\查重测试文件\\orig.txt");
        String str1 = TxtIOUtils.readTxt("F:\\DeskTop\\查重测试文件\\orig_0.8_add.txt");
        int distance = HammingUtils.getHammingDistance(SimHashUtils.getSimHash(str0), SimHashUtils.getSimHash(str1));
        double similarity = HammingUtils.getSimilarity(SimHashUtils.getSimHash(str0), SimHashUtils.getSimHash(str1));
        System.out.println("str0和str1的汉明距离: " + distance);
        System.out.println("str0和str1的相似度:" + similarity);
    }
}    //获取相似度测试

论文查重系统源码,git

测试代码主要分成2部分

  1. 计算海明码距离
  2. 根据海明码距离获取两者相似度

6.1.3MainTest测试

package MainText;


import CommonText.utils.HammingUtils;
import CommonText.utils.SimHashUtils;
import CommonText.utils.TxtIOUtils;
import org.junit.Test;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;


public class MainTest {

    @Test
    public void origAndAllTest() {
        String[] str = new String[6];
        str[0] = TxtIOUtils.readTxt("F:\\DeskTop\\查重测试文件\\orig.txt");
        str[1] = TxtIOUtils.readTxt("F:\\DeskTop\\查重测试文件\\orig_0.8_add.txt");
        str[2] = TxtIOUtils.readTxt("F:\\DeskTop\\查重测试文件\\orig_0.8_del.txt");
        str[3] = TxtIOUtils.readTxt("F:\\DeskTop\\查重测试文件\\orig_0.8_dis_1.txt");
        str[4] = TxtIOUtils.readTxt("F:\\DeskTop\\查重测试文件\\orig_0.8_dis_10.txt");
        str[5] = TxtIOUtils.readTxt("F:\\DeskTop\\查重测试文件\\orig_0.8_dis_15.txt");
        String ansFileName = "F:\\DeskTop\\查重测试文件\\text.txt";
        for (int i = 0; i <= 5; i++) {
            Double similarity = HammingUtils.getSimilarity(SimHashUtils.getSimHash(str[0]), SimHashUtils.getSimHash(str[i]));
            String resultSimilarity = String.format("%.2f", similarity);
            String result = "时间:" + DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss").format(LocalDateTime.now()) + "\n" + "原文件与文件" + i + "的相似度为:" + resultSimilarity + "\r\n";
            TxtIOUtils.writeTxt(result, ansFileName);
            System.out.println(result);
        }
    }

}

论文查重系统源码,git

测试代码

将所给予的文件进行对比并给出相应的重复率

6.2 异常分析

6.2.1 TooExceptionTest异常分析

设计目标:为防止文本长度不满足要求而设置的规范长度异常

对应场景:当读取的文本内容少于300字符时将抛出。

package CommonText.exception;

import CommonText.utils.SimHashUtils;
import org.junit.Test;


public class TooExceptionTest {
    @Test
    public void shortStringExceptionTest() {
        //测试str.length()<300的情况
        System.out.println(SimHashUtils.getSimHash("123123123"));
    }

    @Test
    public void longStringExceptionTest() {
        //测试str.length()>300的情况
        String str = "俺是个不会大弧度看我等会哦亲我的环球网和决赛劳动法哈斯刘德华我的hi哦请问领导" +
                "武器的hi去武汉我去饿的hi哦请问第一哦亲的去问我去饿逗我玩求交往i欧俄对其欧俄啊我当时哦啊的哈斯哦顶一哈我的要求我饿哦奥士第哦啊世界第哦啊五点一哦亲委员会i偶尔解耦2i二ui哦武器我赌气我额度去我额度去我饿u欧气端午i偶去我额度去我额度我穷恶uu为第哦啊五Iowa u欸哦请问u琼恩" +
                "穷怕的机器我怕的机器我怕度假区我陪独家·1和我得回去我对况且我还对哦回去我的用户hi old擦拭哦撒野好滴哦亲五月底哦我企业的2二哈我soil的海外哦对后期我都会去我额度和3请问黑哦而囧决赛哦对哈死哦等哈我电话" +
                "回去我会为我却我穷恶u为皇帝哦琼文读取我饿u穷第七位赔钱为多求求我额u奇偶我穷恶ui哦额i偶去我额度去我饿u去我额u请我i额u艾欧哦企鹅ui哦请问u去我饿u无穷而无穷而且我" +
                "哦i稳压器我饿u请我i额";
        System.out.println(SimHashUtils.getSimHash(str));
        System.out.println(str.length());
    }

}

论文查重系统源码,git

6.2.2TxtExceptionTest异常分析

package CommonText.exception;

import CommonText.utils.TxtIOUtils;
import org.junit.Test;


public class TxtExceptionTest {
    @Test
    public void NotTxtExceptionTest() {
        String str = TxtIOUtils.readTxt("F:\\DeskTop\\查重测试文件\\text.java");
        System.out.println(str);
    }

    @Test
    public void IsTxtExceptionTest() {
        String str = TxtIOUtils.readTxt("F:\\DeskTop\\查重测试文件\\test.txt");
        System.out.println(str);
    }
}

论文查重系统源码,git

7.性能分析

7.1性能分析图

论文查重系统源码,git

7.2方法调用情况

论文查重系统源码,git文章来源地址https://www.toymoban.com/news/detail-722860.html

7.3 程序消耗最大函数

    public static String getSimHash(String str) {
        //文本长度太短时HanLp无法取得关键字
        try {
            if (str.length() < 300) {
                TooException.cast();
            }
        } catch (TooException myException) {
            myException.printStackTrace();
            return null;
        }
        //用数组表示特征向量,取128位,从 0 1 2 位开始表示从高位到低位
        int[] v = new int[128];
        //1. 分词(使用了外部依赖hankcs包提供的接口)
        List<String> keywordList = HanLP.extractKeyword(str, str.length());
        int size = keywordList.size();
        int i = 0;
        for (String keyword : keywordList) {
        //2. 获取hash值
            String keywordHash = getHash(keyword);
            if (keywordHash.length() < 128) {

                int dif = 128 - keywordHash.length();
                for (int j = 0; j < dif; j++) {
                    keywordHash += "0";
                }
            }
        //3. 加权、合并
            for (int j = 0; j < v.length; j++) {
            
                if (keywordHash.charAt(j) == '1') {
                    v[j] += (10 - (i / (size / 10)));
                } else {
                    v[j] -= (10 - (i / (size / 10)));
                }
            }
            i++;
        }
        //4. 降维
        //储存返回的simHash值
        String simHash = "";
        for (int j = 0; j < v.length; j++) {
            if (v[j] <= 0) {
                simHash += "0";
            } else {
                simHash += "1";
            }
        }
        return simHash;
    }


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

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

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

相关文章

  • 基于springboot实现教师人事档案管理系统项目【项目源码+论文说明】

    基于springboot实现在线商城系统演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本ONLY在线商城系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,

    2024年04月11日
    浏览(41)
  • 基于springboot实现洗衣店订单管理系统项目【项目源码+论文说明】

    基于springboot实现洗衣店订单管理系统演示 随着信息互联网信息的飞速发展,无纸化作业变成了一种趋势,针对这个问题开发一个专门适应洗衣店业务新的交流形式的网站。本文介绍了洗衣店订单管理系统的开发全过程。通过分析企业对于洗衣店订单管理系统的需求,创建了

    2024年04月12日
    浏览(46)
  • 基于Java SSM框架实现摄影器材租赁系统项目【项目源码+论文说明】

    基于java的SSM框架实现摄影器材租赁系统演示 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,

    2024年02月01日
    浏览(59)
  • 基于JAVA的网上购书系统(附:源码 论文 项目运行视频)

    摘要 在当今的社会中, 随着社会经济的快速发展以及计算机网络技术和通讯技术的快速成长,网络应用领域也一天天扩大,网络中的新鲜事物层出不穷。电子商务的发展增加了许多商业交易的平台,借助于这种互联网平台,人们进行商品宣传、业务交易等多种行为,进而使

    2024年02月10日
    浏览(36)
  • 基于Java SSM框架实现体育竞赛成绩管理系统项目【项目源码+论文说明】

    基于java的SSM框架实现体育竞赛成绩管理系统演示 体育竞赛是各种体育体育项目比赛的总称。是在裁判员的主持下,按统一的规则要求,组织与实施的体育员个体或体育队之间的竞技较量,是竞技体育与社会发生关联,并作用于社会的媒介,随着网络市场的不断成熟,带动了

    2024年01月22日
    浏览(64)
  • 基于Java SSM框架实现线上教学平台系统项目【项目源码+论文说明】

    基于java的SSM框架实现线上教学平台演示 在社会快速发展的影响下,使线上教学平台的管理和运营比过去十年更加理性化。依照这一现实为基础,设计一个快捷而又方便的网上线上教学平台系统是一项十分重要并且有价值的事情。对于传统的线上教学平台控制模型来说,网上

    2024年01月20日
    浏览(55)
  • 基于springboot实现歌曲分享平台系统项目【项目源码+论文说明】计算机毕业设计

    基于springboot实现原创歌曲分享平台演示 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理平台应运而生,各行各业相继进入信息管理时代,原创歌曲分享平台

    2024年02月06日
    浏览(47)
  • 毕设项目分享 java web网上购物商城系统(源码+论文)

    java web网上购物商城系统 提示:适合用于课程设计或毕业设计,工作量达标,源码开放 本网上商城系统以MVC分层思想为原则,使用SSH框架进行整合开发。页面显示使用JSP和HTML,数据库使用MySQL,这些技术目前相对比较成熟,方便系统的维护与扩展。 网上商城系统由前台管理

    2024年01月25日
    浏览(51)
  • 宠物领养|基于springboot的宠物领养系统设计与实现(附项目源码+论文)

    目录 一、摘要 二、相关技术 三、系统设计 3.1 整体功能设计图  3.2 功能具体细节设计   四、数据库设计  五、核心代码   六、论文参考           七、源码获取 一、摘要 如今社会上各行各业,都在用属于自己专用的软件来进行工作,互联网发展到这个时候,人们已

    2024年04月16日
    浏览(49)
  • java+vue毕业设计项目 网上购物商城系统(含源码+论文)

    Hi,各位同学好呀,这里是M学姐! 今天向大家分享一个今年(2022)最新完成的毕业设计项目作品,【基于SSM的网上购物商城】 学姐根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:5分 创新点:3分 界面美化:5分 界面美化的补充说明:使用vue的

    2024年02月03日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包