个人项目作业-论文查重
一.作业链接
文章目录
这个作业属于哪个课程 | https://bbs.csdn.net/forums/qq_40085543?typeId=2549409 |
---|---|
这个作业要求在哪里 | https://bbs.csdn.net/topics/613858565 |
这个作业的目标 | 设计一个论文查重算法 |
其他参考文献 | https://www.cnblogs.com/sddai/p/10088007.html |
二.预估耗费时间
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 60 |
· Estimate | · 估计这个任务需要多少时间 | 1200 | 1200 |
Development | 开发 | 800 | 800 |
· Analysis | · 需求分析 (包括学习新技术) | 30 | 25 |
· Design Spec | · 生成设计文档 | 20 | 15 |
· Design Review | · 设计复审 | 15 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 10 |
· Design | · 具体设计 | 240 | 300 |
· Coding | · 具体编码 | 120 | 150 |
· Code Review | · 代码复审 | 40 | 20 |
· Test | · 测试(自我测试,修改代码,提交修改) | 20 | 15 |
Reporting | 报告 | 50 | 50 |
· Test Report | · 测试报告 | 20 | 20 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 20 |
· 合计 | 960 | 885 |
三.计算模块接口的设计与实现过程
1. 读取论文原文和抄袭版论文的文件
函数txtToString把txt文本读取保存在一个字符串里
2. 对两份论文进行分词处理
使用第三方库HanLp对字符串进行分词
3. 使用Simhash算法生成它们的Simhash值。
4. 计算两份论文的Simhash值的汉明距离,得出它们的重复率。
(海明距离:两个simhash对应二进制(01串)取值不同的数量称为这两个simhash的海明距离)
5. 将重复率输出到答案文件中。
四.计算模块接口部分的性能改进
性能分析图:
五.计算模块部分单元测试展示
import java.util.List;
public class Test {
public static void test(String[] args) {
String originalFilePath = "D:\\java\\PaperReview\\origin.txt "; //原文文件地址
String plagiarismFilePath = "D:\\java\\PaperReview\\origin_add.txt"; //抄袭文件地址
String resultFilePath = "D:\\java\\PaperReview\\answer.txt"; //查重率结果文件地址
//对字符串进行分词并且返回到关键字队列
List<String> originalTextKeywordsList=Text.WordSegmentation(Text.txtToString(originalFilePath));
List<String> plagiarismTextKeywordsList=Text.WordSegmentation(Text.txtToString(plagiarismFilePath));
//词语转换为哈希值
List<String> originalHash= SimHash.getHash(originalTextKeywordsList);
List<String> plagiarismHash=SimHash.getHash(plagiarismTextKeywordsList);
//统计频数用作权重
List<Integer> originalCount=SimHash.getCount(originalTextKeywordsList);
List<Integer> plagiarismCount=SimHash.getCount(plagiarismTextKeywordsList);
//
//原文的simHash值数组
int [] originalSimHashArray=SimHash.getSimHash(originalHash,originalCount);
int [] originalSimHash =new int[originalSimHashArray.length];
for (int i = 0; i < originalSimHashArray.length; i++) {
originalSimHash[i] = originalSimHashArray[i];
}
//抄袭文的simHash值数组
int [] plagiarismSimHashArray=SimHash.getSimHash(plagiarismHash,plagiarismCount);
int [] plagiarismSimHash =new int[plagiarismSimHashArray.length];
for (int i = 0; i < plagiarismSimHashArray.length; i++) {
plagiarismSimHash[i] = plagiarismSimHashArray[i];
}
int dis=HammingDistance.hammingDistance(originalSimHash,plagiarismSimHash);
// System.out.println(dis);
double reviewRate=(128-dis)*100/128;
System.out.printf("查重率为:%.2f%%",reviewRate);
Text.writeFile(reviewRate,resultFilePath);
}
}
六.计算模块部分异常处理说明
分词有标点符号,需要过滤掉