2016-09-19 5 views
1

Ich versuche, eine Funktion zu schreiben, die Textdateien in eine Liste einfügt und dann durch die Dateien iteriert, um exakte und teilweise Kopien zu finden, um Leute auszusondern, die durch Plagarisierung ihrer Arbeit betrogen haben könnten. Ich beginne damit, meine Klassenliste zu verwenden und .txt zu ihrem Namen hinzuzufügen, um ihre Zuordnungen zu finden und ob sie die Zuweisung sogar abgeschlossen haben oder nicht. Ich habe über 500 Schülerarbeiten zu lesen. Mit dem Code, den ich bisher geschrieben habe, wird er wortwörtlich innerhalb der .txt-Dateien wiederholt, so dass ich zu viele "Betrogene" zurückbekomme. Bitte helfen.Iterieren durch mehrere Textdateien und Vergleichen

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

Die erste Sache ist zu definieren, was Betrug ausmacht. Das Finden übereinstimmender Wörter oder Wortpaare ist eine schlechte Metrik, da diese innerhalb eines bestimmten Themas sehr häufig vorkommen. Möglicherweise möchten Sie jedes Dokument nach Satz aufteilen und vergleichen, wie viele Sätze zwischen Dokumenten geteilt werden. Wenn Sie wirklich clever werden möchten, können Sie eine Bearbeitungsentfernung implementieren, die vergleicht, wie viele Ersetzungen von jedem Satz in einem Dokument zu jedem Satz in einem anderen Dokument erforderlich sind. – James

+0

Vielen Dank. Ich möchte nach Pluralismus suchen. Können Sie mir bitte erklären, wie ich Zeile für Zeile statt Wort für Wort iterieren könnte? Auch was genau meinst du mit "Entfernung bearbeiten?" wie eine Reihe von Elementen, die bearbeitet werden können? –

+0

Ich arbeite an einem Code, um Ihnen zu helfen. Sind alle Dokumentdateinamen in einer Liste in roster.txt enthalten? – James

Antwort

0

Versuchen Sie es. Möglicherweise müssen Sie es für Ihre Dateistruktur ändern, aber es sollte geschlossen sein.

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)) 
Verwandte Themen