Erstellen Sie Ihr eigenes Copy-Checker-Tool und erfahren Sie mehr über die leistungsstarken Funktionen des Difflib-Moduls.
Da digitale Inhalte immer beliebter werden, ist es wichtiger denn je, sie vor Kopieren und Missbrauch zu schützen. Ein Tool zur Plagiatserkennung kann Lehrern dabei helfen, die Arbeit von Schülern zu bewerten, Institutionen dabei helfen, Forschungsarbeiten zu überprüfen und Autoren dabei zu helfen, Diebstahl ihres geistigen Eigentums aufzudecken.
Der Aufbau eines Plagiatstools kann Ihnen dabei helfen, den Sequenzabgleich, Dateivorgänge und Benutzeroberflächen zu verstehen. Sie werden auch Techniken zur Verarbeitung natürlicher Sprache (NLP) erkunden, um Ihre Anwendung zu verbessern.
Das Tkinter- und Difflib-Modul
Um einen Plagiatsdetektor zu erstellen, verwenden Sie Tkinter und das Difflib-Modul. Tkinter ist eine einfache, plattformübergreifende Bibliothek die Sie zum Erstellen verwenden können grafische Benutzeroberflächen schnell.
Das Difflib-Modul ist Teil der Python-Standardbibliothek, die Klassen und Funktionen zum Vergleichen von Sequenzen wie Strings, Listen und Dateien bereitstellt. Damit können Sie Programme wie eine vereinfachte Text-Autokorrektur erstellen
Versionskontrollsystemoder ein Textzusammenfassungstool.So erstellen Sie einen Plagiatsdetektor mit Python
Den gesamten Quellcode zum Erstellen eines Plagiatsdetektors mit Python finden Sie hier GitHub-Repository.
Importieren Sie die erforderlichen Module. Definieren Sie eine Methode, load_file_or_display_contents() das macht Eintrag Und text_widget als Argumente. Diese Methode lädt eine Textdatei und zeigt ihren Inhalt in einem Text-Widget an.
Benutzen Sie die erhalten() Methode zum Extrahieren des Dateipfads. Wenn der Benutzer nichts eingegeben hat, verwenden Sie die askopenfilename() Methode zum Öffnen eines Dateidialogfensters zur Auswahl der gewünschten Datei für die Plagiatsprüfung. Wenn der Benutzer den Dateipfad auswählt, löschen Sie ggf. den vorherigen Eintrag vom Anfang bis zum Ende und fügen Sie den von ihm ausgewählten Pfad ein.
import tkinter as tk
from tkinter import filedialog
from difflib import SequenceMatcherdefload_file_or_display_contents(entry, text_widget):
file_path = entry.get()ifnot file_path:
file_path = filedialog.askopenfilename()
if file_path:
entry.delete(0, tk.END)
entry.insert(tk.END, file_path)
Öffnen Sie die Datei im Lesemodus und speichern Sie den Inhalt im Text Variable. Löschen Sie den Inhalt des text_widget und fügen Sie den zuvor extrahierten Text ein.
with open(file_path, 'r') as file:
text = file.read()
text_widget.delete(1.0, tk.END)
text_widget.insert(tk.END, text)
Definieren Sie eine Methode, vergleichen_text() mit dem Sie zwei Textteile vergleichen und deren Ähnlichkeitsprozentsatz berechnen. Verwenden Sie Difflibs SequenceMatcher() Klasse, um Sequenzen zu vergleichen und Ähnlichkeiten zu bestimmen. Stellen Sie die benutzerdefinierte Vergleichsfunktion auf ein Keiner, um den Standardvergleich zu verwenden, und übergeben Sie den Text, den Sie vergleichen möchten.
Verwenden Sie die Verhältnismethode, um die Ähnlichkeit in einem Gleitkommaformat zu erhalten, das Sie zur Berechnung des Ähnlichkeitsprozentsatzes verwenden können. Benutzen Sie die get_opcodes() -Methode zum Abrufen einer Reihe von Vorgängen, mit denen Sie ähnliche Textabschnitte hervorheben und zusammen mit dem Ähnlichkeitsprozentsatz zurückgeben können.
defcompare_text(text1, text2):
d = SequenceMatcher(None, text1, text2)
similarity_ratio = d.ratio()
similarity_percentage = int(similarity_ratio * 100)
diff = list(d.get_opcodes())
return similarity_percentage, diff
Definieren Sie eine Methode, show_similarity(). Benutzen Sie die erhalten() Methode, um den Text aus beiden Textfeldern zu extrahieren und an die zu übergeben vergleichen_text() Funktion. Löschen Sie den Inhalt des Textfelds, in dem das Ergebnis angezeigt wird, und fügen Sie den Ähnlichkeitsprozentsatz ein. Entferne das "Dasselbe" Tag aus der vorherigen Hervorhebung (falls vorhanden).
defshow_similarity():
text1 = text_textbox1.get(1.0, tk.END)
text2 = text_textbox2.get(1.0, tk.END)
similarity_percentage, diff = compare_text(text1, text2)
text_textbox_diff.delete(1.0, tk.END)
text_textbox_diff.insert(tk.END, f"Similarity: {similarity_percentage}%")
text_textbox1.tag_remove("same", "1.0", tk.END)
text_textbox2.tag_remove("same", "1.0", tk.END)
Der get_opcode() Die Methode gibt fünf Tupel zurück: den Opcode-String, den Startindex der ersten Sequenz und den Endindex der ersten Sequenz, der Startindex der zweiten Sequenz und der Endindex der zweiten Reihenfolge.
Die Opcode-Zeichenfolge kann einen von vier möglichen Werten haben: ersetzen, löschen, einfügen und gleich. Sie erhalten ersetzen wenn ein Teil des Textes in beiden Sequenzen unterschiedlich ist und jemand einen Teil durch einen anderen ersetzt hat. Sie erhalten löschen wenn ein Teil des Textes in der ersten Sequenz vorhanden ist, in der zweiten jedoch nicht.
Du erhältst Einfügung wenn ein Teil des Textes in der ersten Sequenz fehlt, in der zweiten jedoch vorhanden ist. Sie erhalten Gleichheit, wenn die Teile des Textes gleich sind. Speichern Sie alle diese Werte in geeigneten Variablen. Wenn die Opcode-Zeichenfolge lautet gleich, Ergänzen Sie die Dasselbe Tag zur Textsequenz hinzufügen.
for opcode in diff:
tag = opcode[0]
start1 = opcode[1]
end1 = opcode[2]
start2 = opcode[3]
end2 = opcode[4]
if tag == "equal":
text_textbox1.tag_add("same", f"1.0+{start1}c", f"1.0+{end1}c")
text_textbox2.tag_add("same", f"1.0+{start2}c", f"1.0+{end2}c")
Initialisieren Sie das Tkinter-Root-Fenster. Legen Sie den Titel des Fensters fest und definieren Sie darin einen Rahmen. Organisieren Sie den Rahmen mit entsprechender Polsterung in beide Richtungen. Definieren Sie zwei anzuzeigende Beschriftungen Text 1 Und Text 2. Legen Sie das übergeordnete Element fest, in dem es sich befinden soll, und den Text, den es anzeigen soll.
Definieren Sie drei Textfelder, zwei für die zu vergleichenden Texte und eines zur Anzeige des Ergebnisses. Deklarieren Sie das übergeordnete Element, die Breite und die Höhe und setzen Sie die Wrap-Option auf Tk. WORT um sicherzustellen, dass das Programm die Wörter an der nächsten Grenze umbricht und kein Wort dazwischen umbricht.
root = tk.Tk()
root.title("Text Comparison Tool")
frame = tk.Frame(root)
frame.pack(padx=10, pady=10)
text_label1 = tk.Label(frame, text="Text 1:")
text_label1.grid(row=0, column=0, padx=5, pady=5)
text_textbox1 = tk.Text(frame, wrap=tk.WORD, width=40, height=10)
text_textbox1.grid(row=0, column=1, padx=5, pady=5)
text_label2 = tk.Label(frame, text="Text 2:")
text_label2.grid(row=0, column=2, padx=5, pady=5)
text_textbox2 = tk.Text(frame, wrap=tk.WORD, width=40, height=10)
text_textbox2.grid(row=0, column=3, padx=5, pady=5)
Definieren Sie drei Schaltflächen, zwei zum Laden der Dateien und eine zum Vergleich. Definieren Sie das übergeordnete Element, den Text, den es anzeigen soll, und die Funktion, die es beim Klicken ausführen soll. Erstellen Sie zwei Eintrags-Widgets, um den Dateipfad einzugeben und das übergeordnete Element sowie seine Breite zu definieren.
Organisieren Sie alle diese Elemente mithilfe des Rastermanagers in Zeilen und Spalten. Verwenden Sie Pack, um das zu organisieren vergleichen_button und das text_textbox_diff. Fügen Sie bei Bedarf entsprechende Polsterung hinzu.
file_entry1 = tk.Entry(frame, width=50)
file_entry1.grid(row=1, column=2, columnspan=2, padx=5, pady=5)
load_button1 = tk.Button(frame, text="Load File 1", command=lambda: load_file_or_display_contents(file_entry1, text_textbox1))
load_button1.grid(row=1, column=0, padx=5, pady=5, columnspan=2)
file_entry2 = tk.Entry(frame, width=50)
file_entry2.grid(row=2, column=2, columnspan=2, padx=5, pady=5)
load_button2 = tk.Button(frame, text="Load File 2", command=lambda: load_file_or_display_contents(file_entry2, text_textbox2))
load_button2.grid(row=2, column=0, padx=5, pady=5, columnspan=2)
compare_button = tk.Button(root, text="Compare", command=show_similarity)
compare_button.pack(pady=5)
text_textbox_diff = tk.Text(root, wrap=tk.WORD, width=80, height=1)
text_textbox_diff.pack(padx=10, pady=10)
Markieren Sie den als gleich gekennzeichneten Text mit gelbem Hintergrund und roter Schriftfarbe.
text_textbox1.tag_configure("same", foreground="red", background="lightyellow")
text_textbox2.tag_configure("same", foreground="red", background="lightyellow")
Der Hauptschleife() Die Funktion weist Python an, die Tkinter-Ereignisschleife auszuführen und auf Ereignisse zu warten, bis Sie das Fenster schließen.
root.mainloop()
Fügen Sie alles zusammen und führen Sie den Code aus, um Plagiate zu erkennen.
Beispielausgabe des Plagiatsdetektors
Wenn Sie das Programm ausführen, wird ein Fenster angezeigt. Beim Schlagen des Datei 1 laden Klicken Sie auf die Schaltfläche, um ein Dateidialogfeld zu öffnen, in dem Sie aufgefordert werden, eine Datei auszuwählen. Wenn Sie eine Datei auswählen, zeigt das Programm den Inhalt im ersten Textfeld an. Beim Betreten des Weges und beim Schlagen Datei 2 laden, zeigt das Programm den Inhalt im zweiten Textfeld an. Beim Schlagen des Vergleichen Wenn Sie auf die Schaltfläche klicken, erhalten Sie eine Ähnlichkeit von 100 % und der gesamte Text wird für 100 % Ähnlichkeit hervorgehoben.
Wenn Sie einem der Textfelder eine weitere Zeile hinzufügen und klicken Vergleichen, hebt das Programm den ähnlichen Teil hervor und lässt den Rest weg.
Wenn die Ähnlichkeit gering oder gar nicht vorhanden ist, hebt das Programm einige Buchstaben oder Wörter hervor, der Ähnlichkeitsprozentsatz ist jedoch ziemlich niedrig.
Verwendung von NLP zur Plagiatserkennung
Während Difflib eine leistungsstarke Methode zum Textvergleich ist, reagiert es empfindlich auf geringfügige Änderungen, verfügt über ein begrenztes Kontextverständnis und ist bei großen Texten oft ineffektiv. Sie sollten die Verarbeitung natürlicher Sprache in Betracht ziehen, da sie eine semantische Analyse des Textes durchführen, aussagekräftige Merkmale extrahieren und über ein Kontextverständnis verfügt.
Darüber hinaus können Sie Ihr Modell für verschiedene Sprachen trainieren und auf Effizienz optimieren. Zu den Techniken, die Sie zur Plagiatserkennung verwenden können, gehören Jaccard-Ähnlichkeit, Kosinus-Ähnlichkeit, Worteinbettungen, latente Sequenzanalyse und Sequenz-zu-Sequenz-Modelle.