第一次个人编程作业
第一次个人编程作业
这个作业属于哪个课程 | 软件工程-19信安2 |
---|---|
这个作业要求在哪里 | 作业要求 |
这个作业的目标 | 实现论文查重算法+PSP表格+使用JProfiler性能分析 |
1、代码链接
2、模块接口的设计与实现过程
2.1使用SimHash算法计算文本相似度
SimHash简介:SimHash作为局部敏感哈希的一种,其主要思想是降维。通过将一篇若干文字的文本内容通过降维后,可能仅仅得到一个长度为32或64位的二进制由01组成的字符串。通过对比两篇文本内容的SimHash各个位上0与1的差异个数(即海明距离),即可判断两者文本相似度。
例子如下:
2.2主要的类
2.2.1UML类图如下:
-
TxtChecking类:主程序所在类
-
TextIOUtil类:控制输入输出流的工具类
-
HammingUtil类:获取海明距离与文本相似度的工具类
-
SimhashUtil(关键)类:获取文本Simhash值的工具类
2.2.2程序运行中各类的关系:
在程序运行过程中,先通过readTxt()进行txt文件的读取,由getSimilarity()调用内部方法getHammingDistance()获取海明距离,进而由getHammingDistance()调用getSimhash()
获取文本的Simhash值。
2.3 关键函数
getSimhash()
-
分词 :本项目中为简化分词过程使用了HanLP包,对文本进行分词处理
-
获取HashCode :调用getHash()获取每个词的哈希值
-
加权与合并:通过词语出现的频率对进行加权处理,出现频率高的权重也相对高(反之亦然);并将每个词语中相同索引位置的哈希值相加,最终将得到整个文本加权哈希值相加后的总和
关于词频的获取如下:
- 降维:将得到的哈希值每个索引位置中大于0的置为1,而1置为0,形成Simhash签名
3、计算模块接口部分的性能改进
使用JUnit4进行单元测试,使用JProfiler进行性能分析
3.1遥测概述
3.2CPU负载
3.3类占用内存
3.4函数耗时
性能改进:由于耗时最多的操作为HanLP包的分词操作,目前并不具备性能改进的方法
4、计算模块部分单元测试展示
4.1部分测试代码如下
4.2测试结果如下:
4.2.1IDEA内结果
4.2.2输出相似度到相应记事本
4.3命令行测试
-
传参方法:- Java: java -jar main.jar [原文文件] [抄袭版论文的文件] [答案文件]
以下展示部分测试结果
4.4代码覆盖率
5.计算模块部分异常处理说明
测试文件路径输入错误
测试代码如下:
测试结果:
6、花费时间
PSP表格
*PSP2.1* | *Personal Software Process Stages* | *预估耗时(分钟)* | *实际耗时(分钟)* |
---|---|---|---|
Planning | 计划 | 30 | 40 |
· Estimate | · 估计这个任务需要多少时间 | 50 | 60 |
Development | 开发 | 300 | 320 |
· Analysis | · 需求分析 (包括学习新技术) | 240 | 300 |
· Design Spec | · 生成设计文档 | 60 | 60 |
· Design Review | · 设计复审 | 30 | 20 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 10 |
· Design | · 具体设计 | 90 | 60 |
· Coding | · 具体编码 | 120 | 150 |
· Code Review | · 代码复审 | 30 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 80 |
Reporting | 报告 | 180 | 200 |
· Test Repor | · 测试报告 | 50 | 60 |
· Size Measurement | · 计算工作量 | 20 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 40 |
· 合计 | 1310 | 1440 |
7、总结
- 在这一次个人项目中,接触到了许多没有使用过的工具,对于我来说这种学习的过程也是富有挑战性的
- 在实现算法的过程中查阅了许多资料,而学习一种新算法得到过程也是充实的
- 功能的模块化与代码书写的规范性对于一个程序而言是非常重要的