文章目录

  • 1.作业的基本信息
  • 2.作业地址
  • 3.PSP表格
  • 4.算法的设计与实现过程
    • 4.1 分词
    • 4.2 hash
    • 4.3 加权
    • 4.4 合并
    • 4.5 降维
    • 4.6 通过海明距离计算simhash的相似度
  • 5.具体代码设计部分
    • 5.1 设计顶层接口,选用一种算法作为实现类
    • 5.2 核心代码:获取simhash和海明距离得到相似度
    • 5.3 代码设计的优点
  • 6.计算模块接口部分的性能改进
    • 6.1 JProfiler分析
    • 6.2 性能改进策略:
  • 7.计算模块部分单元测试展示
    • 7.1 整体功能测试:采用老师任务里的样例。
    • 7.2 测试核心逻辑求解simhash值
    • 7.3 单元测试覆盖率截图:
  • 8.计算模块部分异常处理说明
    • 8.1 测试错误的传参个数
    • 8.2 测试文件格式

1.作业的基本信息

作业属于课程 软件工程三班
作业的要求 个人项目作业-论文查重
作业的目标 1、熟悉gitcode的使用
2、使用PSP表格记录项目完成流程
3、有质量地完成论文查重项目
4、编写单元测试
5、对项目做性能测试分析与改进

2.作业地址

gitcode仓库地址:
https://gitcode.net/weixin_55642001/3120005470-paper/-/tree/master/

3.PSP表格

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

4.算法的设计与实现过程

设计思想概述以及实现流程:实现流程基于Simhash和海明距离计算simhash相似度

4.1 分词

需要判断文本分词,形成这个文章的特征单词。最后形成去掉噪音词的单词序列并为每个词加上权重,我们假设权重分为5个级别(1~5)。
比如:“ 美国“51区”雇员称内部有9架飞碟,曾看见灰色外星人 ” ==> 分词后为 “ 美国(4) 51区(5) 雇员(3) 称(1) 内部(2) 有(1) 9架(3) 飞碟(5) 曾(1) 看见(3) 灰色(4) 外星人(5)”,括号里是代表单词在整个句子里重要程度,数字越大越重要。

4.2 hash

通过hash算法把每个词变成hash值,比如“美国”通过hash算法计算为 100101,“51区”通过hash算法计算为 101011。这样我们的字符串就变成了一串串数字,要把文章变为数字计算才能提高相似度计算性能,现在是降维过程进行时。

4.3 加权

通过 4.2步骤的hash生成结果,需要按照单词的权重形成加权数字串,比如“美国”的hash值为“100101”,通过加权计算为“4 -4 -4 4 -4 4”;“51区”的hash值为“101011”,通过加权计算为 “ 5 -5 5 -5 5 5”。

4.4 合并

把上面各个单词算出来的序列值累加,变成只有一个序列串。比如 “美国”的 “4 -4 -4 4 -4 4”,“51区”的 “ 5 -5 5 -5 5 5”, 把每一位进行累加, “4+5 -4±5 -4+5 4±5 -4+5 4+5” ==> “9 -9 1 -1 1 9”。这里作为示例只算了两个单词的,真实计算需要把所有单词的序列串累加。

4.5 降维

把4.4步骤算出来的 “9 -9 1 -1 1 9” 变成 0 1 串,形成我们最终的simhash签名。 如果每一位大于0 记为 1,小于0 记为 0。最后算出结果为:“1 0 1 0 1 1”。

4.6 通过海明距离计算simhash的相似度

现在通过这样的转换,文本都转换为simhash 代码,如何计算两个simhash的相似度呢?我们通过海明距离(Hamming distance)就可以计算出两个simhash到底相似不相似。两个simhash对应二进制(01串)取值不同的数量称为这两个simhash的海明距离。举例如下: 10101 和 00110 从第一位开始依次有第一位、第四、第五位不同,则海明距离为3。对于二进制字符串的a和b,海明距离为等于在a XOR b运算结果中1的个数(普遍算法)。

5.具体代码设计部分

5.1 设计顶层接口,选用一种算法作为实现类

由于计算论文相似度、重复度的算法较多,这里也只采用了一种方法,即simhash+海明距离。因此我首先定义一个抽象接口DuplicateCheck接口,作为论文查重多种实现算法都要继承的父接口,接口里定义了一个抽象方法:String getSimilarity(String originalStr, String plagiarizeStr),用于让多种算法的实现类来实现,方便于将来扩展以及将来更换算法实现论文查重。

5.2 核心代码:获取simhash和海明距离得到相似度

在这定义一个子实现类SimHashAndHammingImpl类实现上述所说的DuplicateCheck接口,
核心是实现的方法 String getSimilarity(String originalStr, String plagiarizeStr)
方法内容如下:核心逻辑即为获取两个长文本的simhash以及计算海明距离得到相似度。

 @Overridepublic String getSimilarity(String originalStr, String plagiarizeStr) {//由字符串得出对应的simHash值String orSimHash = getSimHash(originalStr);String plSimHash = getSimHash(plagiarizeStr);//由simHash值求出相似度String similarity = gotSimilarity(orSimHash, plSimHash);return similarity;}

其中调用了同样定义在本实现类的方法:getSimHash方法和gotSimilarity方法,在这里不列出源代码赘述了。

5.3 代码设计的优点

1、针对这一种Simhash+海明距离的算法的实现方法进行了代码封装,使得易于调用。
2、同时,定义了父接口,也为将来进行代码水平扩展其他算法的试验进行了准备,将来只需要更换实现类即可,实现了开闭原则,即对修改关闭,对扩展开放。

6.计算模块接口部分的性能改进

6.1 JProfiler分析

概览图

程序中消耗最大的函数:
是计算长文本的simHash值的函数

6.2 性能改进策略:

1、simhash用于比较大文本,适用于论文查重,但是如果是小文本,则应该更换算法。
2、使用多线程技术。

7.计算模块部分单元测试展示

7.1 整体功能测试:采用老师任务里的样例。

public class TestPaperSelect {private DuplicateCheck check = new SimHashAndHammingImpl();/*** 测试不同的文件*/@Testpublic void testdifferent() {List<String> plagiar = new ArrayList<>();// 源文件String originalStr = FileUtil.readUtf8String("C:\\Users\\26411\\Desktop\\test\\orig.txt");plagiar.add("C:\\Users\\26411\\Desktop\\test\\orig_0.8_add.txt");plagiar.add("C:\\Users\\26411\\Desktop\\test\\orig_0.8_del.txt");plagiar.add("C:\\Users\\26411\\Desktop\\test\\orig_0.8_dis_1.txt");plagiar.add("C:\\Users\\26411\\Desktop\\test\\orig_0.8_dis_10.txt");plagiar.add("C:\\Users\\26411\\Desktop\\test\\orig_0.8_dis_15.txt");String plagiarizeStr = null;    //抄袭文本String similarity = null;   //相似度for (String str : plagiar) {plagiarizeStr = FileUtil.readUtf8String(str);similarity = check.getSimilarity(originalStr, plagiarizeStr);System.out.println(str + " ==>" + similarity);}}
}

结果如下:

C:\Users\26411\Desktop\test\orig_0.8_add.txt ==>0.82
C:\Users\26411\Desktop\test\orig_0.8_del.txt ==>0.75
C:\Users\26411\Desktop\test\orig_0.8_dis_1.txt ==>0.77
C:\Users\26411\Desktop\test\orig_0.8_dis_10.txt ==>0.73
C:\Users\26411\Desktop\test\orig_0.8_dis_15.txt ==>0.61

7.2 测试核心逻辑求解simhash值

  @Testpublic void testSimhash() {String originalStr = FileUtil.readUtf8String("C:\\Users\\26411\\Desktop\\test\\orig.txt");String plagiarizeStr = FileUtil.readUtf8String("C:\\Users\\26411\\Desktop\\test\\orig_0.8_add.txt");String orSimHash = check.getSimHash(originalStr);String plSimHash = check.getSimHash(plagiarizeStr);System.out.println(" orSimHash => "+orSimHash);System.out.println(" plSimHash => "+plSimHash);}

结果如下:

 orSimHash => 11110000111111010111111100110101010011010110011001111011001010000111110100000010000101011100011010100000111110100100111111110000plSimHash => 11110001011111000111110001100011010010010010010101111011001010000011111100000010010101010100011010100110110111110100111010110000

7.3 单元测试覆盖率截图:

8.计算模块部分异常处理说明

public class Error {//错误的传参个数public static final Exception BadArgsException = new RuntimeException("错误的传参个数!");//文件校验 public static final Exception BadFileException = new RuntimeException("文件格式不正确!");public static final Exception LengthException = new RuntimeException("文本长度需多于300字!");
}

在出现错误的传参个数或校验文件不符合要求时,抛出异常。

8.1 测试错误的传参个数

当命令行传参个数少于3个时,会抛出异常 BadArgsException

public class TestError {private DuplicateCheck check = new SimHashAndHammingImpl();@Testpublic void testBadArgsException(){String[] args = new String[2];args[0] = "C:\\Users\\26411\\Desktop\\test\\orig.txt";args[1] = "C:\\Users\\26411\\Desktop\\test\\orig_0.8_add.txt";PaperSelect.main(args);}
}

结果如下:

java.lang.RuntimeException: 错误的传参个数!at com.hwg.common.Error.<clinit>(Error.java:5)at com.hwg.PaperSelect.main(PaperSelect.java:13)

8.2 测试文件格式

当文件格式有误时,会抛出异常 BadFileException

@Testpublic void testBadFileException(){String[] args = new String[3];args[0] = "C:\\Users\\26411\\Desktop\\test\\orig.txy";args[1] = "C:\\Users\\26411\\Desktop\\test\\orig_0.8_add.txz";args[2] = "C:\\Users\\26411\\Desktop\\test\\ans.txw";PaperSelect.main(args);}

结果如下:

java.lang.RuntimeException: 文件格式不正确!at com.hwg.common.Error.<clinit>(Error.java:8)at com.hwg.PaperSelect.main(PaperSelect.java:21)

个人项目-论文查重/3120005470相关推荐

  1. 个人项目——论文查重

    文章目录 项目概述 0. Gitcode链接 1.PSP表格 2.题目描述 3.算法实现基本思路 3.1simHash算法原理 3.2余弦定理查找相似度 4.模块接口部分 5.执行结果 6.代码测试 ...

  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. 浅谈ssh(struts,spring,hibernate三大框架)整合的意义及其精髓
  2. PAT甲级1017 Queueing at Bank:[C++题解]字符串、结构体、最小堆
  3. 微软如何在3年内将数据中心的用水量削减95%
  4. url.getinputsteam 获取不完整_年度营销方案合集,活动策划,规划推广,全内容完整套用告别加班...
  5. MediaPipe: Google Research 开源的跨平台多媒体机器学习模型应用框架
  6. js插值法的使用_js 实现排序算法 -- 插入排序(Insertion Sort)
  7. Flume的Source
  8. 数据结构 2-2 线性表的顺序表实现
  9. Xcode 5中缺少Provisioning Profiles菜单项
  10. android 获取屏幕的宽和高
  11. 嵌入在网页上Flash媒体播放器(1)
  12. SAO代码解析补充(二)
  13. 用NE5532运算放大器制作降噪耳机
  14. Hadoop原理与安装
  15. Windows 7 万能驱动下载 免费
  16. ZZUNOJ 1008 美元和人民币
  17. 迅捷画图中套用流程图模板编辑方法介绍
  18. rtf格式转word格式
  19. 揭秘Facebook官方底层C++底层函数Folly
  20. 爬虫技术——一篇全搞定!

热门文章

  1. 如何使用GDAL/OGR打开矢量并输出每个面外界矩形范围内的point数据
  2. VirtualBox“切换到无缝模式”和“自动调整显示尺寸”菜单无法使能
  3. HUAWEI华为笔记本电脑 荣耀MagicBook 16锐龙5 5600H(HYM-W56)原装出厂Windows10系统恢复原厂OEM系统21H1
  4. 微信小程序申请开通了流程
  5. 微信小程序申请地理位置接口wx.getLocation不通过的应对方案 过率很高
  6. HDU 2853 Assignment (KM算法)
  7. C语言经典——闰年问题
  8. JavaScript:设为首页-加入收藏-联系我们的代码
  9. 栈和队列---最大值减去最小值小于或等于num的子数组数量
  10. python基础--除法、地板除、取余