/paper_checking_system

基于C#和C++开发的论文查重系统

Primary LanguageC#OtherNOASSERTION

简体中文论文查重系统

写在前面

大二的时候,学校严抓研究生论文抄袭,遂希望开发一套论文查重系统,将新的论文和校内历年的研究生毕业论文进行查重(学校有自己的论文库,保存学校历年所有毕业研究生的论文),作为万方和CNKI查重的补充,于是找到了我。当时也没学过C#,只是感觉界面可以直接拖拉拽很方便,校方对做PC客户端还是web端也没要求,于是就整出来了第一版。后面经过两年的稳定运行和维护,有了目前决定开源的这一版。

安装使用教程

1、clone源代码
2、使用vs打开、编译(我使用的是vs2017)
3、运行paper_checking.exe文件即可

项目介绍与功能说明

该系统目前支持对简体中文的论文进行横向查重和纵向查重。
两个核心功能点说明如下:
1、纵向查重
选择一批待查重论文后,将该批论文和论文库中的历年论文进行查重比对,用以检查该批论文有没有抄袭往年论文的情况。该过程较慢,查重过程中查重按钮就会变灰,查重完毕即恢复正常,请耐心等待。
2、横向查重
选择一批待查重论文后,在该批次论文之间进行查重比对,用以检查该批次论文有没有论文之间互相抄袭的情况。该过程较慢,查重过程中查重按钮就会变灰,查重完毕即恢复正常,请耐心等待。

软件中涉及的其它功能点及名词解释如下:
1、添加到论文库:
这个功能时将往年的论文添加到论文库,纵向查重功能的说明中提到,纵向查重功能时将一批论文和论文库中的论文进行查重比对。所以这个功能就是服务于纵向查重的,只有将历年的论文通过这个功能添加到论文库中,在使用纵向查重功能的时候才能与历年的论文进行比对。该功能使用时只需要选中存放历年论文的文件夹,然后点击“添加到论文库”按钮,按钮就会变灰,等待按钮恢复正常即添加完毕。该功能只会扫描文件夹中的pdf、doc、docx、txt文件,其它类型的文件将被忽略。该过程较慢,请耐心等待。
2、查重阈值的设置
顾名思义,该值的设置决定了待查论文连续多少个字与其它论文相同即判定为抄袭。推荐值为12——16,用户亦可根据实际情况自行设定为1~99之间的任意整数值。
3、保存查重报告的文件夹
选择好一个文件夹,待查重完毕后查重报告将会输出到这个文件夹中。
4、生成统计表
如果勾选此复选框,查重结束后将会生成csv格式的统计表,复选框默认勾选。
5、中断恢复
如果选中复选框,软件将不会清楚上一次查重的结果继续查重。该复选框适用于应用程序中途意外退出,想从当时的进度继续进行查重时使用。
6、查重进程数
该值的设置影响查重速度,默认为当前机器CPU逻辑核心数-1。
7、格式转换线程数
论文在查重前会进行格式转换,该值的设置影响论文格式转换的速度,默认为当前机器CPU逻辑核心数-1。

几个注意事项:
①系统支持支pdf、doc、docx、txt格式的论文,文件夹中存在的其余格式的文件将被直接忽略。②非标准格式的论文查重时可能会由于转换失败导致查重失败。③如果有查重失败的论文,会在查重结束后弹窗提示。④如果待查论文在论文库中存在,且文件名不相同,则可能会导致查重重复率高于90%的情况(因为相当于是两篇一样的论文进行比对,至于为什么不是100%,下方的整体流程的第一段有说明)。

查重整体流程说明

查重的原理:
每两篇论文之间比对连续相同的字符串,超过查重阈值即认为这些字是重复的。但是,如果但篇论文重复率在0.25%以下或重复字数在30字以下,将不认为重复。也就是说,如果一个人每篇论文只重复0.25%以下,或着每篇论文只抄30字,将不配判定为重复。如果一篇论文从其它论文抄袭了某句话抄袭了很多次,那么只认为其中的一次为重复。也就是说,如果一片论文,抄袭了另一篇论文中的一段话,且这段话在论文中出现了三次,只认为其中的一次是抄袭,另外两次忽略。

整个查重的流程如下:
将论文转换为txt->将txt内容格式化->调用xc_core进行查重比对并生成中间文件->根据中间文件生成查重报告和统计表
分步说明:
论文格式转换的问题:我校提交上来的论文都是pdf格式,因为历史原因有一部分word格式,因此开发的时候支持了pdf、doc、docx格式的。这一步其实是在整个开发过程中花时间花的最多的一步,可能按照常规的思路认为:格式转换,调个库不就行了么?然而事实是,在实际应用中,当几千个pdf扔进来转换的时候,会有千奇百怪的问题,有加密过的,有打开以后乱码和部分乱码的,有设了只读密码的,有根本打不开的,有纯图片的扫描件,等等。对于pdf格式的,当时对比了adobe acrobat和pdfbox,拿一千多篇pdf格式的论文做测试,pdfbox直接被pass,因为转换成功率不高。最初第一版采用的是使用adobe acrobat的格式转换功能,发现失败率在2%~3%,于是再将这些转换失败的pdf转换为docx,再将docx转为txt,这样操作一波以后失败率控制在了1%以下。不过目前在码云上发布的这一版,用的是pdfbox,因为后面我发现之前pdfbox转化成功率低是居然是因为用的版本太旧了......于是我在apache官网上重新下了最新版本的pdfbox的jar包,用IKVM导出了最新版的dll。doc和docx格式的转换也是经过比对后选择了dpire word免费版。
文本格式化:去掉论文的目录之前以及参考文献之后的部分,以及去掉非中文字符。因为参考文献都是论文名书名,肯定会影响重复率。目录的话,很多论文目录是很相似的,也会影响重复率,这块万方课CNKI也是这么处理的。我用的方法就是关键词匹配,具体实现方法可以看代码。
调用xc_core进行查重比对并生成中间文件:xc_core是一个独立模块,是用c++实现的一个AC自动机,也是这个论文查重系统的一个核心算法。这个模块并没有开源。目前还没做成dll的形式,就是ProcessStartInfo直接启动exe所需的参数通过启动传参传进去,后续开发会逐步改为dll调用。xc_core启动时会校验key文件,所以key文件一定和xc_core放在同一目录下。
生成查重报告:中间文件里,0代表该字未重复,1代表重复,把重复的部分标红导出rtf就好了。

引用的库

1、IKVM
2、Spire.Doc Free
3、pdfbox

个人的法律求助

因为不太了解开源许可证,不知道使用了上述三个第三方库以后还能否以AGPL-3.0协议发布这个开源项目?上述三个库仅使用,未作代码的修改。

后续的开发计划

当clone下代码后,会发现,
1、代码写的很糟糕,完全是面向过程的写法,没有进行面向对象的设计与封装,也没有太多注释。所以后续的开发会将代码逐步重构。
2、xc_core是用ProcessStartInfo启动的。因此后续的开发中,会将其改为动态链接库。
3、功能、交互不完善,比如查重的进度没有进度条提示,对用户不友好等。这个进度条最初是由的,只不过是将CheckForIllegalCrossThreadCalls设为false以后,直接跨线程操作的。提交到git上以后,将代码做了最小化处理,这个功能实现的不太好又不影响核心功能的就去掉了。后续开发会慢慢加上。所以说我提供给学校使用的版本和这个版本并不一样,可以说学校使用的版本是基于这个版本定制的。稍后会开另一个分支或项目把源码同步上去。
4、其它功能的增加或交互的优化。

项目目前实际运行情况

已经稳定使用了两年,产出了5000+篇查重报告。有些万方、CNKI查重了重率个位数的,在这个系统上可以重率80+(打开对应的两篇论文也可以看到大片大片的重复)。可见学校自有的论文库中还是有很多万方和CNKI没有收录的。

其它说明

去年的时候,和同学一起尝试过把这个改成web端的(源代码地址:https://gitee.com/JackieLin/PaperCheckSys ),后面也因为合作开发配合的不好、过度设计等原因烂尾了。