第一次个人编程作业
这个作业属于哪个课程 | 软件工程 |
---|---|
这个作业要求在哪里 | 作业要求 |
这个作业的目标 | 完成论文查重代码上传到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
效果截图