第一次个人编程作业
这个作业属于哪个课程 | 22计科12班 |
---|---|
这个作业要求在哪里 | 作业 |
这个作业的目标 | 设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率 |
Github仓库链接:https://github.com/HappyClockniniwong/HappyClockniniwong
项目开发要求
题目:论文查重
描述如下:
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:
从命令行参数给出:论文原文的文件的绝对路径。
从命令行参数给出:抄袭版论文的文件的绝对路径。
从命令行参数给出:输出的答案文件的绝对路径。
我们提供一份样例,课堂上下发,上传到班级群,使用方法是:orig.txt是原文,其他orig_add.txt等均为抄袭版论文。
注意:答案文件中输出的答案为浮点型,精确到小数点后两位
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 1400 | 1400 |
Estimate | 估计这个任务需要多少时间 | 1000 | 950 |
Development | 开发 | 600 | 500 |
Analysis | 需求分析 (包括学习新技术) | 300 | 450 |
Design Spec | 生成设计文档 | 50 | 60 |
Design Review | 设计复审 | 50 | 50 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 40 | 60 |
Design | 具体设计 | 200 | 200 |
Coding | 具体编码 | 60 | 80 |
Code Review | 代码复审 | 20 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 150 | 180 |
Reporting | 报告 | 300 | 300 |
Test Report | 测试报告 | 150 | 150 |
Size Measurement | 计算工作量 | 60 | 60 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 60 |
合计 | 1800 | 1800 |
项目结构
- 项目模块设计与实现
该论文查重项目主要分为以下几个模块:
1.CheckUtil 模块
功能:用于计算两篇文章的相似度。
实现:调用 SimHashUtil 模块生成两篇文章的 simHash 值,并通过HammingUtil 计算它们的海明距离,最后根据海明距离计算相似度。
2. SimHashUtil 模块
功能:用于生成文章的 simHash 值。
实现:提取文章的关键词。计算每个关键词的哈希值,并根据权重调整哈希值的每一位。通过比较位数的权重,最终生成文章的 simHash 值。
3. HammingUtil 模块
功能:计算两个 simHash 值的海明距离,并根据距离计算相似度。
实现:通过遍历两个 simHash 值的每一位,计算不同位的数量,从而得出海明距离。根据海明距离,通过公式 1 - distance/128.0 计算相似度。
4. IOUtil 模块
功能:用于读取和写入文件。
实现:提供了 readTxt 方法用于从指定路径读取文件内容。提供了 writeTxt 方法用于将结果写入文件。
5. test 模块
功能:项目的主程序模块,用于控制查重的流程。
实现:读取原论文及五篇待检测文章的内容。调用 CheckUtil.getSimilarity 方法计算每篇待检测文章与原文的相似度。输出结果到控制台,并将相似度结果写入文件。
- 程序流程
读取文件:使用 IOUtil.readTxt 方法从指定路径读取原文和抄袭文的内容。
生成 simHash:调用 SimHashUtil.getSimHash 方法生成原文及抄袭文的simHash。
计算海明距离:使用 HammingUtil.getHammingDistance 方法比较两个 simHash 值,计算海明距离。
计算相似度:使用 HammingUtil.getSimilarity 根据海明距离计算文章相似度。
输出结果:将每篇文章的相似度结果输出到控制台,并写入到指定文件中。
- 关键方法分析
- SimHashUtil.getSimHash(String str)
功能:生成文章的 simHash 值。
步骤:
提取关键词:使用 HanLP.extractKeyword 提取文章的关键词。
计算哈希值:通过 getHash 方法计算每个关键词的哈希值,并将不足 128 位的哈希值补齐。
计算权重:根据关键词在文章中的位置,给予不同的权重,生成 simHash 值。 - HammingUtil.getHammingDistance(String simHash1, String simHash2)
功能:计算两个 simHash 值的海明距离。
步骤:判断 simHash1 和 simHash2 长度是否相同。遍历每一位,比较是否相同,不同则距离加 1。输出海明距离,并返回结果。 - HammingUtil.getSimilarity(int distance)
功能:根据海明距离计算相似度。
步骤:相似度通过公式 1 - distance/128.0 计算,海明距离越小,相似度越大。
-
模块接口部分的性能分析
-
结果