个人项目:论文查重
这个作业属于哪个课程 | <计科22级34班> |
---|---|
这个作业要求在哪里 | <作业要求> |
这个作业的目标 | <1.在Github仓库中新建一个学号为名的文件夹。2.用PSP表格记录下估计和实际在程序开发各个步骤上耗费的时间。3.使用C++ 、Java语言或者python3实现论文查重。4.提交的代码要求经过Code Quality Analysis工具的分析并消除所有的警告。5.完成项目的首个版本之后,请使用性能分析工具Studio Profiling Tools来找出代码中的性能瓶颈并进行改进。6.使用Github来管理源代码和测试用例,代码有进展即签入Github。7.使用单元测试对项目进行测试,并使用插件查看测试分支覆盖率等指标;写出至少10个测试用例确保程序能够正确处理各种情况。> |
一、Github仓库
二、PSP表
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 90 | 90 |
· Estimate | · 估计这个任务需要多少时间 | 45 | 60 |
Development | 开发 | 120 | 150 |
· Analysis | · 需求分析 (包括学习新技术) | 60 | 60 |
· Design Spec | · 生成设计文档 | 60 | 60 |
· Design Review | · 设计复审 | 60 | 60 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 60 | 60 |
· Design | · 具体设计 | 60 | 60 |
· Coding | · 具体编码 | 30 | 30 |
· Code Review | · 代码复审 | 30 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 180 | 150 |
Reporting | 报告 | 60 | 60 |
· Test Repor | · 测试报告 | 60 | 60 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmorte· 合计m & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
· 合计 | 955 | 970 |
三、需求分析
题目:论文查重
描述如下:
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:
从命令行参数给出:论文原文的文件的绝对路径。
从命令行参数给出:抄袭版论文的文件的绝对路径。
从命令行参数给出:输出的答案文件的绝对路径。
我们提供一份样例,课堂上下发,上传到班级群,使用方法是:orig.txt是原文,其他orig_add.txt等均为抄袭版论文。
注意:答案文件中输出的答案为浮点型,精确到小数点后两位
四、计算模块接口的设计与实现
1.核心算法:
(1)SimHash算法:
- SimHash算法主要有五个过程:分词、Hash、加权、合并、降维。
- 具体可参考SimHash原理与实现。
(2)计算海明距离:
- 简单的说,海明距离可以理解为,两个二进制串之间相同位置不同值的个数。举个例子,[1,1,1,0,0,0]和[1,1,1,1,1,1]的海明距离就是3。
- 在处理大规模数据的时候,我们一般使用64位的SimHash,正好可以被一个long型存储。这种时候,海明距离在3以内就可以认为两个文本是相似的。
2.实现思路:
3.接口实现:
(1)读写txt文件模块:
类:TextIO
方法:
- readTxt:传入文件绝对路径,将文件内容转化为 String字符串输出。
- writeTxt:传入内容、文件全路径名,将内容写入文件并换行。
(2)计算SimHash模块:
类:SimHash
方法:
- getHash:输入一个词,获取词的hash值。
- getSimHash:获取字符串的SimHash值。
主要流程:
-
分词:使用了外部依赖汉语言处理hankcs包提供的接口,把需要判断的文本分词形成这个文章的特征单词。
-
获取hash值:通过hash算法把每个词变成hash值。
-
加权、合并:通过 2步骤的hash生成结果,按照单词的权重形成加权数字串,把上面各个单词算出来的序列值累加,变成一个序列串。
-
降维:把4步算出来的序列串变成 0 1 串,形成最终的SimHash。
(3)计算海明距离模块:
类:Hamming
方法:
-
getHammingDistance:输入两个simHash值,计算它们的海明距离。
-
getSimilarity:输入两个simHash值,输出它们的相似度。
通过比较差异的位数就可以得到两串文本的差异,差异的位数,称之为“海明距离”,通常认为海明距离<3的是高度相似的文本。
(4)Main主模块:
类:Main
主要流程:
- 调用TextIO,从命令行输入的绝对路径名读取对应的文件,将文件的内容转化为对应的字符串;
- 调用SimHash,由字符串得出对应的 simHash值;
- 调用Hamming,由 simHash值求出相似度;
- 调用TextIO,把相似度写入最后的结果文件中。
五、性能改进
1.overview:
2.方法调用情况:
六、单元测试展示
1.TextIOTest:
(1)代码:
(2)测试结果:
2.TextExceptionTest:
(1)代码:
(2)测试结果:
3.SimHashTest:
(1)代码:
(2)测试结果:
4.HammingTest:
(1)代码:
(2)测试结果:
5.MainTest:
(1)代码:
(2)测试结果:
七、异常处理说明:
当文本长度太短时,HanLp无法取得关键字,需要抛出异常。
实现了一个处理这个异常的类:ShortStringException