论文查重原理及实现
- 原理:
- 在知网上的论文检测为整篇的进行上传但是本人却是提交自己的正式论文部分上去的(paperpass), 上传的文章格式对检测结果可能会造成影响(在paperpass上存在两种类型(分别为.doc, .docx), 但有的还可以是.txt文件), 此影响为几十个字的小段可能检测不出.
- 但为什么不可以是pdf或者其他的文档文本格式了?(页面的前端业务逻辑判断就会进行处理).
- 首先来解释一下pdf格式文本与doc/txt/docx等可以直接查重的文本文档进行比较的结果.
- pdf : pdf是由Adobe公司开发的. 一般情况下pdf是不支持修改的.
- doc : doc是由微软公司开发的. 一般情况下doc都是支持修改的.
- 首先来解释一下pdf格式文本与doc/txt/docx等可以直接查重的文本文档进行比较的结果.
- 对于数据量过于繁琐的论文比如5万字以上的论文文章, 以上问题造成的影响就可以忽略不计的.
对比数据的来源:
对比数据库的存在:
中国学术期刊网络出版总库, 中国博士学位论文全文数据库/中国优秀硕士学位论文全文数据库, 国内重要论文全文数据库, 中国重要报纸全文数据库, 中国专利全文数据库, 个人对比库, 其他对比库. 部分书籍不在知网知网数据库里, 所以检测不到.
上传论文之后发生的事:
- 上传论文后, 系统会自动检测文章的目录结构也就是章节信息, 如果有自动生成的目录信息, 那么系统会将文章按章节分段检测, 否则会自动分段检测
package Test;import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;/*** Created by JackDan9 on 2017/5/23.*/
public class GetParagraph {public static void main(String[] args) throws IOException {ArrayList<String> res = new ArrayList<String>(); //段落的切分StringBuilder sb = new StringBuilder(); // 拼接读取的内容String temp1 = null; // 临时变量, 存储sb没有去除标点符号的内容(只是去除空格)String temp = null; // 临时变量, 存储sb去除空格的内容并且取出标点符号的内容BufferedReader reader = new BufferedReader(new FileReader(new File("C:\\Users\\JackDan9\\Desktop\\检测\\PaperPass-专业版-检测报告\\使用帮助.txt")));int ch = 0;while ((ch = reader.read()) != -1) {temp1 = sb.toString().trim().replaceAll("\\s*", "");temp = temp1.replaceAll("[\\pP\\p{Punct}]", "");if((char) ch == '\r') {// 判断是否存在空格if(!"".equals(temp)) {// 说明到了段落的结尾, 将其加入到链表, 并清空sbres.add(temp);}sb.delete(0, sb.length()); // 清空sb} else {// 说明没有能够到达段落结尾, 将结果暂存.sb.append((char) ch);}}if(reader.read() == -1) {System.out.println("paragraphEnd");}// 最后一段如果非空, 那就把最后一段加上, 否则不处理if(!"".equals(temp)) {res.add(temp);}Iterator<String> iterator = res.iterator();while(iterator.hasNext()) {String next = iterator.next();System.out.println("paragraphStart");System.out.println(next);}System.out.println("paragraphNumber" + res.size());}
}
- 如果是.pdf文档格式文件就会存在如下图所示的一堆乱码:
- 中国知网的查重为该系统的灵敏度设置了一个阀值(阈的意思是界限, 故阈值又叫临界值, 是指一个效应能够产生的最低值或最高值.),
该阀值为5%, 以段落计, 低于这个阀值的抄袭和引用是检测不出来的. - 至于查重阀值的实现因为需要借助数据库进行检测, 本地的检测权威性相比于数据库的比较实在太Low.
package Test;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.FileNotFoundException;
import java.io.IOException;
/*** Created by JackDan9 on 2017/5/23.*/
public class AutoCheckTest {
// private static final String filePath = "文件路径";private static final String filePath = "C:\\Users\\JackDan9\\Desktop\\test\\test1.txt";private static final String secFilePath = "C:\\Users\\JackDan9\\Desktop\\test\\test2.txt";private static final String resFilePath = "C:\\Users\\JackDan9\\Desktop\\test\\result.txt";public static void main(String[] args) {long startTime = System.currentTimeMillis();// 阅读第一个文集那File file = new File(filePath);File secFile = new File(secFilePath);BufferedReader reader = null;BufferedReader secReader = null;
// BufferedReader resReader = null;BufferedWriter resWriter = null;try {reader = new BufferedReader(new FileReader(file));secReader = new BufferedReader((new FileReader(secFile)));secReader.mark(90000000);resWriter = new BufferedWriter(new FileWriter(resFilePath));String lineText = null;while((lineText = reader.readLine()) != null) {String searchText = lineText.trim();searchAndSignProcess.searchAndSignProcess(searchText, secReader, resWriter);}long endTime = System.currentTimeMillis();System.out.println("======Process Over!======");System.out.println("Time Speeding: " + ((endTime - startTime) / 1000D) + "s");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if(reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();} finally {if (secReader != null && resWriter != null) {try {secReader.close();resWriter.close();} catch (IOException e) {e.printStackTrace();}}}}}}
}
package Test;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;/*** Created by JackDan9 on 2017/5/24.*/
public class searchAndSignProcess {public static void searchAndSignProcess(String searchText, BufferedReader secReader, BufferedWriter resWriter) throws IOException{String lineStr = "-\n";if (searchText == null) {return;}if("".equals(searchText)) {resWriter.write(lineStr);}String lineText = null;int lineNum = 1;while ((lineText = secReader.readLine()) != null) {String secLine = lineText.trim();if (searchText.equals(secLine)) {lineStr = "###=Equal:" + lineNum + "=###" + "\n";break;}lineNum ++;}resWriter.write(lineStr);secReader.reset();}
}
JackDan9 Thinking.
论文查重原理