Zgradite svoje orodje za preverjanje kopiranja in spoznajte zmogljive zmožnosti modula Difflib.

Ker je digitalna vsebina vse bolj priljubljena, je postalo bolj kot kdaj koli prej pomembno, da jo zaščitimo pred kopiranjem in zlorabo. Orodje za odkrivanje plagiatorstva lahko pomaga učiteljem pri ocenjevanju dela učencev, ustanovam pri preverjanju raziskovalnih člankov in piscem pri odkrivanju kraje njihove intelektualne lastnine.

Izdelava orodja za plagiatorstvo vam lahko pomaga razumeti ujemanje zaporedij, operacije datotek in uporabniške vmesnike. Raziskovali boste tudi tehnike obdelave naravnega jezika (NLP), da izboljšate svojo aplikacijo.

Modul Tkinter in Difflib

Če želite zgraditi detektor plagiatorstva, boste uporabili Tkinter in modul Difflib. Tkinter je preprosta, večplatformska knjižnica ki jih lahko uporabite za ustvarjanje grafični uporabniški vmesniki hitro.

Modul Difflib je del standardne knjižnice Python, ki ponuja razrede in funkcije za primerjavo zaporedij, kot so nizi, seznami in datoteke. Z njim lahko sestavite programe, kot je samodejni korektor besedila, poenostavljen

instagram viewer
sistem za nadzor različic, ali orodje za povzemanje besedila.

Kako zgraditi detektor plagiatorstva z uporabo Pythona

Tukaj lahko najdete celotno izvorno kodo za izgradnjo detektorja plagiatorstva z uporabo Pythona Repozitorij GitHub.

Uvozite zahtevane module. Določite metodo, load_file_or_display_contents() ki traja vstop in text_widget kot argumenti. Ta metoda bo naložila besedilno datoteko in prikazala njeno vsebino v besedilnem pripomočku.

Uporabi dobiti () metoda za ekstrahiranje poti datoteke. Če uporabnik ni vnesel ničesar, uporabite askopenfilename() način za odpiranje pogovornega okna datoteke za izbiro želene datoteke za preverjanje plagiatorstva. Če uporabnik izbere pot do datoteke, počisti prejšnji vnos, če obstaja, od začetka do konca in vstavi pot, ki jo je izbral.

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)

Odprite datoteko v načinu za branje in shranite vsebino v besedilo spremenljivka. Počistite vsebino text_widgeta in vstavite besedilo, ki ste ga izvlekli prej.

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

Določite metodo, primerjaj_besedilo() ki ga boste uporabili za primerjavo dveh delov besedila in izračun njunega odstotka podobnosti. Uporabi Difflib SequenceMatcher() razreda za primerjavo zaporedij in ugotavljanje podobnosti. Funkcijo primerjave po meri nastavite na Noben da uporabite privzeto primerjavo in posredujete besedilo, ki ga želite primerjati.

Uporabite metodo razmerja, da dobite podobnost v obliki zapisa s plavajočo vejico, ki jo lahko uporabite za izračun odstotka podobnosti. Uporabi get_opcodes() metoda za pridobitev nabora operacij, s katerimi lahko označite podobne dele besedila in jih vrnete skupaj z odstotkom podobnosti.

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

Določite metodo, show_similarity(). Uporabi dobiti () metodo za ekstrahiranje besedila iz obeh besedilnih polj in ju posredovanje v primerjaj_besedilo() funkcijo. Počistite vsebino besedilnega polja, ki bo prikazalo rezultat, in vstavite odstotek podobnosti. Odstranite "enako" oznako prejšnjega označevanja (če obstaja).

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 vrne pet tulp: niz operacijske kode, začetni indeks prvega zaporedja in končni indeks prvega zaporedja, začetni indeks drugega zaporedja in končni indeks drugega zaporedje.

Niz operacijske kode je lahko ena od štirih možnih vrednosti: zamenjaj, izbriši, vstavi in ​​enako. Dobil boš zamenjati ko je del besedila v obeh sekvencah drugačen in je nekdo en del zamenjal z drugim. Dobil boš izbrisati ko del besedila obstaja v prvem zaporedju, ne pa tudi v drugem.

Dobiš vstavi ko je del besedila odsoten v prvem nizu, vendar je prisoten v drugem. Izenačeni ste, ko so deli besedila enaki. Vse te vrednosti shranite v ustrezne spremenljivke. Če je niz opcode enaka, dodajte enako oznako besedilnemu zaporedju.

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

Inicializirajte korensko okno Tkinter. Nastavite naslov okna in znotraj njega določite okvir. Organizirajte okvir z ustreznim oblazinjenjem v obe smeri. Določite dve oznaki za prikaz Besedilo 1 in Besedilo 2. Nastavite nadrejeni element, v katerem naj biva, in besedilo, ki naj se prikaže.

Določite tri besedilna polja, dva za besedila, ki jih želite primerjati, in eno za prikaz rezultata. Označite nadrejeni element, širino in višino ter nastavite možnost ovijanja na tk. BESEDA da zagotovite, da program zavije besede na najbližjo mejo in ne prelomi nobene besede vmes.

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)

Določite tri gumbe, dva za nalaganje datotek in enega za primerjavo. Določite nadrejeni element, besedilo, ki naj se prikaže, in funkcijo, ki naj se izvede, ko ga kliknete. Ustvarite dva gradnika za vnos, da vnesete pot do datoteke in določite nadrejeni element skupaj z njegovo širino.

Organizirajte vse te elemente v vrsticah in stolpcih z upraviteljem mrež. Uporabite paket za organiziranje compare_button in text_textbox_diff. Po potrebi dodajte ustrezno oblazinjenje.

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 besedilo, označeno kot enako, z rumenim ozadjem in rdečo barvo pisave.

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

The glavna zanka() funkcija pove Pythonu, naj zažene zanko dogodkov Tkinter in posluša dogodke, dokler ne zaprete okna.

root.mainloop()

Sestavite vse skupaj in zaženite kodo za odkrivanje plagiata.

Primer izhoda detektorja plagiatorstva

Ko zaženete program, prikaže okno. Ob udarcu v Naloži datoteko 1 gumb, se odpre pogovorno okno datoteke in vas prosi, da izberete datoteko. Ko izberete datoteko, program prikaže vsebino znotraj prvega besedilnega polja. Ob vstopu na pot in udarjanju Naloži datoteko 2, program prikaže vsebino v drugem besedilnem polju. Ob udarcu v Primerjaj gumb, dobite podobnost kot 100 % in označi celotno besedilo za 100 % podobnost.

Če v eno od besedilnih polj dodate še eno vrstico in pritisnete Primerjaj, program označi podoben del in izpusti ostalo.

Če je podobnosti malo ali nič, program poudari nekatere črke ali besede, vendar je odstotek podobnosti precej nizek.

Uporaba NLP za odkrivanje plagiatorstva

Čeprav je Difflib zmogljiva metoda za primerjavo besedil, je občutljiv na manjše spremembe, ima omejeno razumevanje konteksta in je pogosto neučinkovit za velika besedila. Razmislite o raziskovanju obdelave naravnega jezika, saj lahko izvaja semantično analizo besedila, izloča pomembne funkcije in ima kontekstualno razumevanje.

Poleg tega lahko svoj model usposobite za različne jezike in ga optimizirate za učinkovitost. Nekaj ​​tehnik, ki jih lahko uporabite za odkrivanje plagiatorstva, vključuje Jaccardovo podobnost, kosinusno podobnost, vdelave besed, analizo latentnega zaporedja in modele od zaporedja do zaporedja.