Sukurkite savo kopijavimo tikrinimo įrankį ir sužinokite apie galingas Difflib modulio galimybes.

Didėjant skaitmeninio turinio populiarumui, tapo svarbiau nei bet kada anksčiau apsaugoti jį nuo kopijavimo ir netinkamo naudojimo. Plagiato aptikimo įrankis gali padėti mokytojams įvertinti studentų darbą, institucijoms tikrinti mokslinius darbus, o rašytojams aptikti jų intelektinės nuosavybės vagystes.

Plagiato įrankio kūrimas gali padėti suprasti sekos atitiktį, failų operacijas ir vartotojo sąsajas. Taip pat išnagrinėsite natūralios kalbos apdorojimo (NLP) metodus, kad pagerintumėte savo programą.

„Tkinter“ ir „Difflib“ modulis

Norėdami sukurti plagiato detektorių, naudosite Tkinter ir Difflib modulį. „Tkinter“ yra paprasta kelių platformų biblioteka kuriuos galite naudoti kurdami grafinės vartotojo sąsajos greitai.

Difflib modulis yra standartinės Python bibliotekos dalis, kurioje pateikiamos klasės ir funkcijos, leidžiančios palyginti sekas, pvz., eilutes, sąrašus ir failus. Su juo galite kurti tokias programas kaip automatinis teksto taisytojas, supaprastintas

instagram viewer
versijų valdymo sistema, arba teksto apibendrinimo įrankis.

Kaip sukurti plagiato detektorių naudojant Python

Čia galite rasti visą šaltinio kodą, kuris sukuria plagiato detektorių naudodami Python GitHub saugykla.

Importuokite reikiamus modulius. Apibrėžkite metodą, load_file_or_display_contents() kad trunka įrašas ir text_widget kaip argumentai. Šis metodas įkels tekstinį failą ir parodys jo turinį teksto valdiklyje.

Naudoti gauti () būdas išskleisti failo kelią. Jei vartotojas nieko neįvedė, naudokite askopenfilename() būdas atidaryti failo dialogo langą ir pasirinkti norimą failą plagiato tikrinimui. Jei vartotojas pasirenka failo kelią, išvalykite ankstesnį įrašą, jei toks buvo, nuo pradžios iki pabaigos ir įterpkite pasirinktą kelią.

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)

Atidarykite failą skaitymo režimu ir išsaugokite turinį tekstą kintamasis. Išvalykite teksto_valdiklio turinį ir įterpkite anksčiau ištrauktą tekstą.

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

Apibrėžkite metodą, palyginti_tekstą () kurį naudosite norėdami palyginti du teksto gabalus ir apskaičiuoti jų panašumo procentą. Naudokite Difflib's SequenceMatcher() klasėje, kad būtų galima palyginti sekas ir nustatyti panašumą. Nustatykite tinkintą palyginimo funkciją į Nė vienas jei norite naudoti numatytąjį palyginimą, ir perduoti tekstą, kurį norite palyginti.

Naudokite santykio metodą, kad gautumėte panašumą slankiojo kablelio formatu, kurį galite naudoti skaičiuodami panašumo procentą. Naudoti get_opcodes () metodas, leidžiantis gauti operacijų rinkinį, kurį galite naudoti norėdami paryškinti panašias teksto dalis ir grąžinti jį kartu su panašumo procentais.

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

Apibrėžkite metodą, rodyti_panašumą(). Naudoti gauti () būdas ištraukti tekstą iš abiejų teksto laukų ir perduoti juos į palyginti_tekstą () funkcija. Išvalykite teksto laukelio, kuriame bus rodomas rezultatas, turinį ir įterpkite panašumo procentą. Pasalinti "tas pats" žymą iš ankstesnio paryškinimo (jei buvo).

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() metodas grąžina penkias eilutes: opcode eilutę, pirmosios sekos pradžios indeksą, pabaigos indeksą pirmosios sekos pradžios indeksas ir antrosios sekos pabaigos indeksas seka.

Opcode eilutė gali būti viena iš keturių galimų reikšmių: pakeisti, ištrinti, įterpti ir lygi. Tu gausi pakeisti kai teksto dalis abiejose sekose skiriasi ir kas nors vieną dalį pakeitė kita. Tu gausi Ištrinti kai teksto dalis egzistuoja pirmoje sekoje, bet ne antroje.

Jūs gaunate Įdėti kai teksto dalies nėra pirmoje sekoje, bet yra antroje. Jūs gaunate lygų, kai teksto dalys yra vienodos. Išsaugokite visas šias reikšmes atitinkamuose kintamuosiuose. Jei opcode eilutė yra lygus, pridėkite tas pats žymą prie teksto sekos.

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

Inicijuoti Tkinter šakninį langą. Nustatykite lango pavadinimą ir jo viduje nustatykite rėmelį. Sutvarkykite rėmą su atitinkamu kamšalu abiem kryptimis. Apibrėžkite dvi rodytinas etiketes 1 tekstas ir 2 tekstas. Nustatykite pagrindinį elementą, kuriame jis turėtų būti, ir tekstą, kurį jis turi rodyti.

Apibrėžkite tris teksto laukelius, du skirtus tekstams, kuriuos norite palyginti, ir vieną, kad būtų rodomas rezultatas. Paskelbkite pirminį elementą, plotį ir aukštį ir nustatykite apvyniojimo parinktį tk. ŽODIS užtikrinti, kad programa apvyniotų žodžius ties artimiausia riba ir nepertrauktų žodžių tarp jų.

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)

Apibrėžkite tris mygtukus: du failams įkelti ir vieną palyginimui. Apibrėžkite pirminį elementą, tekstą, kurį jis turi rodyti, ir funkciją, kurią jis turi vykdyti spustelėjus. Sukurkite du įvesties valdiklius, kad įvestumėte failo kelią ir apibrėžtumėte pirminį elementą kartu su jo pločiu.

Sutvarkykite visus šiuos elementus eilutėse ir stulpeliais naudodami tinklelio tvarkyklę. Naudokite paketą, kad sutvarkytumėte Palyginimo_mygtukas ir text_textbox_diff. Jei reikia, pridėkite atitinkamą kamšalą.

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)

Pažymėkite tekstą, pažymėtą kaip vienodą, geltonu fonu ir raudona šrifto spalva.

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

The mainloop () funkcija liepia Python paleisti Tkinter įvykių kilpą ir klausytis įvykių, kol uždarysite langą.

root.mainloop()

Sudėkite viską ir paleiskite kodą, kad aptiktumėte plagiatą.

Plagiato detektoriaus išvesties pavyzdys

Kai paleisite programą, bus rodomas langas. Pataikius į Įkelti failą 1 mygtuką, atidaromas failo dialogo langas ir prašoma pasirinkti failą. Pasirinkus failą, programa rodo turinį pirmame teksto laukelyje. Įeinant į kelią ir pataikant Įkelti failą 2, programa rodo turinį antrame teksto laukelyje. Pataikius į Palyginti mygtuku, jūs gaunate 100% panašumą ir paryškina visą tekstą, kad būtų 100% panašumo.

Jei į vieną iš teksto laukelių pridėsite kitą eilutę ir paspausite Palyginti, programa paryškina panašią dalį, o likusią nepalieka.

Jei panašumo mažai arba visai nėra, programa paryškina kai kurias raides ar žodžius, tačiau panašumo procentas yra gana mažas.

NLP naudojimas plagiato aptikimui

Nors Difflib yra galingas teksto palyginimo metodas, jis jautrus nedideliems pakeitimams, turi ribotą konteksto supratimą ir dažnai neveiksmingas dideliems tekstams. Turėtumėte apsvarstyti galimybę ištirti natūralios kalbos apdorojimą, nes jis gali atlikti semantinę teksto analizę, išskirti reikšmingus bruožus ir suprasti kontekstą.

Be to, galite išmokyti savo modelį skirtingomis kalbomis ir optimizuoti jį efektyvumui. Keletas būdų, kuriuos galite naudoti plagiatui aptikti, apima Jaccard panašumą, kosinuso panašumą, žodžių įterpimą, latentinės sekos analizę ir sekos iki sekos modelius.