作业所属课程 | https://edu.cnblogs.com/campus/gdgy/InformationSecurity1912-Softwareengineering |
---|---|
作业要求 | https://edu.cnblogs.com/campus/gdgy/InformationSecurity1912-Softwareengineering/homework/12146 |
这个作业的目标 | 实现论文查重算法,学习使用PSP表格,学习使用性能分析工具和代码质量检测工具 |
https://github.com/long0724/3119005420
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 35 |
Estimate | 估计这个任务需要多少时间 | 20 | 20 |
Development | 开发 | 300 | 360 |
Analysis | 需求分析 (包括学习新技术) | 40 | 40 |
Design Spec | 生成设计文档 | 60 | 50 |
Design Review | 设计复审 | 30 | 30 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 15 | 20 |
Design | 具体设计 | 30 | 45 |
Coding | 具体编码 | 230 | 270 |
Code Review | 代码复审 | 30 | 45 |
Test | 测试(自我测试,修改代码,提交修改) | 30 | 30 |
Reporting | 报告 | 60 | 70 |
Test Repor | 测试报告 | 20 | 30 |
Size Measurement | 计算工作量 | 10 | 15 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 45 |
合计 | 935 | 1105 |
项目结构
类PaperCheckMain:该类包含主函数main方法。
类IoUtils:包含read和write方法,对txt文件进行读取和写入操作。
类CalSimHashUtil:getHash函数通过调用byte2str和hexStrToBinaryStr函数实现将每一个字符转为二进制字符串,返回该二进制字符串。getSimHash函数通过调用getHash函数来计算simhash。
类CalHamDistanceUtil:用已经计算的simhash来计算海明距离。
类CalSimilarity:通过海明距离计算两个文本的相似度,得出最后结果。
算法使用的是Simhash算法:
算法参考文档:https://blog.csdn.net/lance_yan/article/details/10304747
算法的关键之处:
首先使用Hanlp中的extractKeyword提取出关键字(HanLP是一系列模型与算法组成的NLP工具包),然后对每一个关键字进行MD5加密处理(实例化一个MessageDigest对象,通过提供的静态的getInstance方法),使其返回字节数组,然后再将字节数组中字节先转为十六进制的字符串,最后转为二进制字符串,得出每个关键字的对应的二进制字符串。
然后simhash函数再遍历扫描每个关键字的二进制字符串,分别进行加权计算,最后再将加权计算的结果进行降维,得出每一篇文章对应的128位二进制字符串,最后根据两篇文章的二进制字符串求海明距离,进而求出两篇文章的相似度。
概览
实时内存
手动GC后
堆遍历器
大部分时间花在分词上(调用Hanlp)
花费时间最多的函数
AllTest
该类测试原文件与被检测文件的查重率,并看能否正常输出
测试结果
AddTest
该类测试原文件与orig_0.8_add.txt
测试结果
(原文件与其他校验文件的检测类似,仅需修改文件路径)
getHammingDistanceTest
该类测试海明距离
测试结果
getHashTest
该类测试每个关键字的hash值计算
测试结果
(当某个关键字为空时返回null)
CalSimilarityTest
该类测试两篇文章的相似度
测试结果
getSimHashTest
该类计算两篇文章对应的simhash
测试结果
ReadTrueTest
该类实现对txt文件的读取
测试结果
WriteTrueTest
该类将字符串写入到txt文件中
测试结果(将字符串“666.66”写入txt文件)
读取错误处理
读取异常测试
测试结果
写入错误处理
写入异常测试
测试结果