个人编程作业:论文查重

发布时间:2022-07-05 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了个人编程作业:论文查重脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
这个作业属于哪个课程 班级的链接
这个作业要求在哪里 作业要求的链接
这个作业的目标 设计一个论文查重算法;学习单元测试

1.GITHub链接

我的GitHub

2.计算模块接口的设计与实现过程

工程结构图:

个人编程作业:论文查重

设有四个模块,分别是主模块、海明距离模块、读入文档模块和SimHash模块。

  • 主模块

类:Main 读出写入文档内容后得到对应的SimHash值,再通过SimHash值求出相似度,最后将结果写入结果文档中输出。

  • 海明距离模块

类:HammingDistance getHammingDistance方法求得海明距离。 getSimilarity方法通过海明距离计算出相似度。 每篇文档得到SimHash签名值后,接着计算两个签名的海明距离即可。根据经验值,对64位的SimHash值,海明距离在3以内的可认为相似度比较高。 海明距离的求法:异或时,只有在两个比较的位不同时其结果是1,否则结果为0,两个二进制“异或”后得到1的个数即为海明距离的大小。 举个例子,上面我们计算到的“CSDN博客”的simhash签名值为“1 0 1 0 1 1”,假定我们计算出另外一个短语的签名值为“1 0 1 0 0 0”,那么根据异或规则,我们可以计算出这两个签名的海明距离为2,从而判定这两个短语的相似度是比较高的。

  • 读入文档模块

类:readToString reaDFile方法将文档读入。 writeFile方法将文档写出。

  • SimHash模块(核心模块)

类:SimHash SimHash的流程示意图:

个人编程作业:论文查重

@H_512_82@

1.分词 给定一段语句,进行分词,得到有效的特征向量,然后为每一个特征向量设置1-5等5个级别的权重(如果是给定一个文本,那么特征向量可以是文本中的词,其权重可以是这个词出现的次数)。本次所使用的是HanLP分词 2.hash 通过hash函数计算各个特征向量的hash值,hash值为二进制数01组成的n-bit签名。 3.加权 在hash值的基础上,给所有特征向量进行加权,即W = Hash * weight,且遇到1则hash值和权值正相乘,遇到0则hash值和权值负相乘。 4.合并 将上述各个特征向量的加权结果累加,变成只有一个序列串。 5.降维 对于n-bit签名的累加结果,如果大于0则置1,否则置0,从而得到该语句的simhash值,最后我们便可以根据不同语句simhash的海明距离来判断它们的相似度。

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

  • JPRofiler测试性能

个人编程作业:论文查重

个人编程作业:论文查重

由分析图可得,此程序运行时内存消耗最多、调用次数最多的是HanLP的分词。

运行结果可能未能达到那么精确,在学习过程中了解到小篇幅的文档更适合使用余弦进行查重,大篇幅的文档更适合SimHash,这样能做到更准确。 还了解到一种根据抽屉/鸽巢原理的一种算法:我们可以把 64 位的二进制simhash签名均分成4块,每块16位。根据鸽巢原理(也称抽屉原理),如果两个签名的海明距离在 3 以内,它们必有一块完全相同。然后把分成的4 块中的每一个块分别作为前16位来进行查找,建倒排索引。如此,如果样本库中存有234(差不多10亿)的simhash签名,则每个table返回2(34-16)=262144个候选结果,大大减少了海明距离的计算成本。 示意图:

个人编程作业:论文查重

对于这种算法我能够大概理解,但是具体的程序步骤还需要多加推敲,目前还不能很好地写出。

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

  • 代码覆盖率

个人编程作业:论文查重

个人编程作业:论文查重

(ShortString为文本长度过短时处理的类)

  • 主模块测试

主要代码:

个人编程作业:论文查重

测试结果:

个人编程作业:论文查重

个人编程作业:论文查重

个人编程作业:论文查重

  • 海明距离模块测试

主要代码:

个人编程作业:论文查重

测试结果:

个人编程作业:论文查重

个人编程作业:论文查重

(当两个str长度不相同时返回-1)

  • 读入文档模块测试

主要代码: 测试正常情况下读出、写入文档:

个人编程作业:论文查重

测试路径无效时读出、写入文档:

个人编程作业:论文查重

测试结果:

个人编程作业:论文查重

  • SimHash模块测试

主要代码:

个人编程作业:论文查重

测试结果:

个人编程作业:论文查重

个人编程作业:论文查重

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

考虑了当读入文档长度过短,分词时无法取得关键字。 ShortString代码:

个人编程作业:论文查重

测试代码:

个人编程作业:论文查重

测试结果:

个人编程作业:论文查重

个人编程作业:论文查重

6.PSP

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

7.个人感想

这次个人编程作业对于我来说是一个比较大的挑战,因为对java变得稍为生疏了,重点花了时间去学习SimHash算法的原理以及如何用java去实现,还有对分词方法的挑选,在将算法导出成jar包时出了一点问题,上网查找问题以及向同学请教。 参考网址: SimHash算法及原理简介 Intellij Idea 将java项目打包成jar

脚本宝典总结

以上是脚本宝典为你收集整理的个人编程作业:论文查重全部内容,希望文章能够帮你解决个人编程作业:论文查重所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。