Creați-vă propriul instrument de verificare a copiei și aflați despre capabilitățile puternice ale modulului Difflib.
Pe măsură ce conținutul digital a crescut în popularitate, a devenit mai important ca niciodată să îl protejați de copiere și utilizare necorespunzătoare. Un instrument de detectare a plagiatului poate ajuta profesorii să evalueze munca elevilor, instituțiile să verifice lucrările de cercetare, iar scriitorii să detecteze furtul proprietății lor intelectuale.
Crearea unui instrument de plagiat vă poate ajuta să înțelegeți potrivirea secvenței, operațiunile cu fișierele și interfețele utilizator. De asemenea, veți explora tehnici de procesare a limbajului natural (NLP) pentru a vă îmbunătăți aplicația.
Modulul Tkinter și Difflib
Pentru a construi un detector de plagiat, veți folosi Tkinter și modulul Difflib. Tkinter este o bibliotecă simplă, multiplatformă pe care le puteți folosi pentru a crea interfețe grafice cu utilizatorul repede.
Modulul Difflib face parte din biblioteca standard Python care oferă clase și funcții pentru compararea secvențelor precum șiruri de caractere, liste și fișiere. Cu el, puteți construi programe precum un corector automat de text, un simplificat
sistem de control al versiunilor, sau un instrument de rezumare a textului.Cum să construiți un detector de plagiat folosind Python
Puteți găsi întregul cod sursă care construiește un detector de plagiat folosind Python în aceasta Depozitul GitHub.
Importați modulele necesare. Definiți o metodă, load_file_or_display_contents() care ia intrare și text_widget ca argumente. Această metodă va încărca un fișier text și va afișa conținutul acestuia într-un widget text.
Folosește obține() metoda de extragere a căii fișierului. Dacă utilizatorul nu a introdus nimic, utilizați askopenfilename() metodă de a deschide o fereastră de dialog pentru fișiere pentru a selecta fișierul dorit pentru verificarea plagiatului. Dacă utilizatorul selectează calea fișierului, ștergeți intrarea anterioară, dacă există, de la început până la sfârșit și introduceți calea pe care a selectat-o.
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)
Deschideți fișierul în modul de citire și stocați conținutul în text variabil. Ștergeți conținutul text_widget și introduceți textul pe care l-ați extras mai devreme.
with open(file_path, 'r') as file:
text = file.read()
text_widget.delete(1.0, tk.END)
text_widget.insert(tk.END, text)
Definiți o metodă, compară_text() pe care îl veți folosi pentru a compara două bucăți de text și pentru a calcula procentul de similitudine a acestora. Folosiți Difflib SequenceMatcher() clasă pentru a compara secvențe și a determina asemănarea. Setați funcția de comparare personalizată la Nici unul pentru a utiliza comparația implicită și transmiteți textul pe care doriți să îl comparați.
Utilizați metoda raportului pentru a obține similitudinea într-un format cu virgulă mobilă pe care îl puteți utiliza pentru a calcula procentul de similitudine. Folosește get_opcodes() metodă de a prelua un set de operații pe care le puteți utiliza pentru a evidenția porțiuni similare de text și pentru a le returna împreună cu procentul de similaritate.
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
Definiți o metodă, arata_asemanare(). Folosește obține() metoda de a extrage textul din ambele casete de text și de a le trece în compară_text() funcţie. Ștergeți conținutul casetei de text care va afișa rezultatul și introduceți procentul de similaritate. Scoateți "la fel" eticheta din evidențierea anterioară (dacă există).
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 returnează cinci tupluri: șirul opcode, indexul de început al primei secvențe, indexul final al primei secvențe, indicele de început al celei de-a doua secvențe și indexul final al celei de-a doua secvenţă.
Șirul opcode poate fi una dintre cele patru valori posibile: înlocuiți, ștergeți, inserați și egalați. Vei primi a inlocui când o porțiune a textului din ambele secvențe este diferită și cineva a înlocuit o porțiune cu alta. Vei primi șterge când o porțiune a textului există în prima secvență dar nu și în a doua.
Primesti introduce când o porțiune din text este absentă în prima secvență dar prezentă în a doua. Obțineți egal atunci când porțiunile de text sunt aceleași. Stocați toate aceste valori în variabile adecvate. Dacă șirul opcode este egal, adaugă la fel etichetați secvența de text.
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")
Inițializați fereastra rădăcină Tkinter. Setați titlul ferestrei și definiți un cadru în interiorul acesteia. Organizați cadrul cu căptușeală adecvată în ambele direcții. Definiți două etichete de afișat Textul 1 și Textul 2. Setați elementul părinte în care ar trebui să locuiască și textul pe care ar trebui să-l afișeze.
Definiți trei casete de text, două pentru textele pe care doriți să le comparați și una pentru afișarea rezultatului. Declarați elementul părinte, lățimea și înălțimea și setați opțiunea de înfășurare la tk. CUVÂNT pentru a se asigura că programul împachetează cuvintele la cea mai apropiată limită și nu întrerupe niciun cuvânt între ele.
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)
Definiți trei butoane, două pentru a încărca fișierele și unul pentru comparație. Definiți elementul părinte, textul pe care ar trebui să-l afișeze și funcția pe care ar trebui să o execute la clic. Creați două widget-uri de intrare pentru a introduce calea fișierului și pentru a defini elementul părinte împreună cu lățimea acestuia.
Organizați toate aceste elemente în rânduri și coloane folosind managerul de grilă. Utilizați pachetul pentru a organiza butonul de_comparare si text_textbox_diff. Adăugați umplutură adecvată acolo unde este necesar.
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)
Evidențiați textul marcat ca fiind același cu un fundal galben și culoarea fontului roșu.
text_textbox1.tag_configure("same", foreground="red", background="lightyellow")
text_textbox2.tag_configure("same", foreground="red", background="lightyellow")
The mainloop() funcția îi spune lui Python să ruleze bucla de evenimente Tkinter și să asculte evenimente până când închideți fereastra.
root.mainloop()
Pune totul împreună și rulează codul pentru a detecta plagiatul.
Exemplu de ieșire a detectorului de plagiat
Când rulați programul, acesta afișează o fereastră. La lovirea Încărcați fișierul 1 butonul, se deschide un dialog de fișier și vă solicită să alegeți un fișier. La alegerea unui fișier, programul afișează conținutul în prima casetă de text. La intrarea pe potecă și lovirea Încărcați fișierul 2, programul afișează conținutul în a doua casetă de text. La lovirea Comparaţie butonul, veți obține similitudinea ca 100% și evidențiază întregul text pentru o similaritate de 100%.
Dacă adăugați o altă linie la una dintre casetele de text și apăsați Comparaţie, programul evidențiază porțiunea similară și o omite pe restul.
Dacă există puțină sau deloc asemănarea, programul evidențiază unele litere sau cuvinte, dar procentul de similaritate este destul de scăzut.
Utilizarea NLP pentru detectarea plagiatului
Deși Difflib este o metodă puternică pentru compararea textului, este sensibil la modificări minore, are o înțelegere limitată a contextului și este adesea ineficient pentru textele mari. Ar trebui să luați în considerare explorarea procesării limbajului natural, deoarece poate efectua o analiză semantică a textului, poate extrage caracteristici semnificative și are înțelegere contextuală.
Mai mult, vă puteți antrena modelul pentru diferite limbi și îl puteți optimiza pentru eficiență. Câteva dintre tehnicile pe care le puteți utiliza pentru detectarea plagiatului includ asemănarea Jaccard, asemănarea cosinusului, încorporarea cuvintelor, analiza secvenței latente și modelele secvență-la-secvență.