文章目录

  • 项目概述
  • 0. Gitcode链接
  • 1.PSP表格
  • 2.题目描述
  • 3.算法实现基本思路
    • 3.1simHash算法原理
    • 3.2余弦定理查找相似度
  • 4.模块接口部分
  • 5.执行结果
  • 6.代码测试
  • 6.1测试代码分析
    • 6.1.1TxtIOUtilsTest测试
    • 6.1.2HammingUtilsTest测试
    • 6.1.3MainTest测试
    • 6.2 异常分析
    • 6.2.1 TooExceptionTest异常分析
    • 6.2.2TxtExceptionTest异常分析
  • 7.性能分析
    • 7.1性能分析图
    • 7.2方法调用情况
    • 7.3 程序消耗最大函数

项目概述

这个项目属于哪个课程 软件工程
作业要求 论文查重
作业的目标 学习使用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.算法实现基本思路

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):在信息编码中,两个合法代码对应位上编码不同的位数称为码距,又称海明距离;

3.2余弦定理查找相似度

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

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

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

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

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

4.模块接口部分

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

5.执行结果

6.代码测试

6.1测试代码分析

6.1.1TxtIOUtilsTest测试

package utils;import CommonText.utils.TxtIOUtils;
import org.junit.Test;public class TxtIOUtilsTest {@Testpublic void readNotTxtTest(){String str = TxtIOUtils.readTxt("D:\\新建文件夹\\git\\pa\\src\\main\\java\\com\\will\\exception\\TooShortException.java");System.out.println(str);}    //文件类型不是txt类型@Testpublic void readTxtTest() {String str = TxtIOUtils.readTxt("F:\\DeskTop\\查重测试文件\\orig.txt");String[] strings = str.split(" ");for (String string : strings) {System.out.println(string);}}    //路径存在,正常读取@Testpublic void writeTxtTest() {TxtIOUtils.writeTxt("今天我好想你呀,好烦","F:\\DeskTop\\查重测试文件\\textWrite.txt");}    //路径存在,正常写入@Testpublic void readTxtFailTest() {String str = TxtIOUtils.readTxt("D:/test/none.txt");}    //路径不存在,读取失败@Testpublic void writeTxtFailTest() {TxtIOUtils.writeTxt("今天我好想你呀,好烦","D:/test/none.txt");}
}    //路径错误,写入失败

测试代码主要分成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 {@Testpublic 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) + "%");}    //获取海明距离@Testpublic void getHammingDistanceFailTest() {// 测试str0.length()!=str1.length()的情况String str0 = "10101010";String str1 = "1010101";System.out.println(HammingUtils.getHammingDistance(str0, str1));}    //获取海明距离失败测试@Testpublic 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);}
}    //获取相似度测试

测试代码主要分成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 {@Testpublic 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);}}}

测试代码

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

6.2 异常分析

6.2.1 TooExceptionTest异常分析

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

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

package CommonText.exception;import CommonText.utils.SimHashUtils;
import org.junit.Test;public class TooExceptionTest {@Testpublic void shortStringExceptionTest() {//测试str.length()<300的情况System.out.println(SimHashUtils.getSimHash("123123123"));}@Testpublic 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());}}

6.2.2TxtExceptionTest异常分析

package CommonText.exception;import CommonText.utils.TxtIOUtils;
import org.junit.Test;public class TxtExceptionTest {@Testpublic void NotTxtExceptionTest() {String str = TxtIOUtils.readTxt("F:\\DeskTop\\查重测试文件\\text.java");System.out.println(str);}@Testpublic void IsTxtExceptionTest() {String str = TxtIOUtils.readTxt("F:\\DeskTop\\查重测试文件\\test.txt");System.out.println(str);}
}

7.性能分析

7.1性能分析图

7.2方法调用情况

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;}

个人项目——论文查重相关推荐

  1. 个人项目-论文查重/3120005470

    文章目录 1.作业的基本信息 2.作业地址 3.PSP表格 4.算法的设计与实现过程 4.1 分词 4.2 hash 4.3 加权 4.4 合并 4.5 降维 4.6 通过海明距离计算simhash的 ...

  2. 个人项目作业-论文查重

    目录 1.作业基本信息 2.PSP表格 3.计算模块接口的设计与实现过程 3.1类和方法 3.2类.方法之间的调用关系 3.3 关键方法computeTxtSimilar() 4.计算模块接口部分的性 ...

  3. 软件工程个人项目作业----论文查重

    这个作业属于哪个课程 广工2023软件工程课程社区-CSDN社区云 这个作业要求在哪里 个人项目作业-论文查重 这个作业的目标 实现论文查重 其他参考文献 csdn 目录 1.gitcode地址 2. ...

  4. 目前需要开发出一个功能,对比查找并标注出两篇文章中类似的段落或者词句,有什么开源项目有这个功能吗? 其实有点像论文查重的功能,有论文查重的比较通用的开源项目推荐吗?...

    是的,你可以使用论文查重的工具来对比查找并标注两篇文章之间的相似段落或词句. 你可以尝试使用这些开源项目: MOSS (Measure Of Software Similarity):这是一个用于检测 ...

  5. lucene配置动态域_学位论文查重中如何使用Lucene全文检索

    本系统用的是Lucene全文检索架构,Lucene作为一个全文检索引擎框架,在构建机制上有众多明显的优点:首先,它可以对任何可以转化成文本格式的数据进行索引的创建,而学术论文包含的doc.PDF和CA ...

  6. (精品)JAVA SSM框架黄淮学院食堂仓库管理系统的设计与实现源码+论文+查重报告+效果、安装视频+ppt模板(已降重)

    项目介绍: (精品)JAVA SSM框架黄淮学院食堂仓库管理系统的设计与实现源码+论文+查重报告+效果.安装视频+ppt模板(已降重) 高清视频演示: https://www.bilibili.com ...

  7. 学术论文查重经验分享

    本文涉及知网及Paperpass两种查询工具,非系统总结了降重技巧.查重网站避雷等内容. 最近一年,先后对结题报告和硕士论文做了"查重.改查重"工作,走了些弯路,将过程中的经验总结 ...

  8. 第一次个人编程作业——论文查重

    文章目录 0 作业基本信息 1 作业地址:[https://gitcode.net/willwill0915/papercheck](https://gitcode.net/willwill0915/ ...

  9. 分享一个靠谱的免费论文查重网站

    给大家分享一个靠谱的免费论文查重网站PaperPP:http://www.paperpp.com,可以一站解决"论文查重.改重.降重"等问题@TOC 欢迎使用Markdown编辑器 ...

最新文章

  1. python: how to delete a given item if it exist in the list
  2. 再论c++模板之类型识别之如何得到类型信息
  3. IT项目开发的75条管理守则(转)
  4. java从Object类型转换成double类型
  5. UA MATH567 高维统计专题3 含L1-norm的凸优化2 Proximal Gradient Descent
  6. plc 上位机编译算法_什么是PLC与DDC PLC与DDC的区别
  7. Qt Creator快捷键大全
  8. HTML标记语言——文档标记设置
  9. mysql 勒索病毒怎么恢复_敲诈者病毒解密恢复 勒索病毒数据库恢复 数据库中病毒解密恢复...
  10. 基于DDS的多波形程控信号发生器
  11. [译] PWA 实战:Tinder 的性能优化之道
  12. 我做淘宝客的失败经历——不要怕员工偷师
  13. Kinect:少年你步履蹒跚是不是没睡好
  14. python中画折线图不同颜色的两段_matplotlib绘制精美的折线图——另附颜色、形状查找表...
  15. Robotaxi里程竞赛开启,激光雷达成新热点 | 2021年自动驾驶趋势解读
  16. android2.3.5中阿拉伯文字符显示顺序不是从右至左显示
  17. 【3D游戏基础】蒙皮骨骼动画与骨架
  18. 不要做联表查询!!!
  19. 关于“打开数据库时出错: 到主机 的 TCP/IP 连接失败。”的解决方法
  20. 盖泽尔智力测试软件,宝宝聪明不聪明?只需测一测,不用去医院,家长在家轻松筛查...

热门文章

  1. openjudge 1.5.33
  2. 2853: 小A的游戏昵称
  3. Springboot毕设项目老年人社区服务平台设计与实现x45mt(java+VUE+Mybatis+Maven+Mysql)
  4. 金三银四华为软件测试一面,12个面试题复盘
  5. 上期ctp期货API android 客户端
  6. 期权中的两个概念:认沽期权和期权激励
  7. 通过环路分析仪得到系统的闭环传递函数方法(Matlab System Identification)
  8. 二八法则,程序员职业生涯真的很短吗?非科班出身,就不能成为大厂程序员吗?(内容过于现实)
  9. 20180802CentOS 7安装 IUS并安装最新apache
  10. 无人驾驶7:粒子滤波