个人项目
1、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 15 | 10 |
Estimate | 估计这个任务需要多少时间 | 1040 | 1500 |
Development | 开发 | 730 | 950 |
Analysis | 需求分析 | 30 | 22 |
Design Spec | 生成设计文档 | 16 | 18 |
Design Review | 设计复审 | 12 | 26 |
Coding Standard | 代码规范 | 6 | 5 |
Design | 具体设计 | 23 | 36 |
Coding | 具体编码 | 500 | 780 |
Code Review | 代码复审 | 60 | 48 |
Test | 测试(自我测试,修改代码,提交修改) | 150 | 200 |
Reporting | 报告 | 40 | 30 |
Test Repor | 测试报告 | 36 | 25 |
Size Measurement | 计算工作量 | 20 | 15 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 20 | 40 |
合计 | 1040 | 1500 |
2、设计思路
通过在网上查找资料,了解到论文查重有两个常用的算法,分别是利用TF-IDF与余弦相似性和汉明距离来判断文本的相似度,我在个人项目中采用了SimHash算法,过对不同文本的SimHash值进而比较海明距离,从而判断两个文本的相似度。
SimHash算法原理
-
分词
对给定的一段文本进行分词,产生n个特征词,并赋予每个特征词一个权重。比如一段文本为“中国科大计算机系的学生的能力怎么样”,产生的特征词就应该是“中国科大”、“计算机系”、“的”、“学生”、“能力”、“怎么样”,然后对这些词分别赋予权重,假设有1-5五个分类,分词之后以上五个词便会各有一个权重,比如中国科大(4)、计算机系(3)、的(1)、学生(4)、能力(5)、怎么样(3)。
其中,数字越大,代表特征词在句子中的重要性就越高。这样,我们就得到了一个文本的分词的词向量和每个词向量对应的权重。 -
Hash
通过hash函数对每一个词向量进行映射,产生一个n位二进制串,比如CSDN的hash值就是100101。 -
加权
前面的计算我们已经得到了每个词向量的Hash串和该词向量对应的权重,这一步我们计算权重向量W=hash*weight。
具体的计算过程如下:hash二进制串中为1的乘以该特征词的分词权重,二进制串中为0的乘以该特征词的分词权重后取负,继而得到权重向量。
举个例子,CSDN的hash二进制串是100101,CSDN的权重是3,那么生成的权重向量就是[3,-3,-3,3,-3,3]。 -
合并
对于一个文本,我们计算出了文本分词之后每一个特征词的权重向量,在合并这个阶段,我们把文本所有词向量的权重向量相累加,得到一个新的权重向量,形如[3,4,1,5,-5,1] -
降维
对于前面合并后得到的文本的权重向量,大于0的位置1,小于等于0的位置0,就可以得到该文本的SimHash值,以上面提到的[3,4,1,5,-5,1]为例,我们得到[1,1,1,1,0,1]这个bit串,也就是论文中提及的该文本的指纹。
到此为止,我们已经计算出了一个文本的SimHash值。那么,如何判断两个文本是否相似呢?我们要用到海明距离。 -
由公式
,将汉明距离带入x即可计算出文本相似度
计算查重率流程
3、项目各模块设计和具体实现
项目结构
具体实现
1、读写文本
2、将文本分词
使用IKanalyzer包将文本分成多个词
3、Hash
用hash函数将每个分词映射成一串二进制数
4、加权
由于没有找到什么方法能让程序自动给每个分词赋予权重,所以每个分词的权重都设置成1
5、合并降维
将每个分词映射得到的二进制数字串降维并相加,得到文本的SimHash值
6、计算汉明距离,得到查重率
计算模块接口部分的性能
可以发现内存消耗最大的方法是用于分词操作的方法,这也是难度最大的操作
计算模块部分单元测试展示
SimHash类相关方法测试
1、hash方法:将每个分词映射到一个二进制数
2、simHash方法:输出文本的SimHash值
SimHash值计算结果:
Similaraty类相关方法测试
1、hammingDistance方法:计算两个文本的汉明距离
可以得到两个汉明距离分别为33和35,区别不是很大,应该是没有给每个分词赋予不同权重导致的
2、getSimilar方法:计算两个文本的重复率
计算结果:
Compare类相关方法测试
1、ans方法:读入两个文本,计算重复率
计算结果:
2、main方法
单元测试覆盖率
计算模块部分异常处理说明
1、空文本
测试样例:
测试结果:
2、输入参数不够
测试样例:
测试结果:
4、项目功能测试
![](https://img2020.cnblogs.com/blog/2525628/202109/2525628-20210919100124750-1320919890.png)
![](https://img2020.cnblogs.com/blog/2525628/202109/2525628-20210919100350946-1397148396.png)