个人项目-论文查重
个人项目-论文查重
这个作业属于哪个课程 | 班级链接 |
---|---|
这个作业要求在哪里 | 作业链接 |
这个作业的目标 | 写一个论文查重项目 |
1.题目要求
设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。
原文示例:今天是星期天,天气晴,今天晚上我要去看电影。
抄袭版示例:今天是周天,天气晴朗,我晚上要去看电影。
要求输入输出采用文件输入输出,规范如下:
从命令行参数给出:论文原文的文件的绝对路径。
从命令行参数给出:抄袭版论文的文件的绝对路径。
从命令行参数给出:输出的答案文件的绝对路径。
我们提供一份样例,课堂上下发,上传到班级群,使用方法是:orig.txt是原文,其他orig_add.txt等均为抄袭版论文。
注意:答案文件中输出的答案为浮点型,精确到小数点后两位
2.项目开发
2.1 开发环境:
语言:java
平台:IDEA
2.2 项目构成:
主程序:HammingSimilarity类
主函数:main——程序入口
其他函数:
readFile——从命令行读取文件地址,到指定地址读取文件
toBinary——将文本转换为固定长度的二进制字符串
computeHammingDistance——计算汉明距离
writeOutput——输出最终结果
2.3项目设计思路
从文件中读取到两个长字符串,使用汉明距离计算两个字符串的相似度,汉明距离表示两个等长字符串在对应位置上不同字符的数目,汉明距离度量了通过替换字符的方式将字符串x变成y所需要的最小的替换次数,然后输出到目标文件
2.4关键函数实现
toBinary函数 该函数实现了将文本转化为固定长度二进制代码的功能
点击查看代码
private static String toBinary(String text) {
StringBuilder binary = new StringBuilder();
for (char c : text.toCharArray()) {
String bin = String.format("%8s", Integer.toBinaryString(c)).replace(' ', '0');
binary.append(bin);
}
return binary.toString();
}
computeHammingDistance函数 该函数实现了汉明距离计算的功能
点击查看代码
private static int computeHammingDistance(String binary1, String binary2) {
int distance = 0;
for (int i = 0; i < binary1.length(); i++) {
if (binary1.charAt(i) != binary2.charAt(i)) {
distance++;
}
}
return distance;
}
2.5后续改进方案
处理文件内容长度差异:
当前代码中,如果两个文本的二进制长度不同,它只取了最小长度的部分。如果文件内容的长度差异较大,这可能会导致不准确的相似度计算,考虑使用填充或其他方法来处理长度不一致的情况
异常处理:
异常处理目前只是打印堆栈信息,后续改进可能需要更详细的错误处理或用户提示
性能考虑:
对于大文件,可能会有性能瓶颈,特别是在内存使用和二进制字符串处理方面,后续应考虑逐行或分块处理文件,以减少内存消耗
3.性能分析
采用JProfiler分析,如图所示