Sestavte si svůj vlastní nástroj pro kontrolu kopií a zjistěte o výkonných schopnostech modulu Difflib.

S rostoucí popularitou digitálního obsahu je stále důležitější chránit jej před kopírováním a zneužitím. Nástroj pro odhalování plagiátů může učitelům pomoci hodnotit práci studentů, institucím kontrolovat výzkumné práce a spisovatelům odhalovat krádeže jejich duševního vlastnictví.

Vytvoření nástroje pro plagiáty vám může pomoci porozumět porovnávání sekvencí, operacím se soubory a uživatelským rozhraním. Prozkoumáte také techniky zpracování přirozeného jazyka (NLP), abyste vylepšili svou aplikaci.

Modul Tkinter a Difflib

K vytvoření detektoru plagiátorství použijete Tkinter a modul Difflib. Tkinter je jednoduchá knihovna pro různé platformy které můžete použít k vytvoření grafická uživatelská rozhraní rychle.

Modul Difflib je součástí standardní knihovny Pythonu, která poskytuje třídy a funkce pro porovnávání sekvencí, jako jsou řetězce, seznamy a soubory. S ním můžete vytvářet programy, jako je automatický korektor textu, zjednodušeně

instagram viewer
systém správy verzínebo nástroj pro sumarizaci textu.

Jak vytvořit detektor plagiátorství pomocí Pythonu

Celý zdrojový kód sestavující detektor plagiátů pomocí Pythonu najdete v tomto úložiště GitHub.

Importujte požadované moduly. Definujte metodu, load_file_or_display_contents() to trvá vstup a text_widget jako argumenty. Tato metoda načte textový soubor a zobrazí jeho obsah v textovém widgetu.

Použijte dostat() metoda pro extrakci cesty k souboru. Pokud uživatel nic nezadal, použijte askopenfilename() metoda pro otevření dialogového okna souboru pro výběr požadovaného souboru pro kontrolu plagiátorství. Pokud uživatel vybere cestu k souboru, vymažte předchozí položku, pokud existuje, od začátku do konce a vložte cestu, kterou zvolil.

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)

Otevřete soubor v režimu čtení a uložte obsah do text variabilní. Vymažte obsah text_widgetu a vložte text, který jste extrahovali dříve.

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

Definujte metodu, porovnat_text() které použijete k porovnání dvou částí textu a výpočtu procenta jejich podobnosti. Použijte Difflib's SequenceMatcher() třídy k porovnání sekvencí a určení podobnosti. Nastavte funkci vlastního porovnání na Žádný použít výchozí srovnání a předat text, který chcete porovnat.

Pomocí metody poměru získáte podobnost ve formátu s plovoucí desetinnou čárkou, který můžete použít k výpočtu procenta podobnosti. Použijte get_opcodes() metoda k načtení sady operací, které můžete použít ke zvýraznění podobných částí textu a vrátit je spolu s procentem 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

Definujte metodu, show_similarity(). Použijte dostat() metodou extrahovat text z obou textových polí a předat je do porovnat_text() funkce. Vymažte obsah textového pole, ve kterém se zobrazí výsledek, a vložte procento podobnosti. Odstranit "stejný" tag z předchozího zvýraznění (pokud existuje).

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 vrací pět n-tic: řetězec operačních kódů, počáteční index první sekvence, koncový index první sekvence, počáteční index druhé sekvence a koncový index druhé sekvence.

Řetězec operačního kódu může mít jednu ze čtyř možných hodnot: nahradit, odstranit, vložit a rovnat se. Dostanes nahradit když je část textu v obou sekvencích odlišná a někdo nahradil jednu část jinou. Dostanes vymazat když část textu existuje v první sekvenci, ale ne ve druhé.

Dostaneš vložit když část textu chybí v první sekvenci, ale je přítomná ve druhé. Získáte stejnou hodnotu, když jsou části textu stejné. Uložte všechny tyto hodnoty do příslušných proměnných. Pokud je řetězec operačního kódu rovnat se, přidat stejný tag do textové sekvence.

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

Inicializujte kořenové okno Tkinter. Nastavte titulek okna a definujte v něm rám. Uspořádejte rám vhodným polstrováním v obou směrech. Definujte dva štítky, které se mají zobrazit Text 1 a Text 2. Nastavte nadřazený prvek, ve kterém by měl být, a text, který by měl zobrazovat.

Definujte tři textová pole, dvě pro texty, které chcete porovnat, a jedno pro zobrazení výsledku. Deklarujte nadřazený prvek, šířku a výšku a nastavte volbu obtékání na tk. SLOVO aby bylo zajištěno, že program zalomí slova na nejbližší hranici a nerozbije žádné slovo mezi nimi.

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)

Definujte tři tlačítka, dvě pro načtení souborů a jedno pro porovnání. Definujte nadřazený prvek, text, který se má zobrazit, a funkci, kterou má provést po kliknutí. Vytvořte dva vstupní widgety pro zadání cesty k souboru a definujte rodičovský prvek spolu s jeho šířkou.

Uspořádejte všechny tyto prvky do řádků a sloupců pomocí správce mřížky. Použijte balíček k uspořádání tlačítko porovnat a text_textbox_diff. V případě potřeby přidejte vhodné vycpávky.

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)

Text označený jako stejný zvýrazněte žlutým pozadím a červenou barvou písma.

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

The mainloop() Funkce říká Pythonu, aby spustil smyčku událostí Tkinter a naslouchal událostem, dokud nezavřete okno.

root.mainloop()

Dejte to všechno dohromady a spusťte kód k odhalení plagiátorství.

Příklad výstupu detektoru plagiátorství

Po spuštění programu se zobrazí okno. Při zasažení Načíst soubor 1 otevře se dialogové okno souboru a požádá vás o výběr souboru. Při výběru souboru program zobrazí obsah uvnitř prvního textového pole. Při vstupu na cestu a nárazu Načíst soubor 2, program zobrazí obsah ve druhém textovém poli. Při zasažení Porovnejte tlačítko, získáte podobnost jako 100% a zvýrazní celý text pro 100% podobnost.

Pokud do jednoho z textových polí přidáte další řádek a stisknete Porovnejte, program zvýrazní podobnou část a zbytek vynechá.

Pokud existuje malá nebo žádná podobnost, program zvýrazní některá písmena nebo slova, ale procento podobnosti je velmi nízké.

Použití NLP pro detekci plagiátů

Zatímco Difflib je výkonná metoda pro porovnávání textů, je citlivá na drobné změny, má omezené porozumění kontextu a je často neúčinná pro velké texty. Měli byste zvážit prozkoumání zpracování přirozeného jazyka, protože dokáže provádět sémantickou analýzu textu, extrahovat smysluplné prvky a má kontextové porozumění.

Navíc můžete svůj model trénovat pro různé jazyky a optimalizovat jej pro efektivitu. Některé z technik, které můžete použít pro detekci plagiátů, zahrnují podobnost Jaccarda, kosinusovou podobnost, vkládání slov, analýzu latentní sekvence a modely mezi sekvencemi.