2016-09-19 2 views
1

Я пытаюсь написать функцию, которая помещает текстовые файлы в список, а затем итерации через файлы, чтобы найти точные и частичные копии, чтобы отсеять людей, которые, возможно, обманули, плагируя их работу. Я начинаю с использования моего списка классов и добавления .txt к их имени, чтобы найти их назначения и выполнил ли они это завершение или нет. У меня более 500 студенческих документов для чтения. С кодом, который я написал до сих пор, он буквально повторяется слово за словом в файлах .txt, поэтому я получаю WAY TOO многих «обманутых». ПОЖАЛУЙСТА ПОМОГИ.Итерация через несколько текстовых файлов и сравнение

def Cheaters(): 
    file = open("roster.txt", "r") 
    L = [] 
    for i in file: 
     new = [i[:-1], ".txt"] 
     new2 = "".join(new) 
     if i not in L: 
      L.append(new2) 
    for j in L: 
     try: 
      file2 = open(j, "r") 
      for n in file2: 
       for m in file2: 
        if n == m: 
         print("Cheated") 
     except: 
      print("No work submitted") 
+0

Первое, что нужно определить, что составляет обман. Поиск совпадающих слов или пар слов является плохой метрикой, потому что они могут быть довольно распространены в данной теме. Вы можете разорвать каждый документ по предложению и сравнить количество предложений между документами. Если вы хотите стать действительно умным, вы можете реализовать дистанцию ​​редактирования, которая сравнивает количество замен, необходимых для получения от каждого предложения в одном документе к каждому предложению в другом документе. – James

+0

Спасибо. Я хочу проверить частичный или весь плагизм. Не могли бы вы объяснить, как я мог бы перебирать строки за строкой, а не слово за словом? И что именно вы подразумеваете под «дистанцией редактирования»? таких как ряд элементов, которые можно отредактировать? –

+0

Я работаю над некоторым кодом, который поможет вам. Все ли имена файлов документов в списке в файле roster.txt? – James

ответ

0

Попробуйте это. Вам может потребоваться изменить его для вашей файловой структуры, но он должен быть близок.

import re 
from itertools import product 

def hash_sentences(document): 
    # remove all characters except those below, replace with a space 
    # split into a list 
    cleaned_text = re.sub(r'[^A-z0-9,;:\.\?! ]', ' ', document) 
    sentences = re.split(r'[\?.!\.]', cleaned_text) 

    # the less than 5 removes short sentences like "Dr." 
    # return a hash of the sentences for comparison 
    return [hash(s.strip().lower()) for s in sentences if len(s) > 5] 

def compare_documents(doc1, doc2): 
    hash1 = hash_sentences(doc1) 
    hash2 = hash_sentences(doc2) 
    # return the percentage of sentences of doc1 that are in doc2 
    return sum((h in hash2) for h in hash1)/float(len(hash1)) 

# get list of document file names 
with open('roster.txt', 'r') as fp: 
    doc_fnames = [d+'.txt' for d in fp.readlines()] 

# create dictionay of file names and content 
doc_dict = {} 
for fname in doc_fnames: 
    try: 
     with open(fname, 'r') as fp: 
      doc_dict[fname] = fp.read() 
    except: 
     print('No submission: %s' %fname) 

# iterate through the pairs of documents 
for doc_pair in product(doc_dict.keys(), doc_dict.keys()): 
    pct = compare_documents(doc_dict[doc_pair[0]], doc_dict[doc_pair[1]]) 
    print('Percentage of %s sentences in %s: %0.2f%%' %(doc_pair[0], doc_pair[1], 100*pct)) 
Смежные вопросы