Looge oma koopiate kontrollimise tööriist ja tutvuge Difflibi mooduli võimsate võimalustega.

Kuna digitaalsisu populaarsus on kasvanud, on selle kaitsmine kopeerimise ja väärkasutuse eest muutunud olulisemaks kui kunagi varem. Plagiaadi tuvastamise tööriist võib aidata õpetajatel hinnata õpilaste tööd, asutustel kontrollida uurimistöid ja kirjanikel tuvastada nende intellektuaalomandi vargusi.

Plagiaaditööriista koostamine aitab teil mõista järjestuste sobitamist, failitoiminguid ja kasutajaliideseid. Samuti uurite oma rakenduse täiustamiseks loomuliku keele töötlemise (NLP) tehnikaid.

Tkinteri ja Difflibi moodul

Plagiaadidetektori loomiseks kasutate Tkinterit ja moodulit Difflib. Tkinter on lihtne, platvormideülene raamatukogu mida saate loomiseks kasutada graafilised kasutajaliidesed kiiresti.

Difflib moodul on Pythoni standardteegi osa, mis pakub klasse ja funktsioone jadade (nt stringid, loendid ja failid) võrdlemiseks. Selle abil saate luua programme, nagu teksti automaatkorrektor, lihtsustatud versioonikontrolli süsteemvõi teksti kokkuvõtte tööriista.

Kuidas Pythoni abil plagiaadidetektorit luua

Siit leiate kogu lähtekoodi, mis loob Pythoni abil plagiaadidetektori GitHubi hoidla.

Importige vajalikud moodulid. Määratlege meetod, load_file_or_display_contents() see võtab sisenemine ja text_widget argumentidena. See meetod laadib tekstifaili ja kuvab selle sisu tekstividinas.

Kasuta saada () meetod failitee eraldamiseks. Kui kasutaja pole midagi sisestanud, kasutage nuppu askopenfilename() meetod failidialoogiakna avamiseks, et valida plagiaadi kontrollimiseks soovitud fail. Kui kasutaja valib failitee, tühjendage eelmine kirje, kui see on olemas, algusest lõpuni ja sisestage valitud tee.

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)

Avage fail lugemisrežiimis ja salvestage selle sisu tekst muutuv. Tühjendage teksti_vidina sisu ja sisestage varem ekstraktitud tekst.

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

Määratlege meetod, võrdle_teksti() mida kasutate kahe tekstiosa võrdlemiseks ja nende sarnasuse protsendi arvutamiseks. Kasutage Difflibi SequenceMatcher() klassis järjestuste võrdlemiseks ja sarnasuse määramiseks. Määrake kohandatud võrdlusfunktsiooniks Mitte ühtegi vaikevõrdluse kasutamiseks ja edastage tekst, mida soovite võrrelda.

Kasutage suhtemeetodit, et saada sarnasus ujukomavormingus, mida saate kasutada sarnasuse protsendi arvutamiseks. Kasuta get_opcodes() meetod toimingute komplekti toomiseks, mida saate kasutada teksti sarnaste osade esiletõstmiseks ja selle tagastamiseks koos sarnasuse protsendiga.

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

Määratlege meetod, näita_sarnasust(). Kasuta saada () meetod teksti eraldamiseks mõlemast tekstikastist ja edastamiseks võrdle_teksti() funktsiooni. Tühjendage tulemust kuvava tekstikasti sisu ja sisestage sarnasuse protsent. Eemalda "sama" silt eelmisest esiletõstmisest (kui see on olemas).

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 hanki_opkood() meetod tagastab viis korda: opkoodi string, esimese jada algusindeks, lõpuindeks esimese jada algusindeks ja teise jada lõpuindeks järjestus.

Opkoodi string võib olla üks neljast võimalikust väärtusest: asenda, kustuta, lisa ja võrdub. Sa saad asendada kui osa tekstist mõlemas jadas on erinev ja keegi asendas ühe osa teisega. Sa saad kustutada kui osa tekstist on esimeses jadas, kuid mitte teises.

Sa saad sisestada kui osa tekstist puudub esimeses jadas, kuid esineb teises. Saate võrdseks, kui teksti osad on samad. Salvestage kõik need väärtused sobivatesse muutujatesse. Kui opkoodi string on võrdne, lisage sama märgend tekstijadale.

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

Initsialiseerige Tkinteri juuraken. Määrake akna pealkiri ja määrake selle sees raam. Korraldage raam sobiva polsterdusega mõlemas suunas. Määrake kaks kuvatavat silti Tekst 1 ja Tekst 2. Määrake ülemelement, milles see peaks asuma, ja tekst, mida see kuvama peaks.

Määrake kolm tekstikasti, kaks tekstide jaoks, mida soovite võrrelda, ja üks, et kuvada tulemus. Deklareerige põhielement, laius ja kõrgus ning määrake murranguvalikuks tk. SÕNA tagamaks, et programm murrab sõnad lähima piirini ega katkesta ühtegi sõna vahepeal.

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)

Määrake kolm nuppu, kaks failide laadimiseks ja üks võrdluseks. Määrake ülemelement, tekst, mida see peaks kuvama, ja funktsioon, mida see klõpsamisel käivitab. Looge failitee sisestamiseks kaks sisestusvidinat ja määrake põhielement koos selle laiusega.

Korraldage kõik need elemendid ridadesse ja veergudesse, kasutades ruudustikuhaldurit. Kasutage pakki korraldamiseks võrdlusnupp ja text_textbox_diff. Vajadusel lisage sobiv polster.

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)

Tõstke samaks märgitud tekst esile kollase tausta ja punase kirjavärviga.

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

The mainloop() funktsioon käsib Pythonil käivitada Tkinteri sündmusetsükli ja kuulata sündmusi, kuni sulgete akna.

root.mainloop()

Pange see kõik kokku ja käivitage kood plagiaadi tuvastamiseks.

Plagiaadidetektori väljundi näide

Kui käivitate programmi, kuvatakse aken. Löömisel Laadi fail 1 nuppu, avaneb failidialoog ja palub teil fail valida. Faili valimisel kuvab programm selle sisu esimeses tekstikastis. Rajale sisenemisel ja löömisel Laadi fail 2, kuvab programm sisu teises tekstikastis. Löömisel Võrdlema nuppu, saate sarnasuse 100% ja see tõstab 100% sarnasuse saavutamiseks esile kogu teksti.

Kui lisate ühte tekstikasti veel ühe rea ja vajutate Võrdlema, tõstab programm sarnase osa esile ja jätab ülejäänud välja.

Kui sarnasusi on vähe või üldse mitte, tõstab programm esile mõned tähed või sõnad, kuid sarnasuse protsent on üsna madal.

NLP kasutamine plagiaadi tuvastamiseks

Kuigi Difflib on võimas meetod tekstide võrdlemiseks, on see tundlik väiksemate muudatuste suhtes, sellel on piiratud kontekstist arusaamine ja see on sageli ebaefektiivne suurte tekstide puhul. Peaksite kaaluma loomuliku keeletöötluse uurimist, kuna see võib teostada teksti semantilist analüüsi, eraldada tähenduslikke funktsioone ja mõistab konteksti.

Lisaks saate oma mudelit eri keelte jaoks välja õpetada ja tõhususe huvides optimeerida. Mõned tehnikad, mida saate plagiaadi tuvastamiseks kasutada, hõlmavad Jaccardi sarnasust, koosinuse sarnasust, sõnade manustamist, varjatud järjestuste analüüsi ja järjestuse jada mudelid.