Zostavte si svoj vlastný nástroj na kontrolu kópií a zoznámte sa s výkonnými možnosťami modulu Difflib.

S rastúcou popularitou digitálneho obsahu je dôležitejšie ako kedykoľvek predtým chrániť ho pred kopírovaním a zneužitím. Nástroj na odhaľovanie plagiátov môže pomôcť učiteľom hodnotiť prácu študentov, inštitúciám kontrolovať výskumné práce a spisovateľom odhaliť krádež ich duševného vlastníctva.

Vytvorenie nástroja na plagiátorstvo vám môže pomôcť pochopiť porovnávanie sekvencií, operácie so súbormi a používateľské rozhrania. Preskúmate tiež techniky spracovania prirodzeného jazyka (NLP), aby ste zlepšili svoju aplikáciu.

Modul Tkinter a Difflib

Na zostavenie detektora plagiátov použijete Tkinter a modul Difflib. Tkinter je jednoduchá, multiplatformová knižnica ktoré môžete použiť na vytvorenie grafické používateľské rozhrania rýchlo.

Modul Difflib je súčasťou štandardnej knižnice Pythonu, ktorá poskytuje triedy a funkcie na porovnávanie sekvencií, ako sú reťazce, zoznamy a súbory. S ním môžete vytvárať programy ako automatický korektor textu, zjednodušené

instagram viewer
systém kontroly verziíalebo nástroj na zhrnutie textu.

Ako vytvoriť detektor plagiátorstva pomocou Pythonu

Celý zdrojový kód zostavujúci detektor plagiátov pomocou Pythonu nájdete v tomto úložisko GitHub.

Importujte požadované moduly. Definujte metódu, load_file_or_display_contents() to trvá vstup a text_widget ako argumenty. Táto metóda načíta textový súbor a zobrazí jeho obsah v textovom widgete.

Použi dostať () metóda na extrahovanie cesty k súboru. Ak používateľ nič nezadal, použite askopenfilename() metóda na otvorenie dialógového okna súboru na výber požadovaného súboru na kontrolu plagiátorstva. Ak používateľ vyberie cestu k súboru, vymažte predchádzajúci záznam, ak existuje, od začiatku do konca a vložte cestu, ktorú si vybral.

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)

Otvorte súbor v režime čítania a uložte obsah do text premenlivý. Vymažte obsah miniaplikácie text_widget a vložte text, ktorý ste predtým extrahovali.

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

Definujte metódu, porovnať_text() ktorý použijete na porovnanie dvoch textov a výpočet percenta ich podobnosti. Použite Difflib's SequenceMatcher() triedy na porovnanie sekvencií a určenie podobnosti. Nastavte funkciu vlastného porovnávania na žiadne použiť predvolené porovnanie a odovzdať text, ktorý chcete porovnať.

Pomocou metódy pomeru získate podobnosť vo formáte s pohyblivou rádovou čiarkou, ktorý môžete použiť na výpočet percenta podobnosti. Použi get_opcodes() metóda na získanie súboru operácií, ktoré môžete použiť na zvýraznenie podobných častí textu a vrátiť ich spolu s percentom 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 metódu, show_similarity(). Použi dostať () metóda na extrahovanie textu z oboch textových polí a ich odovzdanie do porovnať_text() funkciu. Vymažte obsah textového poľa, v ktorom sa zobrazí výsledok, a vložte percento podobnosti. Odstrániť "rovnako" tag z predchádzajúceho zvýraznenia (ak 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() metóda vráti päť n-tic: reťazec operačného kódu, počiatočný index prvej sekvencie, koncový index prvej sekvencie, počiatočný index druhej sekvencie a koncový index druhej sekvencie.

Reťazec operačného kódu môže mať jednu zo štyroch možných hodnôt: nahradiť, odstrániť, vložiť a rovnať sa. Dostaneš nahradiť keď je časť textu v oboch sekvenciách odlišná a niekto nahradil jednu časť inou. Dostaneš vymazať keď časť textu existuje v prvej sekvencii, ale nie v druhej.

dostaneš vložiť keď časť textu chýba v prvej sekvencii, ale je prítomná v druhej. Rovnaké dostanete, keď sú časti textu rovnaké. Všetky tieto hodnoty uložte do príslušných premenných. Ak je reťazec operačného kódu rovný, pridajte rovnaký tag do textovej sekvencie.

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 koreňové okno Tkinter. Nastavte názov okna a definujte v ňom rám. Usporiadajte rám s vhodnou výplňou v oboch smeroch. Definujte dva štítky, ktoré sa majú zobraziť Text 1 a Text 2. Nastavte nadradený prvok, v ktorom sa má nachádzať, a text, ktorý sa má zobrazovať.

Definujte tri textové polia, dve pre texty, ktoré chcete porovnať a jedno pre zobrazenie výsledku. Deklarujte nadradený prvok, šírku a výšku a nastavte možnosť zalomenia na tk. SLOVO aby sa zabezpečilo, že program zalomí slová na najbližšiu hranicu a nerozbije žiadne slovo medzi tým.

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 tri tlačidlá, dve na načítanie súborov a jedno na porovnanie. Definujte nadradený prvok, text, ktorý sa má zobraziť, a funkciu, ktorú má vykonať po kliknutí. Vytvorte dva vstupné widgety na zadanie cesty k súboru a definujte rodičovský prvok spolu s jeho šírkou.

Usporiadajte všetky tieto prvky do riadkov a stĺpcov pomocou správcu mriežky. Použite balík na usporiadanie tlačidlo porovnať a text_textbox_diff. V prípade potreby pridajte vhodnú výplň.

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ý ako rovnaký zvýraznite žltým pozadím a červenou farbou písma.

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

The mainloop() funkcia hovorí Pythonu, aby spustil slučku udalostí Tkinter a počúval udalosti, kým nezatvoríte okno.

root.mainloop()

Dajte to všetko dohromady a spustite kód na odhalenie plagiátorstva.

Príklad výstupu z detektora plagiátov

Po spustení programu sa zobrazí okno. Pri zasiahnutí Načítať súbor 1 otvoríte dialógové okno súboru s výzvou na výber súboru. Pri výbere súboru program zobrazí obsah v prvom textovom poli. Pri vstupe do cesty a náraze Načítať súbor 2, program zobrazí obsah v druhom textovom poli. Pri zasiahnutí Porovnaj získate podobnosť ako 100% a zvýrazní celý text pre 100% podobnosť.

Ak pridáte ďalší riadok do jedného z textových polí a stlačíte Porovnaj, program zvýrazní podobnú časť a zvyšok vynechá.

Ak existuje malá alebo žiadna podobnosť, program zvýrazní niektoré písmená alebo slová, ale percento podobnosti je dosť nízke.

Použitie NLP na detekciu plagiátov

Zatiaľ čo Difflib je výkonná metóda na porovnávanie textov, je citlivá na menšie zmeny, má obmedzené chápanie kontextu a je často neúčinná pre veľké texty. Mali by ste zvážiť preskúmanie Spracovania prirodzeného jazyka, pretože dokáže vykonávať sémantickú analýzu textu, extrahovať zmysluplné prvky a má kontextové chápanie.

Okrem toho môžete svoj model trénovať pre rôzne jazyky a optimalizovať ho pre efektívnosť. Niektoré z techník, ktoré môžete použiť na detekciu plagiátov, zahŕňajú Jaccardovu podobnosť, kosínusovú podobnosť, vkladanie slov, analýzu latentnej sekvencie a modely medzi sekvenciami.