主要用于检索学生之间互相抄袭的问题,检索的能力与本身的查重对比库有关系,基本逻辑是比较字符串的相似度

# -*- coding: utf-8 -*-
"""
Created on Fri Dec 23 15:19:58 2022@author: Administrator
"""from docx import Document
import re, sys, datetime
import os
import difflib    #比较字符串相似度
import pandas as pd#切分句子
def cutSentence(text):# 结束符号,包含中文和英文的end_flag = ['。', ';', '!', '?']content_len = len(text)sentences = []tmp_char = ''for idx, char in enumerate(text):# 拼接字符tmp_char += charif tmp_char != '':if (idx + 1) == content_len: # 判断是否已经到了最后一位sentences.append(tmp_char)break# 判断此字符是否为结束符号if char in end_flag:# 再判断下一个字符是否为结束符号,如果不是结束符号,则切分句子next_idx = idx + 1if not text[next_idx] in end_flag:sentences.append(tmp_char)tmp_char = ''else:continuereturn sentences#获取段落文本
def getText(doc):texts = []for para in doc.paragraphs:if len(para.text) > 0:try:texts.append(cutSentence(para.text))except:print(para.text)return texts#获取表格文本
def getTable(doc):content = []#读取表格for t in range(0, len(doc.tables)):nc = Falsetb = doc.tables[t]#读取表格的行for r in range(0, len(tb.rows)):row_cells = tb.rows[r].cells#读取单元格内容for cell in row_cells:#print('TSET\n', cell.text)if len(cell.text) > 0:try:for k in nocompare_table:if k in cell.text:nc = Trueif nc:breakcontent.extend(getText(cell))except:content.extend(cell.text)return content#判断是否是中文
def is_Chinese(word):for ch in word:if '\u4e00' <= ch <= '\u9fff':return Truereturn Falsedef msplit(s, seperators = ',|\.|\?|,|。|?|!'):return re.split(seperators, s)#获取文件
def readDocx(docfile):doc = Document(docfile)print('*' * 80)print('文件', docfile, '加载中……')t1 = datetime.datetime.now()paras = getText(doc)if is_consider_table:segs = getTable(doc)else:segs = []if is_consider_notable:for p in paras:temp = []if p != []:for s in msplit(p[0]):if len(s) > 2:temp.append(s.replace(' ', ""))if len(temp) > 0:segs.append(temp)t2 = datetime.datetime.now()print('加载完成,用时: ', t2 - t1)showInfo(segs, docfile)return segs#显示信息
def showInfo(doc, filename = 'filename'):chars = 0segs = 0for p in doc:for s in p:segs = segs + 1chars = chars + len(s)print('段落数: {0:>8d} 个。'.format(len(doc)))print('短句数: {0:>8d} 句。'.format(segs))print('字符数: {0:>8d} 个。'.format(chars))#获得字符串相似度
def string_similar(s1, s2):return difflib.SequenceMatcher(None, s1, s2).quick_ratio()#找最大相似字符串
def compare_common_str(str1="", str2=""):a = set()   # 防止存入相同长度的相同字符串result_str = ""  # 存入相同长度的字符串if len(str1) > len(str2):str1, str2 = str2, str1   # 把较小长度的字符串存入 str1中,将str1 进行循环迭代,优化效率for i in range(len(str1)):sub_str = ""   # 用于试探字符串最大长度if str1[i] in str2:sub_str = str1[i]k = iwhile True:if k < len(str1) - 1:  # 如果k走到头了就停止。k += 1sub_str = sub_str+str1[k]   # 进一步试探是否 包含元素if not sub_str in str2:sub_str = sub_str[:-1]breakelse:breakif len(sub_str) > len(result_str):a = set()result_str = sub_strelif len(result_str) == len(sub_str):  # 判断两个 字符是否相等if sub_str != result_str:a.add(result_str)a.add(sub_str)else:if len(a) != 0:return aelse:return result_strdef get_same_sentence(p1, p2, ratio):same_list = []if ratio == 1:           #百分百相同,找最短丢出去if p2 in p1:same_list.append(p2)elif p1 in p2:same_list.append(p1)elif ratio != 0:                    #部分相同same_list.append(compare_common_str(p1, p2))return same_list#比较两个文本list中的数据相似度
def compareParagraph(doc1, i, doc2, j, min_segment = 5): """功能为比较两个段落的相似度,返回结果为两个段落中相同字符的长度与较短段落长度的比值。:param p1: 行:param p2: 列:param min_segment = 5: 最小段的长度"""p1 = doc1[i][0]p2 = doc2[j][0]#空串不比较if len(p1) == 0 or len(p2) == 0:return [], -1ratio = string_similar(p1, p2)     #字符串相似度count = ratio * len(p1)         #相同字符数same_list = get_same_sentence(p1, p2, ratio)   #存放相同的内容,由limit_ratio决定if count > 2 and ratio > 0.1:print(' 发现相同内容 '.center(80, '*'))print('文件1第{0:0>4d}段内容:{1}'.format(i + 1, p1))print('文件2第{0:0>4d}段内容:{1}'.format(j + 1, p2))print('完全相同内容:', same_list)print('相同字符比:{1:.2f}%\n相同字符数: {0}\n'.format(count, ratio * 100))return same_list, ratio#全文比较
def compare_paper(path1, path2):doc1 = readDocx(path1)doc2 = readDocx(path2)same_passage = []ratio_count = 0all_count = len(doc1)no_count = 0for i in range(len(doc1)):for ntn in nocompare_table_name:if ntn in doc1[i][0]:no_count = no_count + 1continueif i % 100 == 0:print('处理进行中,已处理段落 {0:>4d} (总数 {1:0>4d} ) '.format(i, len(doc1)))for j in range(len(doc2)):temp_CP = compareParagraph(doc1, i, doc2, j)if len(temp_CP[0]) > 0:same_passage.append(temp_CP[0])if temp_CP[1] >= limit_ratio:        #重复比例大于等于limit_ratioratio_count = ratio_count + 1print(path1.split('\\')[-1].split('.')[0], '与其他文件重复片段数:{0}\n, 应比较片段数:{1}\n'.format(ratio_count, all_count - no_count))return round(ratio_count / (max(all_count - no_count, 1)), 4)is_consider_table = True   #是否考虑表格的内容
is_consider_notable = False   #是否考虑非表格的内容
#不进行比较的表格所对应标题名字
nocompare_table = ['指导教师批阅意见:', '备注:', '实验目的与要求:']#标题名字不进行比较
nocompare_table_name = ['实验结论:']limit_ratio = 0.9    #重复的比例hw_path = r'C:\Users\Administrator\Desktop\作业抄袭检测'
hw_files = os.listdir(hw_path) #得到文件夹下的所有文件名称print('开始比对...'.center(80, '*'))check_result = pd.DataFrame()
new_index = []
for file in hw_files:check = hw_path + '\\' + filecs = []if 'docx' in file:new_index.append(file)for second_file in hw_files:if 'docx' in second_file:compare = hw_path + '\\' + second_filecs.append(compare_paper(check, compare))check_result[file] = cscheck_result.index = new_index

Python实现作业抄袭比对相关推荐

  1. Python大作业-网络爬虫程序

    简介 此程序是本人大三时期的Python大作业,初学Python后所编写的一个程序,是一个网络爬虫程序,可爬取指定网站的信息. 本程序爬取的网站是Bangumi-我看过的动画,Bangumi是一个专注 ...

  2. 咕泡学院:(1)唐宇迪python课程作业

    超级详细的python思维导图见链接: https://download.csdn.net/download/m0_37957160/22526313 python数据科学必备工具实战思维导图链接: ...

  3. python编程书籍1020python编程书籍_代写INFT 1020作业、Database作业代做、Java课程作业代写、c++,Python编程作业代做...

    代写INFT 1020作业.Database作业代做.Java课程作业代写.c++,Python编程作业代做 日期:2020-04-25 10:27 INFT 1020 Database Fundam ...

  4. python实验报告代写价格_代写OS python程序作业、代写代写OS作业、代写OS实验报告...

    代写OS python程序作业.代写代写OS作业.代写OS实验报告 日期:2018-06-11 03:21 CSE 304 - Operating Systems DUE: June 11. Subm ...

  5. python做作业没头绪_使用Python做作业

    python做作业没头绪 Applying OpenCV and Tesseract to do your math-homework 应用OpenCV和Tesseract进行数学作业 The pos ...

  6. Python代写CSSE1001/7030 python程序作业、代做python CSSE1001/7030程序作业、 代写CSSE1001/7030 python 作业...

    Python代写CSSE1001/7030 python程序作业.代做python CSSE1001/7030程序作业. 代写CSSE1001/7030 python 作业 Uno++ Assignm ...

  7. 代写python代码一般多少钱_代写CO 353课程作业、代做Python程序设计作业、代写Python语言作业...

    代写CO 353课程作业.代做Python程序设计作业.代写Python语言作业 日期:2020-03-17 11:22 CO 353 - Homework assignment 4 Winter ' ...

  8. python实验报告代写_TensorFlow作业代写、代做Python程序语言作业、代写github课程作业、Python实验作业代写...

    TensorFlow作业代写.代做Python程序语言作业.代写github课程作业.Python实验作业代写 日期:2019-07-10 10:34 Python Practical Examine ...

  9. 代写python作业费用标准_代做159.272作业、代写Programming Paradigms作业、代做Python实验作业、代写Java/c++编程作业代写Database|代做R...

    代做159.272作业.代写Programming Paradigms作业.代做Python实验作业.代写Java/c++编程作业代写Database|代做RComputational Thinkin ...

最新文章

  1. java高效率素数算法_《Core Java》里给出的算法,效率比较高。 统计2000000以内的所有的素数。...
  2. JS获取用户控件中的子控件Id
  3. CSS滤镜实现火狐、IE兼容
  4. 在jenkins上配置 sonar 两种方式的区别
  5. yii添加模型基础类
  6. HDU 6168 Numbers 思维
  7. 机器学习算法-随机森林之决策树R 代码从头暴力实现(2)
  8. Java中使用JNA实现全局监听Linux键盘事件
  9. lopatkin俄大神精简中文系统Windows 8.1 Pro 19599 x86-x64 ZH-CN SM
  10. C语言函数库之字符串连接函数(string.h)
  11. 机器人操作系统二 ROS2:设计、架构和野外使用 - 机器翻译
  12. TL-R406 IP带宽控制功能设置指南
  13. 2021年中式面点师(中级)报名考试及中式面点师(中级)考试总结
  14. 吴裕雄 18-MySQL GROUP BY 语句
  15. adobe android 动画,Lottie - Android 动画详解
  16. 神秘贼掉包二维码,支付宝赔偿200多,烧烤小哥为何还骂支付宝没良心?
  17. 数字图像处理(绪言)
  18. Java实现日志数据的采集显示
  19. 楷体描红字帖练起来@简洁字帖
  20. window7属于计算机硬件吗,win7最低配置要求是什么?

热门文章

  1. vue组件通信的几种方法
  2. 一旦蓝牙5.2普及,LE Audio技术将为蓝牙音箱带来哪些变革?
  3. python--wave库的使用
  4. 《文哥的学习笔记——推荐系统遇上深度学习》笔记(1~9)
  5. 重载函数的特性-总结
  6. Mac电脑打开Word、PPT 、Excel显示VB运行时错误53,怎么解决
  7. windows中利用放大镜留下后门
  8. 指定日期判断是否节假日
  9. 剪枝计算机,Alpha-beta剪枝
  10. msm 8953 制作算法分区的部分记录,太容易忘记了