Rakenna oma kopiontarkistustyökalusi ja opi Difflib-moduulin tehokkaista ominaisuuksista.

Digitaalisen sisällön suosion kasvaessa on entistä tärkeämpää suojella sitä kopioimiselta ja väärinkäytöltä. Plagioinnin havaitsemistyökalu voi auttaa opettajia arvioimaan opiskelijoiden työtä, oppilaitoksia tarkistamaan tutkimuspapereita ja kirjoittajia havaitsemaan heidän immateriaaliomaisuutensa varkauksia.

Plagiointityökalun luominen voi auttaa sinua ymmärtämään sekvenssisovitusta, tiedostotoimintoja ja käyttöliittymiä. Tutustut myös luonnollisen kielen käsittelyn (NLP) tekniikoihin sovelluksesi parantamiseksi.

Tkinter- ja Difflib-moduuli

Voit rakentaa plagiointitunnistimen käyttämällä Tkinteriä ja Difflib-moduulia. Tkinter on yksinkertainen, monialustainen kirjasto joita voit käyttää luomiseen graafiset käyttöliittymät nopeasti.

Difflib-moduuli on osa Python-standardikirjastoa, joka tarjoaa luokkia ja toimintoja sekvenssien, kuten merkkijonojen, luetteloiden ja tiedostojen, vertailuun. Sen avulla voit rakentaa ohjelmia, kuten tekstin automaattinen korjaus, yksinkertaistettu

versionhallintajärjestelmätai tekstin yhteenvetotyökalu.

Kuinka rakentaa plagioinnin ilmaisin Pythonilla

Löydät tästä koko lähdekoodin, joka rakentaa plagiointitunnistimen Pythonilla GitHub-arkisto.

Tuo tarvittavat moduulit. Määritä menetelmä, load_file_or_display_contents() joka kestää sisääntulo ja text_widget argumentteina. Tämä menetelmä lataa tekstitiedoston ja näyttää sen sisällön tekstiwidgetissä.

Käytä saada() tapa purkaa tiedostopolku. Jos käyttäjä ei ole syöttänyt mitään, käytä askopentiedostonnimi() tapa avata tiedostovalintaikkuna ja valita haluttu tiedosto plagiointitarkistusta varten. Jos käyttäjä valitsee tiedostopolun, tyhjennä edellinen merkintä, jos sellainen on, alusta loppuun ja lisää valitsemansa polku.

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)

Avaa tiedosto lukutilassa ja tallenna sen sisältö teksti muuttuja. Tyhjennä text_widgetin sisältö ja lisää aiemmin purkamasi teksti.

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

Määritä menetelmä, vertaa_teksti() jonka avulla vertaat kahta tekstiä ja lasket niiden samankaltaisuusprosentin. Käytä Difflibiä SequenceMatcher() luokka vertailla sekvenssejä ja määrittää samankaltaisuus. Aseta mukautettu vertailutoiminto kohtaan Ei mitään käyttää oletusvertailua ja välitä teksti, jota haluat vertailla.

Käytä suhdemenetelmää saadaksesi samankaltaisuuden liukulukumuodossa, jota voit käyttää samankaltaisuusprosentin laskemiseen. Käytä get_opcodes() menetelmä noutaa joukon operaatioita, joilla voit korostaa samankaltaisia ​​tekstin osia ja palauttaa sen samankaltaisuusprosentin kanssa.

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ääritä menetelmä, näytä_samalaisuus(). Käytä saada() tapa poimia teksti molemmista tekstilaatikoista ja siirtää ne kenttään vertaa_teksti() toiminto. Tyhjennä tuloksen näyttävän tekstiruudun sisältö ja lisää samankaltaisuusprosentti. Poista "sama" tagi edellisestä korostuksesta (jos sellainen on).

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() menetelmä palauttaa viisi monikkoa: opcode-merkkijono, ensimmäisen sekvenssin aloitusindeksi, loppuindeksi ensimmäisen sekvenssin aloitusindeksin ja toisen sekvenssin loppuindeksin järjestys.

Opcode-merkkijono voi olla yksi neljästä mahdollisesta arvosta: korvaa, poista, lisää ja yhtä suuri. Sinä saat korvata kun tekstin osa molemmissa sarjoissa on erilainen ja joku on korvannut yhden osan toisella. Sinä saat poistaa kun osa tekstistä on ensimmäisessä sekvenssissä, mutta ei toisessa.

Saat lisää kun osa tekstistä puuttuu ensimmäisessä jaksossa, mutta on toisessa. Saat tasavertaisen, kun tekstin osat ovat samat. Tallenna kaikki nämä arvot sopiviin muuttujiin. Jos opcode-merkkijono on yhtä suuri, lisää sama -tagia tekstisekvenssiin.

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

Alusta Tkinterin juuriikkuna. Aseta ikkunan otsikko ja määritä kehys sen sisään. Järjestä kehys sopivalla pehmusteella molempiin suuntiin. Määritä kaksi näytettävää tarraa Teksti 1 ja Teksti 2. Aseta pääelementti, jossa sen tulee sijaita, ja teksti, jonka sen tulee näyttää.

Määritä kolme tekstiruutua, kaksi verrattaville teksteille ja yksi tulosten näyttämiseksi. Ilmoita yläelementti, leveys ja korkeus ja aseta rivitysasetukseksi tk. SANA varmistaaksesi, että ohjelma rivittää sanat lähimpään rajaan eikä katkaise sanoja niiden väliin.

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ääritä kolme painiketta, kaksi tiedostojen lataamiseen ja yksi vertailua varten. Määritä pääelementti, teksti, jonka sen tulee näyttää, ja toiminto, joka sen tulee suorittaa napsautettaessa. Luo kaksi syöttöwidgetiä syöttämään tiedostopolku ja määrittämään pääelementin ja sen leveyden.

Järjestä kaikki nämä elementit riveihin ja sarakkeisiin ruudukonhallinnan avulla. Käytä pakettia järjestämiseen vertaa_painike ja text_textbox_diff. Lisää sopiva pehmuste tarvittaessa.

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)

Korosta samaksi merkitty teksti keltaisella taustalla ja punaisella kirjasinvärillä.

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

The mainloop() -toiminto käskee Pythonia suorittamaan Tkinterin tapahtumasilmukan ja kuuntelemaan tapahtumia, kunnes suljet ikkunan.

root.mainloop()

Yhdistä kaikki ja suorita koodi plagioinnin havaitsemiseksi.

Esimerkki plagiointitunnistimen ulostulosta

Kun suoritat ohjelman, se näyttää ikkunan. Kun osuu Lataa tiedosto 1 -painiketta, tiedostovalintaikkuna avautuu ja pyytää sinua valitsemaan tiedoston. Kun valitset tiedoston, ohjelma näyttää sisällön ensimmäisen tekstiruudun sisällä. Astuessa polulle ja osuessaan Lataa tiedosto 2, ohjelma näyttää sisällön toisessa tekstiruudussa. Kun osuu Vertailla -painiketta, saat samankaltaisuuden 100-prosenttisesti ja se korostaa koko tekstin 100-prosenttisesti.

Jos lisäät toisen rivin johonkin tekstiruutuun ja painat Vertailla, ohjelma korostaa vastaavan osan ja jättää loput pois.

Jos samankaltaisuutta on vähän tai ei ollenkaan, ohjelma korostaa joitakin kirjaimia tai sanoja, mutta samankaltaisuusprosentti on melko alhainen.

NLP: n käyttö plagioinnin havaitsemiseen

Vaikka Difflib on tehokas menetelmä tekstin vertailuun, se on herkkä pienille muutoksille, sillä on rajallinen kontekstin ymmärtäminen ja se on usein tehoton suurille teksteille. Sinun tulisi harkita luonnollisen kielen käsittelyn tutkimista, koska se voi suorittaa tekstin semanttisen analyysin, poimia merkityksellisiä piirteitä ja ymmärtää asiayhteyden.

Lisäksi voit kouluttaa mallisi eri kielille ja optimoida sen tehokkuuden lisäämiseksi. Muutamia tekniikoita, joita voit käyttää plagioinnin havaitsemiseen, ovat Jaccard-samankaltaisuus, kosinin samankaltaisuus, sanan upotukset, piilevä sekvenssianalyysi ja sekvenssistä sekvenssiin -mallit.