噫饭Kris

导航

第一次个人编程作业

这个作业属于哪个课程 计科国际班软工
这个作业要求在哪里 要求
这个作业的目标 论文查重程序
1.GitHub地址https://github.com/Kris-0614/3119009426
2.PSP表格
PSP2.1 Personal Software Process Stages
--------------------------------------- --------------------------------
Planning 计划
· Estimate · 估计这个任务需要多少时间
Development 开发
· Analysis · 需求分析 (包括学习新技术)
· Design Spec · 生成设计文档
· Design Review · 设计复审
· Coding Standard · 代码规范 (为目前的开发制定合适的规范)
· Design · 具体设计
· Coding · 具体编码
· Code Review · 代码复审
· Test · 测试(自我测试,修改代码,提交修改)
Reporting 报告
· Test Repor · 测试报告
· Size Measurement · 计算工作量
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划
Sum up 合计

3、设计思路
通过在网上查找资料,了解到论文查重有两个常用的算法,分别是利用TF-IDF与余弦相似性和海明距离来判断文本的相似度,我在个人项目中采用了SimHash算法,过对不同文本的SimHash值进而比较海明距离,从而判断两个文本的相似度。
SimHash算法原理

1.分词
对给定的一段文本进行分词,产生n个特征词,并赋予每个特征词一个权重。比如一段文本为“中国科大计算机系的学生的能力怎么样”,产生的特征词就应该是“中国科大”、“计算机系”、“的”、“学生”、“能力”、“怎么样”,然后对这些词分别赋予权重,假设有1-5五个分类,分词之后以上五个词便会各有一个权重,比如中国科大(4)、计算机系(3)、的(1)、学生(4)、能力(5)、怎么样(3)。
其中,数字越大,代表特征词在句子中的重要性就越高。这样,我们就得到了一个文本的分词的词向量和每个词向量对应的权重。

2.Hash
通过hash函数对每一个词向量进行映射,产生一个n位二进制串,比如CSDN的hash值就是100101。

3.加权
前面的计算我们已经得到了每个词向量的Hash串和该词向量对应的权重,这一步我们计算权重向量W=hash*weight。
具体的计算过程如下:hash二进制串中为1的乘以该特征词的分词权重,二进制串中为0的乘以该特征词的分词权重后取负,继而得到权重向量。
举个例子,CSDN的hash二进制串是100101,CSDN的权重是3,那么生成的权重向量就是[3,-3,-3,3,-3,3]。

4.合并
对于一个文本,我们计算出了文本分词之后每一个特征词的权重向量,在合并这个阶段,我们把文本所有词向量的权重向量相累加,得到一个新的权重向量,形如[3,4,1,5,-5,1]

5.降维
对于前面合并后得到的文本的权重向量,大于0的位置1,小于等于0的位置0,就可以得到该文本的SimHash值,以上面提到的[3,4,1,5,-5,1]为例,我们得到[1,1,1,1,0,1]这个bit串,也就是论文中提及的该文本的指纹。
到此为止,我们已经计算出了一个文本的SimHash值。那么,如何判断两个文本是否相似呢?我们要用到海明距离。

6.由公式,将汉明距离带入x即可计算出文本相似度

参考文章:SimHash算法原理

4、项目各模块设计

5.部分代码展示
计算汉明距离,得到查重率

6.计算模块接口部分的性能
JVM监控工具

线程监控

内存监控

7.项目测试结果
单元测试 多个测试文本重复率

结果

计算模块部分异常处理
空白文本异常

posted on 2021-09-19 12:54  噫饭Kris  阅读(61)  评论(0编辑  收藏  举报