Bygg ditt eget kopikontrollverktøy og lær om Difflib-modulens kraftige funksjoner.

Ettersom digitalt innhold har vokst i popularitet, har det blitt viktigere enn noen gang å beskytte det mot kopiering og misbruk. Et plagiatdeteksjonsverktøy kan hjelpe lærere med å evaluere studentenes arbeid, institusjoner sjekke forskningsartikler, og forfattere oppdage tyveri av deres immaterielle rettigheter.

Å bygge et plagiatverktøy kan hjelpe deg med å forstå sekvensmatching, filoperasjoner og brukergrensesnitt. Du vil også utforske naturlige språkbehandlingsteknikker (NLP) for å forbedre applikasjonen din.

Tkinter og Difflib-modulen

For å bygge en plagiatdetektor bruker du Tkinter og Difflib-modulen. Tkinter er et enkelt bibliotek på tvers av plattformer som du kan bruke til å lage grafiske brukergrensesnitt raskt.

Difflib-modulen er en del av Python-standardbiblioteket som gir klasser og funksjoner for å sammenligne sekvenser som strenger, lister og filer. Med den kan du bygge programmer som en automatisk tekstkorrigering, en forenklet versjonskontrollsystem, eller et tekstoppsummeringsverktøy.

Hvordan bygge en plagiatdetektor ved hjelp av Python

Du kan finne hele kildekoden som bygger en plagiatdetektor ved å bruke Python i denne GitHub-depot.

Importer de nødvendige modulene. Definer en metode, load_file_or_display_contents() som tar inngang og tekst_widget som argumenter. Denne metoden vil laste inn en tekstfil og vise innholdet i en tekstwidget.

Bruke få() metode for å pakke ut filbanen. Hvis brukeren ikke har skrevet inn noe, bruk askopenfilename() metode for å åpne et fildialogvindu for å velge ønsket fil for plagieringssjekk. Hvis brukeren velger filbanen, fjerner du den forrige oppføringen, hvis noen, fra begynnelsen til slutten og setter inn banen de valgte.

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)

Åpne filen i lesemodus og lagre innholdet i tekst variabel. Fjern innholdet i text_widgeten og sett inn teksten du hentet ut 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 bruke til å sammenligne to tekststykker og beregne likhetsprosenten deres. Bruk Difflib's SequenceMatcher() klasse for å sammenligne sekvenser og bestemme likhet. Sett den tilpassede sammenligningsfunksjonen til Ingen for å bruke standardsammenligningen, og send teksten du vil sammenligne.

Bruk forholdsmetoden for å få likheten i et flyttallformat som du kan bruke til å beregne likhetsprosenten. Bruke get_opcodes() metode for å hente et sett med operasjoner som du kan bruke til å markere lignende deler av teksten og returnere den sammen med likhetsprosenten.

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(). Bruke få() metode for å trekke ut teksten fra begge tekstboksene og sende dem inn i compare_text() funksjon. Fjern innholdet i tekstboksen som viser resultatet og sett inn likhetsprosenten. Fjern "samme" tag fra forrige utheving (hvis noen).

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() metoden returnerer fem tupler: opcode-strengen, startindeksen til den første sekvensen, sluttindeksen av den første sekvensen, startindeksen for den andre sekvensen og sluttindeksen til den andre sekvens.

Opcode-strengen kan være én av fire mulige verdier: replace, delete, insert og like. Du vil få erstatte når en del av teksten i begge sekvensene er forskjellig, og noen erstattet en del med en annen. Du vil få slette når en del av teksten finnes i den første sekvensen, men ikke i den andre.

Du får sett inn når en del av teksten er fraværende i den første sekvensen, men til stede i den andre. Du blir lik når delene av teksten er like. Lagre alle disse verdiene i passende variabler. Hvis opcode-strengen er lik, Legg til 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-rotvinduet. Angi tittelen på vinduet og definer en ramme inne i det. Organiser rammen med passende polstring i begge retninger. Definer to etiketter som skal vises Tekst 1 og Tekst 2. Angi det overordnede elementet det skal ligge i og teksten det skal vise.

Definer tre tekstbokser, to for tekstene du vil sammenligne og en for å vise resultatet. Deklarer det overordnede elementet, bredden og høyden, og sett innpakningsalternativet til tk. ORD for å sikre at programmet pakker inn ordene ved nærmeste grense og ikke bryter noen ord i mellom.

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 for å laste filene og en for sammenligning. Definer det overordnede elementet, teksten det skal vise, og funksjonen det skal utføre når det klikkes. Opprett to oppføringswidgeter for å legge inn filbanen og definere det overordnede elementet sammen med dets bredde.

Organiser alle disse elementene i rader og kolonner ved hjelp av grid manager. Bruk pakken til å organisere sammenlign_knapp og tekst_tekstboks_diff. Legg til passende polstring der det er nødvendig.

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)

Fremhev teksten merket som den samme med gul bakgrunn og rød skriftfarge.

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

De mainloop() funksjonen forteller Python å kjøre Tkinter-hendelsesløkken og lytte etter hendelser til du lukker vinduet.

root.mainloop()

Sett alt sammen og kjør koden for å oppdage plagiat.

Eksempelutgang fra plagiatdetektoren

Når du kjører programmet, viser det et vindu. Ved å treffe Last inn fil 1 -knappen, åpnes en fildialog og ber deg velge en fil. Når du velger en fil, viser programmet innholdet i den første tekstboksen. Ved å gå inn på stien og treffe Last inn fil 2, viser programmet innholdet i den andre tekstboksen. Ved å treffe Sammenligne knappen, får du likheten som 100 %, og den fremhever hele teksten for 100 % likhet.

Hvis du legger til en annen linje i en av tekstboksene og trykker Sammenligne, fremhever programmet den lignende delen og utelater resten.

Hvis det er liten eller ingen likhet, fremhever programmet noen bokstaver eller ord, men likhetsprosenten er ganske lav.

Bruke NLP for plagiatdeteksjon

Mens Difflib er en kraftig metode for tekstsammenligning, er den følsom for mindre endringer, har begrenset kontekstforståelse og er ofte ineffektiv for store tekster. Du bør vurdere å utforske Natural Language Processing siden den kan utføre semantisk analyse av teksten, trekke ut meningsfulle trekk og har kontekstuell forståelse.

Dessuten kan du trene modellen din for forskjellige språk og optimalisere den for effektivitet. Noen få av teknikkene du kan bruke for plagiatdeteksjon inkluderer Jaccard-likhet, cosinus-likhet, ordinnbygging, latent sekvensanalyse og sekvens-til-sekvens-modeller.