个人第一次编程作业

这个作业属于哪个课程 信安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才得以运行。总的来说,这次个人项目作业我也收获了许多,虽然遇到了一些瓶颈,但也陆陆续续解决了,提高了解决问题的能力,发现了更多解决问题的渠道。

posted @ 2021-09-19 18:21  SYongg  阅读(83)  评论(0)    收藏  举报