论文查重原理及实现

论文查重原理及实现

  • 原理:
    • 在知网上的论文检测为整篇的进行上传但是本人却是提交自己的正式论文部分上去的(paperpass), 上传的文章格式对检测结果可能会造成影响(在paperpass上存在两种类型(分别为.doc, .docx), 但有的还可以是.txt文件), 此影响为几十个字的小段可能检测不出.
    • 但为什么不可以是pdf或者其他的文档文本格式了?(页面的前端业务逻辑判断就会进行处理).
      • 首先来解释一下pdf格式文本与doc/txt/docx等可以直接查重的文本文档进行比较的结果.
        • pdf : pdf是由Adobe公司开发的. 一般情况下pdf是不支持修改的.
        • doc : doc是由微软公司开发的. 一般情况下doc都是支持修改的.
    • 对于数据量过于繁琐的论文比如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)) {
                    // 说明到了段落的结尾, 将其加入到链表, 并清空sb
                    res.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文档格式文件就会存在如下图所示的一堆乱码:
    pdfError

  • 中国知网的查重为该系统的灵敏度设置了一个阀值(阈的意思是界限, 故阈值又叫临界值, 是指一个效应能够产生的最低值或最高值.),
    该阀值为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.
论文查重原理

  • 9
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
要编写一个论文查重程序,可以按照以下步骤进行: 1. 读取待检测的论文文件(例如txt、doc、pdf等)并将其转换为文本格式; 2. 对文本进行预处理,包括去除标点符号、停用词、数字等,只保留单词; 3. 将处理后的文本划分为多个句子或段落,以便进行比较; 4. 对每个句子或段落进行向量化,即将其转换为数值向量; 5. 使用相似度算法(如余弦相似度、Jaccard相似度等)比较待检测的论文与已知的文献库中的论文的相似度; 6. 根据相似度阈值进行判断,确定待检测论文是否存在抄袭行为。 下面是一个简单的Python代码示例,实现了基于余弦相似度的论文查重功能: ```python import os import re import string from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import cosine_similarity # 读取文件 def read_file(filename): with open(filename, 'r', encoding='utf-8') as f: text = f.read() return text # 预处理文本 def preprocess_text(text): # 去除标点符号和数字 text = re.sub('[%s]' % re.escape(string.punctuation + string.digits), '', text) # 转换为小写 text = text.lower() return text # 向量化文本 def vectorize_text(text): # 使用CountVectorizer向量化文本 vectorizer = CountVectorizer(stop_words='english') vector = vectorizer.fit_transform([text]) return vector.toarray() # 计算相似度 def compute_similarity(text1, text2): # 向量化文本 vector1 = vectorize_text(text1) vector2 = vectorize_text(text2) # 计算余弦相似度 similarity = cosine_similarity(vector1, vector2)[0][0] return similarity # 主函数 if __name__ == '__main__': # 读取待检测的论文文件和已知的文献库 paper_file = 'paper.txt' corpus_dir = 'corpus' papers = [os.path.join(corpus_dir, f) for f in os.listdir(corpus_dir)] # 读取文件内容并进行预处理 paper_text = preprocess_text(read_file(paper_file)) corpus_text = [preprocess_text(read_file(f)) for f in papers] # 计算相似度并输出结果 for i, corpus in enumerate(corpus_text): similarity = compute_similarity(paper_text, corpus) print('Paper %d similarity: %.2f%%' % (i+1, similarity*100)) ``` 该代码使用了sklearn库中的CountVectorizer和cosine_similarity函数,可以快速实现文本向量化和计算余弦相似度的功能。需要注意的是,该代码只是一个简单的示例,实际应用中还需要进行更多的优化和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值