Bouw je eigen kopieercontroletool en leer over de krachtige mogelijkheden van de Difflib-module.

Naarmate digitale inhoud steeds populairder wordt, is het belangrijker dan ooit geworden om deze te beschermen tegen kopiëren en misbruik. Een plagiaatdetectietool kan docenten helpen het werk van studenten te evalueren, instellingen onderzoeksdocumenten controleren en schrijvers helpen diefstal van hun intellectuele eigendom op te sporen.

Het bouwen van een plagiaattool kan u helpen bij het begrijpen van sequentieovereenkomsten, bestandsbewerkingen en gebruikersinterfaces. Je onderzoekt ook technieken voor natuurlijke taalverwerking (NLP) om je toepassing te verbeteren.

De Tkinter- en Difflib-module

Om een ​​plagiaatdetector te bouwen, gebruik je Tkinter en de Difflib-module. Tkinter is een eenvoudige, platformonafhankelijke bibliotheek die u kunt gebruiken om te creëren grafische gebruikersinterfaces snel.

De Difflib-module maakt deel uit van de Python-standaardbibliotheek die klassen en functies biedt voor het vergelijken van reeksen zoals tekenreeksen, lijsten en bestanden. Hiermee kun je programma's bouwen zoals een automatische tekstcorrectie, een vereenvoudigde

versie controle systeem, of een tool voor het samenvatten van tekst.

Hoe een plagiaatdetector te bouwen met behulp van Python

Je kunt hierin de volledige broncode vinden die een plagiaatdetector bouwt met behulp van Python GitHub-opslagplaats.

Importeer de benodigde modules. Definieer een methode, load_file_or_display_contents() dat duurt binnenkomst En tekst_widget als argumenten. Deze methode laadt een tekstbestand en geeft de inhoud weer in een tekstwidget.

Gebruik de krijgen() methode om het bestandspad uit te pakken. Als de gebruiker niets heeft ingevoerd, gebruikt u de askopenbestandsnaam() methode om een ​​bestandsdialoogvenster te openen om het gewenste bestand voor plagiaatcontrole te selecteren. Als de gebruiker het bestandspad selecteert, wist u de vorige invoer, indien aanwezig, van het begin tot het einde en voegt u het geselecteerde pad in.

import tkinter as tk
from tkinter import filedialog
from difflib import SequenceMatcher

defload_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)

Open het bestand in leesmodus en sla de inhoud op in het tekst variabel. Wis de inhoud van de text_widget en voeg de tekst in die u eerder hebt geëxtraheerd.

with open(file_path, 'r') as file:
text = file.read()
text_widget.delete(1.0, tk.END)
text_widget.insert(tk.END, text)

Definieer een methode, vergelijk_tekst() die u gaat gebruiken om twee stukken tekst te vergelijken en hun overeenkomstpercentage te berekenen. Gebruik Difflib's SequenceMatcher() klasse om sequenties te vergelijken en gelijkenis te bepalen. Stel de aangepaste vergelijkingsfunctie in op Geen om de standaardvergelijking te gebruiken en geef de tekst door die u wilt vergelijken.

Gebruik de verhoudingsmethode om de overeenkomst in een drijvende-komma-indeling te krijgen die u kunt gebruiken om het overeenkomstpercentage te berekenen. Gebruik de get_opcodes() methode om een ​​reeks bewerkingen op te halen die u kunt gebruiken om vergelijkbare delen van tekst te markeren en deze samen met het overeenkomstpercentage te retourneren.

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

Definieer een methode, show_similarity(). Gebruik de krijgen() methode om de tekst uit beide tekstvakken te extraheren en door te geven aan het vergelijk_tekst() functie. Wis de inhoud van het tekstvak dat het resultaat zal weergeven en voeg het overeenkomstpercentage in. Verwijder de "dezelfde" tag van de vorige markering (indien aanwezig).

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)

De get_opcode() methode geeft vijf tupels terug: de opcode-string, de startindex van de eerste reeks, de eindindex van de eerste reeks, de startindex van de tweede reeks en de eindindex van de tweede reeks.

De opcode-tekenreeks kan een van de vier mogelijke waarden zijn: vervangen, verwijderen, invoegen en gelijkstellen. Je zult krijgen vervangen wanneer een deel van de tekst in beide reeksen verschillend is en iemand het ene deel door een ander heeft vervangen. Je zult krijgen verwijderen wanneer een deel van de tekst in de eerste reeks voorkomt, maar niet in de tweede.

Jij krijgt invoegen wanneer een deel van de tekst afwezig is in de eerste reeks maar aanwezig is in de tweede. Je krijgt gelijk als de delen van de tekst hetzelfde zijn. Sla al deze waarden op in geschikte variabelen. Als de opcodereeks is gelijkwaardig, voeg de dezelfde tag aan de tekstreeks.

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")

Initialiseer het Tkinter-rootvenster. Stel de titel van het venster in en definieer een kader erin. Organiseer het frame met de juiste opvulling in beide richtingen. Definieer twee labels om weer te geven Tekst 1 En Tekst 2. Stel het bovenliggende element in waarin het moet staan ​​en de tekst die het moet weergeven.

Definieer drie tekstvakken, twee voor de teksten die u wilt vergelijken en één om het resultaat weer te geven. Declareer het bovenliggende element, de breedte en de hoogte en stel de wrap-optie in op tk. WOORD om ervoor te zorgen dat het programma de woorden omsluit bij de dichtstbijzijnde grens en geen enkel woord ertussen breekt.

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)

Definieer drie knoppen, twee om de bestanden te laden en één ter vergelijking. Definieer het bovenliggende element, de tekst die moet worden weergegeven en de functie die moet worden uitgevoerd wanneer erop wordt geklikt. Maak twee invoerwidgets om het bestandspad in te voeren en het bovenliggende element samen met de breedte ervan te definiëren.

Organiseer al deze elementen in rijen en kolommen met behulp van de rastermanager. Gebruik het pakket om het te organiseren vergelijk_knop en de text_textbox_diff. Voeg waar nodig de juiste opvulling toe.

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)

Markeer de tekst die als hetzelfde is gemarkeerd met een gele achtergrond en een rode letterkleur.

text_textbox1.tag_configure("same", foreground="red", background="lightyellow")
text_textbox2.tag_configure("same", foreground="red", background="lightyellow")

De Hoofdlus() functie vertelt Python om de Tkinter-gebeurtenislus uit te voeren en te luisteren naar gebeurtenissen totdat u het venster sluit.

root.mainloop()

Zet alles bij elkaar en voer de code uit om plagiaat te detecteren.

Voorbeelduitvoer van de plagiaatdetector

Wanneer u het programma uitvoert, wordt er een venster weergegeven. Bij het raken van de Laad bestand 1 knop, wordt een bestandsdialoogvenster geopend waarin u wordt gevraagd een bestand te kiezen. Bij het kiezen van een bestand geeft het programma de inhoud weer in het eerste tekstvak. Bij het betreden van het pad en slaan Laad bestand 2, geeft het programma de inhoud weer in het tweede tekstvak. Bij het raken van de Vergelijken knop, krijg je de overeenkomst als 100%, en het markeert de hele tekst voor 100% overeenkomst.

Als u nog een regel toevoegt aan een van de tekstvakken en drukt Vergelijken, markeert het programma het vergelijkbare gedeelte en laat het de rest weg.

Als er weinig tot geen overeenkomst is, markeert het programma enkele letters of woorden, maar het overeenkomstpercentage is vrij laag.

NLP gebruiken voor plagiaatdetectie

Hoewel Difflib een krachtige methode is voor tekstvergelijking, is het gevoelig voor kleine veranderingen, heeft het een beperkt begrip van de context en is het vaak niet effectief voor grote teksten. U zou moeten overwegen om Natural Language Processing te verkennen, aangezien het semantische analyse van de tekst kan uitvoeren, betekenisvolle kenmerken kan extraheren en contextueel begrip heeft.

Bovendien kunt u uw model trainen voor verschillende talen en optimaliseren voor efficiëntie. Enkele van de technieken die u kunt gebruiken voor plagiaatdetectie zijn Jaccard-overeenkomst, cosinusovereenkomst, woordinbedding, latente reeksanalyse en reeks-naar-reeks-modellen.