Byg dit eget kopikontrolværktøj, og lær om Difflib-modulets kraftfulde muligheder.

Efterhånden som digitalt indhold er vokset i popularitet, er det blevet vigtigere end nogensinde at beskytte det mod kopiering og misbrug. Et værktøj til afsløring af plagiat kan hjælpe lærere med at evaluere elevernes arbejde, institutioner tjekke forskningspapirer, og forfattere opdage tyveri af deres intellektuelle ejendom.

Opbygning af et plagiatværktøj kan hjælpe dig med at forstå sekvensmatching, filhandlinger og brugergrænseflader. Du vil også udforske naturlige sprogbehandlingsteknikker (NLP) for at forbedre din applikation.

Tkinter og Difflib-modulet

For at bygge en plagiatdetektor skal du bruge Tkinter og Difflib-modulet. Tkinter er et simpelt bibliotek på tværs af platforme som du kan bruge til at oprette grafiske brugergrænseflader hurtigt.

Difflib-modulet er en del af Python-standardbiblioteket, der giver klasser og funktioner til at sammenligne sekvenser som strenge, lister og filer. Med det kan du bygge programmer som en tekst auto-korrektion, en forenklet

instagram viewer
versionskontrolsystem, eller et tekstopsummeringsværktøj.

Sådan bygger du en plagiatdetektor ved hjælp af Python

Du kan finde hele kildekoden til at bygge en plagiatdetektor ved hjælp af Python i denne GitHub-depot.

Importer de nødvendige moduler. Definer en metode, load_file_or_display_contents() der tager indgang og tekst_widget som argumenter. Denne metode indlæser en tekstfil og viser dens indhold i en tekstwidget.

Brug få() metode til at udtrække filstien. Hvis brugeren ikke har indtastet noget, skal du bruge askopenfilename() metode til at åbne et fildialogvindue for at vælge den ønskede fil til plagiatkontrol. Hvis brugeren vælger filstien, skal du rydde den tidligere indtastning, hvis nogen, fra begyndelsen til slutningen og indsætte den valgte sti.

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)

Åbn filen i læsetilstand og gem indholdet i tekst variabel. Ryd indholdet af text_widget'en, og indsæt den tekst, du udpakkede tidligere.

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

Definer en metode, compare_text() som du vil bruge til at sammenligne to stykker tekst og beregne deres lighedsprocent. Brug Difflib's SequenceMatcher() klasse for at sammenligne sekvenser og bestemme lighed. Indstil den brugerdefinerede sammenligningsfunktion til Ingen for at bruge standardsammenligningen, og send den tekst, du vil sammenligne.

Brug forholdsmetoden til at få ligheden i et flydende komma-format, som du kan bruge til at beregne lighedsprocenten. Brug get_opcodes() metode til at hente et sæt operationer, som du kan bruge til at fremhæve lignende dele af tekst og returnere den sammen med lighedsprocenten.

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

Definer en metode, show_similarity(). Brug få() metode til at udtrække teksten fra begge tekstbokse og overføre dem til compare_text() fungere. Ryd indholdet af tekstboksen, der viser resultatet, og indsæt lighedsprocenten. Fjern "samme" tag fra den tidligere fremhævning (hvis nogen).

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)

Det get_opcode() metoden returnerer fem tupler: opcode-strengen, startindekset for den første sekvens, slutindekset af den første sekvens, startindekset for den anden sekvens og slutindekset for den anden rækkefølge.

Opcode-strengen kan være en af ​​fire mulige værdier: replace, delete, insert og equal. Du vil få erstatte når en del af teksten i begge sekvenser er forskellig, og nogen erstattede en del med en anden. Du vil få slette når en del af teksten findes i den første sekvens, men ikke den anden.

Du får indsætte når en del af teksten er fraværende i den første sekvens, men til stede i den anden. Du bliver lige, når dele af teksten er ens. Gem alle disse værdier i passende variable. Hvis opcode-strengen er lige, tilføj samme tag til tekstsekvensen.

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

Initialiser Tkinter-rodvinduet. Indstil vinduets titel og definer en ramme inde i det. Organiser rammen med passende polstring i begge retninger. Definer to etiketter, der skal vises Tekst 1 og Tekst 2. Indstil det overordnede element, det skal ligge i, og den tekst, det skal vise.

Definer tre tekstbokse, to for de tekster, du vil sammenligne, og en for at vise resultatet. Angiv det overordnede element, bredden og højden, og indstil ombrydningsindstillingen til tk. ORD for at sikre, at programmet pakker ordene ved den nærmeste grænse og ikke bryder noget ord imellem.

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)

Definer tre knapper, to til at indlæse filerne og en til sammenligning. Definer det overordnede element, den tekst, det skal vise, og den funktion, det skal udføre, når der klikkes på det. Opret to indgangswidgets for at indtaste filstien og definere det overordnede element sammen med dets bredde.

Organiser alle disse elementer i rækker og kolonner ved hjælp af grid manager. Brug pakken til at organisere sammenlign_knap og text_textbox_diff. Tilføj passende polstring, hvor det er nødvendigt.

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)

Fremhæv teksten markeret som den samme med en gul baggrund og rød skriftfarve.

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

Det mainloop() funktion fortæller Python at køre Tkinter-hændelsesløkken og lytte efter hændelser, indtil du lukker vinduet.

root.mainloop()

Sæt det hele sammen og kør koden for at opdage plagiat.

Eksempel output af plagiatdetektoren

Når du kører programmet, viser det et vindue. Ved at ramme Indlæs fil 1 knappen, åbnes en fildialog og beder dig om at vælge en fil. Når du vælger en fil, viser programmet indholdet i den første tekstboks. På at komme ind på stien og slå Indlæs fil 2, viser programmet indholdet i den anden tekstboks. Ved at ramme Sammenligne knappen, får du ligheden som 100 %, og den fremhæver hele teksten for 100 % lighed.

Hvis du tilføjer endnu en linje til en af ​​tekstboksene og trykker Sammenligne, fremhæver programmet den tilsvarende del og udelader resten.

Hvis der er lidt eller ingen lighed, fremhæver programmet nogle bogstaver eller ord, men lighedsprocenten er ret lav.

Brug af NLP til plagiatdetektion

Mens Difflib er en kraftfuld metode til tekstsammenligning, er den følsom over for mindre ændringer, har begrænset kontekstforståelse og er ofte ineffektiv for store tekster. Du bør overveje at udforske Natural Language Processing, da den kan udføre semantisk analyse af teksten, udtrække meningsfulde træk og har kontekstuel forståelse.

Desuden kan du træne din model til forskellige sprog og optimere den til effektivitet. Et par af de teknikker, du kan bruge til plagiatdetektion, omfatter Jaccard-lighed, cosinus-lighed, ordindlejringer, latent sekvensanalyse og sekvens-til-sekvens-modeller.