个人项目

软件工程 https://edu.cnblogs.com/campus/gdgy/networkengineering1934-Softwareengineering
作业要求 https://edu.cnblogs.com/campus/gdgy/networkengineering1934-Softwareengineering/homework/12137
作业目标 通过独立完成个人项目熟悉软件开发流程,提高编程能力

作业github链接

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算法原理

  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算法原理

计算查重率流程

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、项目功能测试

posted @ 2021-09-19 10:13  freedom62  阅读(81)  评论(0编辑  收藏  举报