第一次个人编程作业

这个作业属于哪个课程 软件工程
这个作业要求在哪里 作业要求
这个作业的目标 完成论文查重代码上传到github上,完成github项目编写
Github链接

一、PSP表格

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

二、模块接口的设计与实现过程

1、程序流程图

2、关键功能的实现说明

要实现文本查重功能,可以通过SimHash+海明距离算法和中文分词器,这里参考了SimHash算法HanLP使用简介

simhash算法分为5个步骤:分词、hash、加权、合并、降维,具体过程如下所述:

分词

给定一段语句,进行分词,得到有效的特征向量,然后为每一个特征向量设置1-5等5个级别的权重(如果是给定一个文本,那么特征向量可以是文本中的词,其权重可以是这个词出现的次数)。例如给定一段语句:“CSDN博客结构之法算法之道的作者July”,分词后为:“CSDN 博客 结构 之 法 算法 之 道 的 作者 July”,然后为每个特征向量赋予权值:CSDN(4) 博客(5) 结构(3) 之(1) 法(2) 算法(3) 之(1) 道(2) 的(1) 作者(5) July(5),其中括号里的数字代表这个单词在整条语句中的重要程度,数字越大代表越重要。

hash

通过hash函数计算各个特征向量的hash值,hash值为二进制数01组成的n-bit签名。比如“CSDN”的hash值Hash(CSDN)为100101,“博客”的hash值Hash(博客)为“101011”。就这样,字符串就变成了一系列数字。

加权

在hash值的基础上,给所有特征向量进行加权,即W = Hash * weight,且遇到1则hash值和权值正相乘,遇到0则hash值和权值负相乘。例如给“CSDN”的hash值“100101”加权得到:W(CSDN) = 100101 4 = 4 -4 -4 4 -4 4,给“博客”的hash值“101011”加权得到:W(博客)=101011 5 = 5 -5 5 -5 5 5,其余特征向量类似此般操作。

合并

将上述各个特征向量的加权结果累加,变成只有一个序列串。拿前两个特征向量举例,例如“CSDN”的“4 -4 -4 4 -4 4”和“博客”的“5 -5 5 -5 5 5”进行累加,得到“4+5 -4+-5 -4+5 4+-5 -4+5 4+5”,得到“9 -9 1 -1 1”。

降维

对于n-bit签名的累加结果,如果大于0则置1,否则置0,从而得到该语句的simhash值,最后我们便可以根据不同语句simhash的海明距离来判断它们的相似度。例如把上面计算出来的“9 -9 1 -1 1 9”降维(某位大于0记为1,小于0记为0),得到的01串为:“1 0 1 0 1 1”,从而形成它们的simhash签名。

3、项目结构


Main:项目入口
HammingUtils类:计算Hamming距离和相似度
TxtIOUtils类:读写文件
SimHashUtils类:计算hash值和SimHash值
ShortStringException类:异常处理

三、计算模块接口部分的性能改进



从上图可以看出调用次数最多的是int[]和HanLP。

四、具体的测试案例

1、HammingUtilsTest类测试


测试结果

2、TxtIOUtilsTest类测试


测试结果

3、SimHashUtilsTest类测试


测试结果

4、MainTest类测试



测试结果

代码覆盖率:

五、模块部分异常处理说明

1、文本过短


测试结果

2、路径不存在


测试结果

3、程序参数设置

当参数不为3时,测试结果

六、实际测试效果

将绝对路径写入程序参数

对比orig.txt和orig_0.8_del.txt
效果截图

posted @ 2021-09-19 21:12  ffw145  阅读(28)  评论(0编辑  收藏  举报