Δημιουργήστε το δικό σας εργαλείο ελέγχου αντιγραφής και μάθετε για τις ισχυρές δυνατότητες της μονάδας Difflib.

Καθώς το ψηφιακό περιεχόμενο έχει αυξηθεί σε δημοτικότητα, έχει γίνει πιο σημαντικό από ποτέ η προστασία του από αντιγραφή και κακή χρήση. Ένα εργαλείο ανίχνευσης λογοκλοπής μπορεί να βοηθήσει τους δασκάλους να αξιολογήσουν την εργασία των μαθητών, τα ιδρύματα να ελέγξουν τις ερευνητικές εργασίες και τους συγγραφείς να εντοπίσουν κλοπή της πνευματικής τους ιδιοκτησίας.

Η δημιουργία ενός εργαλείου λογοκλοπής μπορεί να σας βοηθήσει να κατανοήσετε την αντιστοίχιση ακολουθίας, τις λειτουργίες αρχείων και τις διεπαφές χρήστη. Θα εξερευνήσετε επίσης τεχνικές επεξεργασίας φυσικής γλώσσας (NLP) για να βελτιώσετε την αίτησή σας.

Η ενότητα Tkinter και Difflib

Για να δημιουργήσετε έναν ανιχνευτή λογοκλοπής, θα χρησιμοποιήσετε το Tkinter και τη μονάδα Difflib. Το Tkinter είναι μια απλή, cross-platform, βιβλιοθήκη που μπορείτε να χρησιμοποιήσετε για να δημιουργήσετε γραφικές διεπαφές χρήστη γρήγορα.

instagram viewer

Η λειτουργική μονάδα Difflib είναι μέρος της τυπικής βιβλιοθήκης Python που παρέχει κλάσεις και συναρτήσεις για σύγκριση ακολουθιών όπως συμβολοσειρές, λίστες και αρχεία. Με αυτό, μπορείτε να δημιουργήσετε προγράμματα όπως ένα αυτόματο διορθωτή κειμένου, ένα απλοποιημένο σύστημα ελέγχου έκδοσηςή ένα εργαλείο σύνοψης κειμένου.

Πώς να δημιουργήσετε έναν ανιχνευτή λογοκλοπής χρησιμοποιώντας την Python

Μπορείτε να βρείτε ολόκληρο τον πηγαίο κώδικα που δημιουργεί έναν ανιχνευτή λογοκλοπής χρησιμοποιώντας Python σε αυτό Αποθετήριο GitHub.

Εισαγάγετε τις απαιτούμενες ενότητες. Ορίστε μια μέθοδο, load_file_or_display_contents() που παίρνει είσοδος και text_widget ως επιχειρήματα. Αυτή η μέθοδος θα φορτώσει ένα αρχείο κειμένου και θα εμφανίσει τα περιεχόμενά του σε ένα γραφικό στοιχείο κειμένου.

Χρησιμοποιήστε το παίρνω() μέθοδος εξαγωγής της διαδρομής του αρχείου. Εάν ο χρήστης δεν έχει εισαγάγει τίποτα, χρησιμοποιήστε το askopenfilename() μέθοδος για να ανοίξετε ένα παράθυρο διαλόγου αρχείου για να επιλέξετε το επιθυμητό αρχείο για έλεγχο λογοκλοπής. Εάν ο χρήστης επιλέξει τη διαδρομή του αρχείου, διαγράψτε την προηγούμενη καταχώρηση, εάν υπάρχει, από την αρχή μέχρι το τέλος και εισάγετε τη διαδρομή που επέλεξε.

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)

Ανοίξτε το αρχείο σε λειτουργία ανάγνωσης και αποθηκεύστε τα περιεχόμενα στο κείμενο μεταβλητός. Διαγράψτε τα περιεχόμενα του text_widget και εισαγάγετε το κείμενο που εξαγάξατε νωρίτερα.

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

Ορίστε μια μέθοδο, compare_text() που θα χρησιμοποιήσετε για να συγκρίνετε δύο κομμάτια κειμένου και να υπολογίσετε το ποσοστό ομοιότητάς τους. Χρησιμοποιήστε το Difflib's SequenceMatcher() τάξη για να συγκρίνει τις ακολουθίες και να προσδιορίσει την ομοιότητα. Ρυθμίστε τη συνάρτηση προσαρμοσμένης σύγκρισης σε Κανένας για να χρησιμοποιήσετε την προεπιλεγμένη σύγκριση και να μεταβιβάσετε το κείμενο που θέλετε να συγκρίνετε.

Χρησιμοποιήστε τη μέθοδο αναλογίας για να λάβετε την ομοιότητα σε μορφή κινητής υποδιαστολής που μπορείτε να χρησιμοποιήσετε για να υπολογίσετε το ποσοστό ομοιότητας. Χρησιμοποιήστε το get_opcodes() μέθοδος για την ανάκτηση ενός συνόλου λειτουργιών που μπορείτε να χρησιμοποιήσετε για να επισημάνετε παρόμοια τμήματα κειμένου και να το επιστρέψετε μαζί με το ποσοστό ομοιότητας.

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

Ορίστε μια μέθοδο, show_similarity(). Χρησιμοποιήστε το παίρνω() μέθοδος για να εξαγάγετε το κείμενο και από τα δύο πλαίσια κειμένου και να τα μεταβιβάσετε στο compare_text() λειτουργία. Διαγράψτε τα περιεχόμενα του πλαισίου κειμένου που θα εμφανίσει το αποτέλεσμα και εισαγάγετε το ποσοστό ομοιότητας. Αφαιρέστε το "ίδιο" ετικέτα από την προηγούμενη επισήμανση (εάν υπάρχει).

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)

ο get_opcode() Η μέθοδος επιστρέφει πέντε πλειάδες: τη συμβολοσειρά του κωδικού λειτουργίας, τον δείκτη έναρξης της πρώτης ακολουθίας, τον δείκτη τέλους της πρώτης ακολουθίας, ο δείκτης έναρξης της δεύτερης ακολουθίας και ο δείκτης τέλους της δεύτερης αλληλουχία.

Η συμβολοσειρά opcode μπορεί να είναι μία από τις τέσσερις πιθανές τιμές: αντικατάσταση, διαγραφή, εισαγωγή και ίση. Θα πάρεις αντικαθιστώ όταν ένα τμήμα του κειμένου και στις δύο ακολουθίες είναι διαφορετικό και κάποιος αντικατέστησε ένα τμήμα με ένα άλλο. Θα πάρεις διαγράφω όταν ένα τμήμα του κειμένου υπάρχει στην πρώτη σειρά αλλά όχι στη δεύτερη.

Παίρνετε εισάγετε όταν ένα τμήμα του κειμένου απουσιάζει στην πρώτη σειρά αλλά υπάρχει στη δεύτερη. Παίρνετε ίσοι όταν τα τμήματα του κειμένου είναι τα ίδια. Αποθηκεύστε όλες αυτές τις τιμές σε κατάλληλες μεταβλητές. Εάν η συμβολοσειρά του κωδικού λειτουργίας είναι ίσος, πρόσθεσε το ίδιο ετικέτα στην ακολουθία κειμένου.

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

Αρχικοποιήστε το ριζικό παράθυρο Tkinter. Ορίστε τον τίτλο του παραθύρου και ορίστε ένα πλαίσιο μέσα σε αυτό. Οργανώστε το πλαίσιο με κατάλληλη επένδυση και προς τις δύο κατευθύνσεις. Ορίστε δύο ετικέτες για εμφάνιση Κείμενο 1 και Κείμενο 2. Ορίστε το γονικό στοιχείο στο οποίο θα πρέπει να βρίσκεται και το κείμενο που πρέπει να εμφανίζεται.

Ορίστε τρία πλαίσια κειμένου, δύο για τα κείμενα που θέλετε να συγκρίνετε και ένα για την εμφάνιση του αποτελέσματος. Δηλώστε το γονικό στοιχείο, το πλάτος και το ύψος και ορίστε την επιλογή αναδίπλωσης σε tk. ΛΕΞΗ για να διασφαλιστεί ότι το πρόγραμμα τυλίγει τις λέξεις στο πλησιέστερο όριο και δεν σπάει καμία λέξη στο ενδιάμεσο.

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)

Ορίστε τρία κουμπιά, δύο για τη φόρτωση των αρχείων και ένα για σύγκριση. Καθορίστε το γονικό στοιχείο, το κείμενο που πρέπει να εμφανίζεται και τη συνάρτηση που πρέπει να εκτελεστεί όταν κάνετε κλικ. Δημιουργήστε δύο γραφικά στοιχεία καταχώρισης για να εισαγάγετε τη διαδρομή του αρχείου και να ορίσετε το γονικό στοιχείο μαζί με το πλάτος του.

Οργανώστε όλα αυτά τα στοιχεία σε γραμμές και στήλες χρησιμοποιώντας τη διαχείριση πλέγματος. Χρησιμοποιήστε το πακέτο για να οργανώσετε το compare_button και το text_textbox_diff. Προσθέστε κατάλληλη επένδυση όπου χρειάζεται.

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_textbox1.tag_configure("same", foreground="red", background="lightyellow")
text_textbox2.tag_configure("same", foreground="red", background="lightyellow")

ο mainloop() Η συνάρτηση λέει στην Python να εκτελέσει τον βρόχο συμβάντων Tkinter και να ακούει συμβάντα μέχρι να κλείσει το παράθυρο.

root.mainloop()

Συνδυάστε τα όλα μαζί και εκτελέστε τον κώδικα για να εντοπίσετε λογοκλοπή.

Παράδειγμα εξόδου του ανιχνευτή λογοκλοπής

Όταν εκτελείτε το πρόγραμμα, εμφανίζει ένα παράθυρο. Στο χτύπημα του Φόρτωση αρχείου 1 κουμπί, ανοίγει ένα παράθυρο διαλόγου αρχείου και σας ζητά να επιλέξετε ένα αρχείο. Κατά την επιλογή ενός αρχείου, το πρόγραμμα εμφανίζει τα περιεχόμενα μέσα στο πρώτο πλαίσιο κειμένου. Μπαίνοντας στο μονοπάτι και χτυπώντας Φόρτωση αρχείου 2, το πρόγραμμα εμφανίζει τα περιεχόμενα στο δεύτερο πλαίσιο κειμένου. Στο χτύπημα του Συγκρίνω κουμπί, λαμβάνετε την ομοιότητα ως 100%, και επισημαίνει ολόκληρο το κείμενο για ομοιότητα 100%.

Εάν προσθέσετε μια άλλη γραμμή σε ένα από τα πλαίσια κειμένου και πατήστε Συγκρίνω, το πρόγραμμα επισημαίνει το παρόμοιο τμήμα και αφήνει έξω τα υπόλοιπα.

Εάν υπάρχει μικρή έως καθόλου ομοιότητα, το πρόγραμμα επισημαίνει ορισμένα γράμματα ή λέξεις, αλλά το ποσοστό ομοιότητας είναι αρκετά χαμηλό.

Χρήση NLP για ανίχνευση λογοκλοπής

Ενώ το Difflib είναι μια ισχυρή μέθοδος για σύγκριση κειμένου, είναι ευαίσθητη σε μικρές αλλαγές, έχει περιορισμένη κατανόηση του περιβάλλοντος και συχνά είναι αναποτελεσματική για μεγάλα κείμενα. Θα πρέπει να εξετάσετε το ενδεχόμενο να εξερευνήσετε την Επεξεργασία Φυσικής Γλώσσας, καθώς μπορεί να εκτελέσει σημασιολογική ανάλυση του κειμένου, να εξάγει σημαντικά χαρακτηριστικά και να κατανοεί τα συμφραζόμενα.

Επιπλέον, μπορείτε να εκπαιδεύσετε το μοντέλο σας για διαφορετικές γλώσσες και να το βελτιστοποιήσετε για αποτελεσματικότητα. Μερικές από τις τεχνικές που μπορείτε να χρησιμοποιήσετε για την ανίχνευση λογοκλοπής περιλαμβάνουν την ομοιότητα Jaccard, την ομοιότητα συνημίτονου, τις ενσωματώσεις λέξεων, την ανάλυση λανθάνουσας ακολουθίας και τα μοντέλα αλληλουχίας σε ακολουθία.