第一次个人编程作业
| 软件工程 | 网工1934-软件工程 (广东工业大学 - 计算机学院) |
|---|---|
| 作业要求 | 设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率 |
| 作业目标 | 1.在Github仓库中新建一个学号为名的文件夹。 2.在开始实现程序之前,在PSP表格记录估计在程序开发各个步骤上耗费的时间,在实现程序之后,在PSP表格记录在程序的各个模块上实际花费的时间。 3.使用C++ 、Java语言或者python3实现,提交python代码时请附带上requirements.txt,C++请使用Visual Studio Community 2017进行开发,运行环境为64-bit Windows 10。对于C++/Java,还需将编译好的程序发布到Github仓库中的releases中。 4.提交的代码要求经过Code Quality Analysis工具的分析并消除所有的警告。 5.完成项目的首个版本之后,请使用性能分析工具Studio Profiling Tools来找出代码中的性能瓶颈并进行改进。 5.使用Github来管理源代码和测试用例,代码有进展即签入Github。 6.使用单元测试对项目进行测试,并使用插件查看测试分支覆盖率等指标;写出至少10个测试用例确保你的程序能够正确处理各种情况。 |
GitHub 链接
一、PSP表格
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | ||
| · Estimate | · 估计这个任务需要多少时间 | 720 | 740 |
| Development | 开发 | ||
| · Analysis | · 需求分析 (包括学习新技术) | 240 | 180 |
| · Design Spec | · 生成设计文档 | 40 | 30 |
| · Design Review | · 设计复审 | 10 | 10 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 20 |
| · Design | · 具体设计 | 60 | 50 |
| · Coding | · 具体编码 | 180 | 240 |
| · Code Review | · 代码复审 | 60 | 100 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 40 | 30 |
| Reporting | 报告 | ||
| · Test Report | · 测试报告 | 30 | 40 |
| · Size Measurement | · 计算工作量 | 20 | 20 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 20 |
| 合计 | 720 | 740 |
二、计算模块接口的设计与实现过程。
共使用了四个类
PaperCheck 类
是main方法所在的类,可调用其他类的静态方法实现需求
IO 类
实现读写功能的类
SimHash 类
计算 SimHash 值的类
Hamming 类
计算海明距离与重复率的类
各类之间关系

关键算法
关键算法是重复率的算法,我使用了 SimHash 加上海明距离的算法
SimHash算法分为五步
一、分词
把需要判断的文本分词形成这个文章的特征单词。最后形成去掉噪音词的单词序列并为每个词加上权重,我们假设权重分为5个级别(1~5)。比如:“美国“51区”雇员称内部有9架飞碟,曾看见灰色外星人 ” ==> 分词后为“美国(4) 51区(5) 雇员(3) 称(1) 内部(2) 有(1) 9架(3) 飞碟(5) 曾(1) 看见(3) 灰色(4) 外星人(5)”,括号里是代表单词在整个句子里重要程度,数字越大越重要。
二、Hash
通过 Hash 算法把每个词变成 Hash 值,比如“美国”通过 Hash 算法计算为 1 0 0 1 0 1 ,“51区”通过 Hash 算法计算为 1 0 1 0 1 1 。这次我使用了 MD5 形成 Hash 值。
三、加权
通过步骤 2 的生成结果,需要按照单词的权重形成加权数字串,比如“美国”的 Hash 值为 1 0 0 1 0 1 ,通过加权计算为 4 -4 -4 4 -4 4 ,“51区”的 Hash 值为 1 0 1 0 1 1 ,通过加权计算为 5 -5 5 -5 5 5 。
四、合并
把上面各个单词算出来的序列值累加,变成只有一个序列串。比如“美国”的 4 -4 -4 4 -4 4 ,“51区”的 5 -5 5 -5 5 5 , 把每一位进行累加,4+5 -4+-5 -4+5 4+-5 -4+5 4+5 ==> 9 -9 1 -1 1 9 。
五、降维
把步骤 4 算出来的 9 -9 1 -1 1 9 变成 0 1 串,形成我们最终的SimHash签名。 如果每一位大于 0 记为 1 ,小于 0 记为 0 。最后算出结果为:1 0 1 0 1 1 。
而海明距离则是比较两个 SimHash 值差异的位数,通过比较差异的位数就可以得到两串文本的差异,通常认为海明距离<3的是高度相似的文本。
三、计算模块接口部分的性能改进。

四、计算模块部分单元测试展示。
一、IO 类测试

测试结果
二、SimHash 类测试

测试结果
三、Hamming 类测试

测试结果
四、PaperCheck 类测试

测试结果
五、覆盖率

有些异常未发生,catch代码未运行,故未能全覆盖
五、计算模块部分异常处理说明。
一、读取文件失败(没有该文件/路径错误)

错误报告
六、项目程序功能测试








浙公网安备 33010602011771号