个人第一次编程作业
| 这个作业属于哪个课程 | 信安1912-软件工程 (广东工业大学 - 计算机学院) |
|---|---|
| 这个作业要求在哪里 | 作业链接 |
| 这个作业的目标 | 论文查重算法设计+学习PSP表格+单元测试+JProfiler性能分析+Git管理 |
1. GitHub链接
tip:可运行的jar包在out/artifact中,下载时需一同下载data文件夹并将其放在和jar包同一目录下。
2.计算模块接口的设计与实现过程
2.1工程总览

2.2主要的类
FileEmptyException:用于抛出空文件异常
BufferedInputFile:在读取文件时,使用缓冲流和StringBuilder提升性能
MySimHash(关键类):对字符串进行分词、获取哈希值、加权、合并、降维操作,并计算两字符串的海明距离,计算相似度
application:主程序
2.3主要函数及其功能
simhash算法分为5个步骤:分词、hash、加权、合并、降维,具体过程如下所述:
2.3.1分词
给定一段语句,进行分词,得到有效的特征向量,然后为每一个特征向量设置1-5等5个级别的权重(如果是给定一个文本,那么特征向量可以是文本中的词,其权重可以是这个词出现的次数)。例如给定一段语句:“CSDN博客结构之法算法之道的作者July”,分词后为:“CSDN 博客 结构 之 法 算法 之 道 的 作者 July”,然后为每个特征向量赋予权值:CSDN(4) 博客(5) 结构(3) 之(1) 法(2) 算法(3) 之(1) 道(2) 的(1) 作者(5) July(5),其中括号里的数字代表这个单词在整条语句中的重要程度,数字越大代表越重要。
2.3.2hash(BigInteger hash(String source))
通过hash函数计算各个特征向量的hash值,hash值为二进制数01组成的n-bit签名。比如“CSDN”的hash值Hash(CSDN)为100101,“博客”的hash值Hash(博客)为“101011”。就这样,字符串就变成了一系列数字。
这里分词后,通过hash函数计算各个分词的hash值。

2.3.3加权
在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,其余特征向量类似此般操作。
这里规定分词的权重。

2.3.4合并
将上述各个特征向量的加权结果累加,变成只有一个序列串。拿前两个特征向量举例,例如“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”。
在这里对单个hash后的分词进行特征向量化,转成特定位数的特征向量,通过加权后合并。

2.3.5降维
对于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签名。
通过此处降维,返回文档的SimHash。

2.3.6独到之处
这里可以对html代码进行过滤。

2.4分包总览

2.5实际命令行运行效果

3.计算模块接口部分的性能改进
3.1类的占用情况*

3.2堆内存情况

3.3改进方法
在读取文件时,使用缓冲流和StringBuilder提升性能。

4.计算模块部分单元测试展示
使用junit进行单元测试。


测试结果

5.计算模块部分异常处理说明
异常处理主要是两个,一是比较文件中有空文件,此时无需比较;二是文件路径不正确,不能找到文件。
5.1发现空文件


测试结果

5.2路径错误0
用File类里面自带的异常。

测试结果

5.3测试文件输出参数出错的情况
代码如下(只展示部分代码):

测试结果

5.4代码覆盖率

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

8.个人总结
这次的项目一开始很迷茫,不知道从那开始,于是我就先填写了PSP表格计划时间然后寻找了其他同学的作业进行参考,然后再根据psp表格一步步地完成对应的模块。因为我使用的是SimHash算法,所以主要遇到的问题是理解SimHash算法有困难,但只要是理解了算法核心部分,开发起来就变得容易许多。以及一些与代码无关的路径配置问题,特别是对jar包的安装,应该是我下载的jar包的问题,他是把路径给限死了且无法更改,这就导致我在IDEA上可以运行,但用用cmd就无法执行,于是通过询问同学,最终通过将data包放进jar包的同一目录下,用cmd才得以运行。总的来说,这次个人项目作业我也收获了许多,虽然遇到了一些瓶颈,但也陆陆续续解决了,提高了解决问题的能力,发现了更多解决问题的渠道。

浙公网安备 33010602011771号