个人项目-论文查询
这个作业属于哪个课程 | 计科2班 |
---|---|
这个作业要求在哪里 | 作业要求 |
这个作业的目标 | < 设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率 > |
作业地址
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 10 | 10 |
Development | 开发 | 120 | 190 |
· Analysis | · 需求分析 (包括学习新技术) | 60 | 90 |
· Design Spec | · 生成设计文档 | 20 | 20 |
· Design Review | · 设计复审 | 10 | 10 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
· Design | · 具体设计 | 20 | 25 |
· Coding | · 具体编码 | 70 | 90 |
· Code Review | · 代码复审 | 20 | 40 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 100 |
Reporting | 报告 | 40 | 50 |
· Test Repor | · 测试报告 | 30 | 25 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 15 |
· 合计 | 520 | 720 |
二、计算模块接口的设计与实现过程。
要设计一个论文查重算法,我们可以使用文本相似度检测的方法。这里提供一个简单的算法思路,以及如何实现这个算法的基本框架。请注意,实际的论文查重系统可能要复杂得多,涉及到更高级的文本处理和机器学习技术。
算法思路:
- 文本预处理:对原文和抄袭版论文进行预处理,包括去除标点符号、统一空格、转换为小写等。
- 分词:将文本分割成单词或短语。
- 构建特征向量:使用诸如TF-IDF(词频-逆文档频率)这样的方法来构建每个文档的特征向量。
- 计算相似度:使用余弦相似度等方法来计算两个文档特征向量之间的相似度。
- 输出结果:将相似度转换为重复率,并输出到指定文件。
接口和算法设计部分
1)接口部分
2)算法部分
3)流程图
4)关键算法具体实现过程
1.使用正则表达式模式[\u4e00-\u9fa5]+对原始文本和抄袭文本进行处理,去除标点符号,只保留中文字符。
2.将处理后的文本以字符串的形式存储,并赋值给original_text和copy_text变量。
3.计算原始文本和抄袭文本的海明距离(Hamming Distance),即Simhash值之间的汉明距离。海明距离表示两个Simhash值二进制表示中不同位的数量。
4.根据海明距离计算查重率(similarity),查重率的计算公式为:1 - (海明距离 / 64)。
3.性能分析
性能分析结果
如上图所示,程序执行的时间为1.61s,其中将文本创建为正则表达式需要44.2MiB的,紧接着整个算法耗时最长以及占用内存最多的部分是进行分词算法,需要64.3 MiB。因此我们的算法优化可以从分词算法的优化进行。但受限于理论知识过少,目前笔者暂时未发现更好的算法。
4.模块异常分析
示例结果如下:
原文文本输入错误
原文文本输入异常
由上图可知本程序可以检测错误的输入样本。
5.Code Quality Analysis
在Pycharm自带了代码检查功能,一下为笔者整个项目的检验结果,由于可以检测整个项目,连文本中的所有语法也能检测出错误,以下为结果图:
代码报错结果
通过上图可以发现,在程序中的代码已无错误,只有文本检测出错误(代码检测功能无报错)说明代码性能良好。
6.独特之处
通过定义不同的类检查模块异常,通过海明码和海明距离计算重复率。
7.程序简易样例测试阶段
定义了test.txt 和 test_add.txt 作为原文和抄袭文档,并将test query result.txt作为结果输出文档,具体测试结果如下:
原文文本:今天是星期天,天气晴,今天晚上我要去看电影。
抄袭文本:今天是周天,天气晴朗,我晚上要去看电影。
程序正常运行,结果无异常,说明性能良好。
8.文章检测实操结果
原文文本:orig.txt
抄袭文本:orig_0.8_add.txt
最终结果:
9.后续优化部分
1)添加不同语言检验的异常结果分析
2)尝试进行语义分析
3)根据搜索引擎,还有多种方法可实现论文查重代码编写,如余弦相似度算法,动态规划算法等,尝试写出以上算法并将全部算法的结果进行比对,寻找最优性能的算法。
附录
1.文件的具体代码可从Github中获取,文本和结果样例以及requirement.txt同样可以从中获取。
2.程序调用的库有:
import re
import jieba
from simhash import Simhash
import time
from memory_profiler import profile