gitCode 仓库地址:Xiao_Long666gg / 3121005319 · GitCode
这个作业属于哪个课程 | 广工23软件工程社区 |
---|---|
这个作业要求在哪里 | 个人项目作业-论文查重 |
这个作业的目标 | 设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率 |
其他文献参考 | 无 |
开发环境
- 编译语言:Java 17
- IDE:Intellij IDEA 2021.3.2
- 单元测试:JUnit 4.12
- 性能分析工具:JProfiler 9.2
流程设计
需求
题目:论文查重
描述如下:
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
-
原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
-
抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:
-
从命令行参数给出:论文原文的文件的绝对路径。
-
从命令行参数给出:抄袭版论文的文件的绝对路径。
-
从命令行参数给出:输出的答案文件的绝对路径。
我们提供一份样例( 提取码:oogi),使用方法是:orig.txt是原文,其他orig_add.txt等均为抄袭版论文。
注意:答案文件中输出的答案为浮点型,精确到小数点后两位
PSP表格
*PSP2.1* | *Personal Software Process Stages* | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 10 | 10 |
Development | 开发 | 120 | 150 |
· Analysis | · 需求分析 (包括学习新技术) | 50 | 40 |
· Design Spec | · 生成设计文档 | 40 | 40 |
· Design Review | · 设计复审 | 20 | 20 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 5 |
· Design | · 具体设计 | 20 | 15 |
· Coding | · 具体编码 | 150 | 160 |
· Code Review | · 代码复审 | 20 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 20 | 25 |
Reporting | 报告 | 15 | 30 |
· Test Repor | · 测试报告 | 12 | 15 |
· Size Measurement | · 计算工作量 | 25 | 15 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 15 | 20 |
· 合计 | 650 | 715 |
代码解释
-
代码结构
-
readFile
方法读取文本文件的内容并将其作为字符串返回。 -
splitString
方法生成给定长度的N-gram序列。在这里,我们选择N = 5,但可以根据需要更改。 -
calculate
方法计算原始文本和抄袭版文本之间的相似度。首先,我们生成原始文本和抄袭版文本的N-gram序列。接下来,我们计算在原始文本中找到的N-gram在抄袭版文本中是否存在。最后,我们将找到的匹配数量除以原始文本的N-gram总数,以获得相似度得分。
public static double calculate(String originalText, String modifiedText){ int totalSame=0; ArrayList<String> originItems=splitString(originalText,5);//修改前的子串 ArrayList<String> modifiedItems=splitString(modifiedText,5);//修改后的字串 for (String originItem:originItems) { if (modifiedItems.contains(originItem)){//原文子串和修改后的字串做对比 totalSame++; } } return (double) totalSame/originItems.size(); }
-
main
方法是程序的入口点。它接受两个参数:原始文件名和抄袭版文件名。它使用上述三个方法来计算原始文件和抄袭版文件之间的相似度,然后输出相似度得分。 -
test 为测试用类
性能分析
本算法就是把一篇一篇文本分成一小段的字符串,所以字符数组占用的内存回偏多
此外calulate方法为最耗时的方法
测试及异常处理
针对该程序,可以设计以下测试用例:
-
测试读取文件功能
-
测试文件存在且可以被成功读取
-
测试文件不存在或者读取失败的情况
代码覆盖率
测试结果
orig_0.8_add.txt对比的重复率为0.48
orig_0.8_del.txt对比的重复率为0.37
orig_0.8_dis_1.txt对比的重复率为0.81
orig_0.8_dis_10.txt对比的重复率为0.55
orig_0.8_dis_15.txt对比的重复率为0.16