Izgradite vlastiti alat za provjeru kopiranja i naučite o snažnim mogućnostima Difflib modula.
Kako digitalni sadržaj postaje sve popularniji, postalo je važnije nego ikad zaštititi ga od kopiranja i zlouporabe. Alat za otkrivanje plagijata može pomoći nastavnicima da ocijene rad učenika, institucijama da provjere istraživačke radove, a piscima da otkriju krađu svog intelektualnog vlasništva.
Izrada alata za plagiranje može vam pomoći u razumijevanju podudaranja niza, operacija datoteka i korisničkih sučelja. Također ćete istražiti tehnike obrade prirodnog jezika (NLP) kako biste poboljšali svoju primjenu.
Tkinter i Difflib modul
Za izradu detektora plagijata koristit ćete Tkinter i Difflib modul. Tkinter je jednostavna, višeplatformska biblioteka koje možete koristiti za stvaranje grafička korisnička sučelja brzo.
Modul Difflib dio je Python standardne biblioteke koja pruža klase i funkcije za usporedbu sekvenci poput nizova, popisa i datoteka. Pomoću njega možete izraditi programe poput automatskog ispravljača teksta, pojednostavljenog
sustav kontrole verzija, ili alat za sažimanje teksta.Kako izgraditi detektor plagijata pomoću Pythona
Ovdje možete pronaći cijeli izvorni kod za izradu detektora plagijata pomoću Pythona GitHub spremište.
Uvezite potrebne module. Definirajte metodu, load_file_or_display_contents() koji traje unos i tekstualni_widget kao argumente. Ova će metoda učitati tekstualnu datoteku i prikazati njezin sadržaj u tekstualnom widgetu.
Koristiti dobiti() metoda za izdvajanje putanje datoteke. Ako korisnik nije ništa unio, upotrijebite askopenfilename() metoda za otvaranje dijaloškog prozora datoteke za odabir željene datoteke za provjeru plagijata. Ako korisnik odabere put datoteke, obrišite prethodni unos, ako postoji, od početka do kraja i umetnite put koji je odabrao.
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)
Otvorite datoteku u načinu čitanja i pohranite sadržaj u tekst varijabla. Očistite sadržaj text_widgeta i umetnite tekst koji ste prethodno izdvojili.
with open(file_path, 'r') as file:
text = file.read()
text_widget.delete(1.0, tk.END)
text_widget.insert(tk.END, text)
Definirajte metodu, usporedi_tekst() koje ćete koristiti za usporedbu dva teksta i izračunavanje postotka njihove sličnosti. Koristi Difflib SequenceMatcher() razreda za usporedbu nizova i određivanje sličnosti. Postavite prilagođenu funkciju usporedbe na Nijedan za korištenje zadane usporedbe i proslijedite tekst koji želite usporediti.
Upotrijebite metodu omjera da dobijete sličnost u formatu s pomičnim zarezom koji možete koristiti za izračun postotka sličnosti. Koristiti get_opcodes() metoda za dohvaćanje skupa operacija koje možete koristiti za označavanje sličnih dijelova teksta i vraćanje zajedno s postotkom sličnosti.
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
Definirajte metodu, prikaži_sličnost(). Koristiti dobiti() metoda za izdvajanje teksta iz oba tekstna okvira i njihovo prosljeđivanje u usporedi_tekst() funkcija. Očistite sadržaj tekstualnog okvira koji će prikazati rezultat i umetnite postotak sličnosti. Uklonite "isti" oznaka iz prethodnog isticanja (ako postoji).
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)
The get_opcode() metoda vraća pet torki: niz operativnog koda, početni indeks prve sekvence, završni indeks prvog niza, početni indeks drugog niza i završni indeks drugog slijed.
Niz operativnog koda može biti jedna od četiri moguće vrijednosti: zamijeniti, izbrisati, umetnuti i jednako. Dobit ćeš zamijeniti kada je dio teksta u obje sekvence različit, a netko je jedan dio zamijenio drugim. Dobit ćeš izbrisati kada dio teksta postoji u prvom nizu, ali ne i u drugom.
dobivate umetnuti kada je dio teksta odsutan u prvoj sekvenci, ali je prisutan u drugoj. Dobivate jednake kad su dijelovi teksta isti. Pohranite sve te vrijednosti u odgovarajuće varijable. Ako je niz operacijskog koda jednak, dodajte isti oznaku nizu teksta.
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")
Inicijalizirajte Tkinter korijenski prozor. Postavite naslov prozora i definirajte okvir unutar njega. Organizirajte okvir s odgovarajućom podlogom u oba smjera. Definirajte dvije oznake za prikaz Tekst 1 i Tekst 2. Postavite nadređeni element u kojem bi se trebao nalaziti i tekst koji bi trebao prikazati.
Definirajte tri tekstna okvira, dva za tekstove koje želite usporediti i jedan za prikaz rezultata. Deklarirajte nadređeni element, širinu i visinu i postavite opciju prelamanja na tk. RIJEČ kako bi se osiguralo da program prelama riječi na najbližoj granici i ne prekida niti jednu riječ između.
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)
Definirajte tri gumba, dva za učitavanje datoteka i jedan za usporedbu. Definirajte nadređeni element, tekst koji bi trebao prikazati i funkciju koju bi trebao izvršiti kada se klikne. Stvorite dva widgeta za unos za unos putanje datoteke i definiranje nadređenog elementa zajedno s njegovom širinom.
Organizirajte sve te elemente u retke i stupce pomoću upravitelja rešetki. Koristite paket za organiziranje gumb za_usporedbu i text_textbox_diff. Dodajte odgovarajuću podlogu gdje je potrebno.
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)
Označite tekst označen kao isti sa žutom pozadinom i crvenom bojom fonta.
text_textbox1.tag_configure("same", foreground="red", background="lightyellow")
text_textbox2.tag_configure("same", foreground="red", background="lightyellow")
The glavna petlja() funkcija govori Pythonu da pokrene Tkinter petlju događaja i osluškuje događaje dok ne zatvorite prozor.
root.mainloop()
Sastavite sve zajedno i pokrenite kod za otkrivanje plagijata.
Primjer izlaza detektora plagijata
Kada pokrenete program, on prikazuje prozor. Pri udaru u Učitaj datoteku 1 otvara se dijaloški okvir datoteke i traži da odaberete datoteku. Nakon odabira datoteke, program prikazuje sadržaj unutar prvog tekstualnog okvira. Na ulasku u stazu i udaru Učitaj datoteku 2, program prikazuje sadržaj u drugom tekstualnom okviru. Pri udaru u Usporedi dobivate 100% sličnost i ističe cijeli tekst za 100% sličnost.
Ako dodate još jedan redak u jedan od tekstualnih okvira i pritisnete Usporedi, program ističe sličan dio i izostavlja ostatak.
Ako postoji mala ili nikakva sličnost, program ističe neka slova ili riječi, ali je postotak sličnosti prilično nizak.
Korištenje NLP-a za otkrivanje plagijata
Iako je Difflib moćna metoda za usporedbu teksta, osjetljiv je na manje promjene, ima ograničeno razumijevanje konteksta i često je neučinkovit za velike tekstove. Trebali biste razmotriti istraživanje obrade prirodnog jezika jer može izvršiti semantičku analizu teksta, izdvojiti značajne značajke i ima razumijevanje konteksta.
Štoviše, svoj model možete uvježbati za različite jezike i optimizirati ga za učinkovitost. Nekoliko tehnika koje možete koristiti za otkrivanje plagijata uključuju Jaccardovu sličnost, kosinusnu sličnost, umetanje riječi, analizu latentnog slijeda i modele slijed-na-slijed.