第一次个人作业
这个作业属于哪个课程 | 22计科34班 |
---|---|
这个作业要求在哪里 | 作业 |
这个作业的目标 | 设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率 |
GitHub链接:https://github.com/Lzw1322/3122004537
项目开发要求
题目:论文查重
描述如下:
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:
从命令行参数给出:论文原文的文件的绝对路径。
从命令行参数给出:抄袭版论文的文件的绝对路径。
从命令行参数给出:输出的答案文件的绝对路径。
我们提供一份样例,课堂上下发,上传到班级群,使用方法是:orig.txt是原文,其他orig_add.txt等均为抄袭版论文。
注意:答案文件中输出的答案为浮点型,精确到小数点后两位
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 1000 | 1000 |
Estimate | 估计这个任务需要多少时间 | 1000 | 950 |
Development | 开发 | 600 | 700 |
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 | 150 |
Reporting | 报告 | 300 | 400 |
Test Report | 测试报告 | 150 | 160 |
Size Measurement | 计算工作量 | 60 | 70 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 60 |
合计 | 1800 | 1800 |
项目结构
该论文查重项目主要分为以下几个模块:
CheckUtil 模块
计算两篇文章的相似度,调用 SimHashUtil 模块生成两篇文章的 simHash 值,并通过HammingUtil 计算它们的海明距离,最后根据海明距离计算相似度。
SimHashUtil 模块
用于生成文章的 simHash 值。实现方式是提取文章的关键词。计算每个关键词的哈希值,并根据权重调整哈希值的每一位。通过比较位数的权重,最终生成文章的 simHash 值。
HammingUtil 模块
计算两个 simHash 值的海明距离,并根据距离计算相似度。通过遍历两个 simHash 值的每一位,计算不同位的数量,从而得出海明距离。根据海明距离,通过公式 1 - distance/128.0 来计算两个文件的相似度。
IOUtil 模块
用于读取和写入文件,处理io问题,提供了 readTxt 方法用于从指定路径读取文件内容。提供了 writeTxt 方法用于将结果写入文件。
主要的程序流程为
使用 IOUtil.readTxt 方法从指定路径读取原文和抄袭文的内容。调用 SimHashUtil.getSimHash 方法生成原文及抄袭文的simHash,然后使用 HammingUtil.getHammingDistance 方法比较两个 simHash 值,计算海明距离,然后使用 HammingUtil.getSimilarity 根据海明距离计算文章相似度。
最后将每篇文章的相似度结果输出到控制台,并写入到指定文件中。
三、性能分析
1.IOUtil模块
使用缓冲区或内存映射文件来加速文件读取和写入操作。
采用异步IO以提高处理大文件时的效率
2.simhash模块:
使用高效的哈希算法来减少计算时间。
考虑将计算过程并行化,特别是在处理大型文本时
3.HammingUtil
如果需要计算大量汉明距离,可以使用更优化的算法,如位运算加速。
对于大规模数据,考虑使用矩阵计算库来提高性能。
性能截图:
单元测试
部分代码:
输出结果
异常处理说明:
readTxt 方法:
FileNotFoundException:处理文件未找到的情况,输出错误信息和堆栈跟踪。
IOException:处理其他 I/O 错误,输出错误信息和堆栈跟踪。
writeTxt 方法:
IOException:处理 I/O 错误,输出错误信息和堆栈跟踪。