Costruisci il tuo strumento di verifica della copia e scopri le potenti funzionalità del modulo Difflib.
Con la crescente popolarità dei contenuti digitali, è diventato più importante che mai proteggerli dalla copia e dall'uso improprio. Uno strumento di rilevamento del plagio può aiutare gli insegnanti a valutare il lavoro degli studenti, le istituzioni a controllare i documenti di ricerca e gli scrittori a rilevare il furto della loro proprietà intellettuale.
La creazione di uno strumento antiplagio può aiutarti a comprendere la corrispondenza delle sequenze, le operazioni sui file e le interfacce utente. Esplorerai anche tecniche di elaborazione del linguaggio naturale (NLP) per migliorare la tua applicazione.
Il modulo Tkinter e Difflib
Per costruire un rilevatore di plagio, utilizzerai Tkinter e il modulo Difflib. Tkinter è una semplice libreria multipiattaforma che puoi usare per creare interfacce utente grafiche velocemente.
Il modulo Difflib fa parte della libreria standard di Python che fornisce classi e funzioni per confrontare sequenze come stringhe, liste e file. Con esso, puoi creare programmi come un correttore automatico di testo, un file semplificato
sistema di controllo della versioneo uno strumento di riepilogo del testo.Come costruire un rilevatore di plagio usando Python
Puoi trovare l'intero codice sorgente che costruisce un rilevatore di plagio usando Python in questo Deposito GitHub.
Importa i moduli richiesti. Definire un metodo, load_file_or_display_contents() che prende iscrizione E testo_widget come argomenti. Questo metodo caricherà un file di testo e ne visualizzerà il contenuto in un widget di testo.
Usa il Ottenere() metodo per estrarre il percorso del file. Se l'utente non ha inserito nulla, utilizzare il chiediaprinomefile() metodo per aprire una finestra di dialogo file per selezionare il file desiderato per il controllo del plagio. Se l'utente seleziona il percorso del file, cancellare l'eventuale voce precedente dall'inizio alla fine e inserire il percorso selezionato.
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)
Apri il file in modalità lettura e memorizza il contenuto nel file testo variabile. Cancella il contenuto del text_widget e inserisci il testo che hai estratto in precedenza.
with open(file_path, 'r') as file:
text = file.read()
text_widget.delete(1.0, tk.END)
text_widget.insert(tk.END, text)
Definire un metodo, confronta_testo() che utilizzerai per confrontare due parti di testo e calcolare la loro percentuale di somiglianza. Usa Difflib SequenceMatcher() class per confrontare le sequenze e determinare la somiglianza. Imposta la funzione di confronto personalizzato su Nessuno per utilizzare il confronto predefinito e passare il testo che si desidera confrontare.
Utilizzare il metodo del rapporto per ottenere la somiglianza in un formato a virgola mobile che è possibile utilizzare per calcolare la percentuale di somiglianza. Usa il get_opcodes() metodo per recuperare un insieme di operazioni che è possibile utilizzare per evidenziare porzioni di testo simili e restituirlo insieme alla percentuale di somiglianza.
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
Definire un metodo, mostra_somiglianza(). Usa il Ottenere() metodo per estrarre il testo da entrambe le caselle di testo e passarlo nel file confronta_testo() funzione. Cancella il contenuto della casella di testo che visualizzerà il risultato e inserisci la percentuale di somiglianza. Rimuovi il "Stesso" tag dall'evidenziazione precedente (se presente).
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)
IL get_opcode() Il metodo restituisce cinque tuple: la stringa del codice operativo, l'indice iniziale della prima sequenza, l'indice finale della prima sequenza, l'indice iniziale della seconda sequenza e l'indice finale della seconda sequenza.
La stringa del codice operativo può essere uno dei quattro valori possibili: sostituzione, eliminazione, inserimento e uguale. Otterrete sostituire quando una parte del testo in entrambe le sequenze è diversa e qualcuno ha sostituito una parte con un'altra. Otterrete eliminare quando una parte del testo esiste nella prima sequenza ma non nella seconda.
Ottieni inserire quando una porzione di testo è assente nella prima sequenza ma presente nella seconda. Diventi uguale quando le parti del testo sono le stesse. Memorizza tutti questi valori in variabili appropriate. Se la stringa del codice operativo è pari, Aggiungi il Stesso tag alla sequenza di testo.
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")
Inizializza la finestra root di Tkinter. Imposta il titolo della finestra e definisci una cornice al suo interno. Organizzare il telaio con imbottiture appropriate in entrambe le direzioni. Definire due etichette da visualizzare Testo 1 E Testo 2. Imposta l'elemento genitore in cui dovrebbe risiedere e il testo che dovrebbe visualizzare.
Definisci tre caselle di testo, due per i testi che vuoi confrontare e una per visualizzare il risultato. Dichiara l'elemento padre, la larghezza e l'altezza e imposta l'opzione wrap su tk. PAROLA per garantire che il programma vada a capo delle parole al confine più vicino e non spezzi alcuna parola in mezzo.
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)
Definisci tre pulsanti, due per caricare i file e uno per il confronto. Definisci l'elemento genitore, il testo che deve visualizzare e la funzione che deve eseguire quando viene cliccato. Crea due widget di ingresso per inserire il percorso del file e definire l'elemento genitore insieme alla sua larghezza.
Organizza tutti questi elementi in righe e colonne utilizzando il gestore della griglia. Usa il pacchetto per organizzare il confronta_pulsante e il text_textbox_diff. Aggiungi un'adeguata imbottitura dove necessario.
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)
Evidenzia il testo contrassegnato come uguale con uno sfondo giallo e il colore del carattere rosso.
text_textbox1.tag_configure("same", foreground="red", background="lightyellow")
text_textbox2.tag_configure("same", foreground="red", background="lightyellow")
IL ciclo principale() La funzione dice a Python di eseguire il ciclo di eventi Tkinter e di ascoltare gli eventi finché non chiudi la finestra.
root.mainloop()
Metti tutto insieme ed esegui il codice per rilevare il plagio.
Esempio di output del rilevatore di plagio
Quando si esegue il programma, viene visualizzata una finestra. Colpendo il Carica file 1 pulsante, si apre una finestra di dialogo che chiede di scegliere un file. Scegliendo un file, il programma ne visualizza il contenuto all'interno della prima casella di testo. Entrando nel sentiero e colpendo Carica file 2, il programma visualizza il contenuto nella seconda casella di testo. Colpendo il Confrontare pulsante, ottieni la somiglianza al 100% ed evidenzia l'intero testo per la somiglianza al 100%.
Se aggiungi un'altra riga a una delle caselle di testo e premi Confrontare, il programma evidenzia la parte simile e tralascia il resto.
Se c'è poca o nessuna somiglianza, il programma evidenzia alcune lettere o parole, ma la percentuale di somiglianza è piuttosto bassa.
Utilizzo della PNL per il rilevamento del plagio
Sebbene Difflib sia un metodo potente per il confronto del testo, è sensibile a modifiche minori, ha una comprensione limitata del contesto ed è spesso inefficace per testi di grandi dimensioni. Dovresti considerare di esplorare l'elaborazione del linguaggio naturale in quanto può eseguire l'analisi semantica del testo, estrarre caratteristiche significative e ha una comprensione contestuale.
Inoltre, puoi addestrare il tuo modello per lingue diverse e ottimizzarlo per l'efficienza. Alcune delle tecniche che è possibile utilizzare per il rilevamento del plagio includono la somiglianza di Jaccard, la somiglianza del coseno, l'incorporamento di parole, l'analisi della sequenza latente e i modelli sequenza-sequenza.