Készítse el saját másolás-ellenőrző eszközét, és ismerje meg a Difflib modul hatékony képességeit.
A digitális tartalom népszerűségének növekedésével minden eddiginél fontosabb a másolás és a visszaélés elleni védelem. A plágiumészlelő eszköz segítségével a tanárok értékelhetik a diákok munkáját, az intézmények ellenőrizhetik a kutatási dokumentumokat, az írók pedig felderíthetik szellemi tulajdonaik ellopását.
A plágiumkezelő eszköz elkészítése segíthet megérteni a sorozategyeztetést, a fájlműveleteket és a felhasználói felületeket. Felfedezi a természetes nyelvi feldolgozási (NLP) technikákat is az alkalmazás javítása érdekében.
A Tkinter és Difflib modul
A plágiumérzékelő felépítéséhez a Tkintert és a Difflib modult kell használni. A Tkinter egy egyszerű, többplatformos könyvtár amelyeket létrehozhat grafikus felhasználói felületek gyorsan.
A Difflib modul a Python szabványkönyvtár része, amely osztályokat és függvényeket biztosít a sorozatok, például karakterláncok, listák és fájlok összehasonlításához. Ezzel olyan programokat készíthet, mint például az automatikus szövegjavító, egy egyszerűsített
verziókezelő rendszer, vagy egy szövegösszefoglaló eszköz.Hogyan készítsünk plágiumdetektort Python használatával
Ebben megtalálhatja a teljes forráskódot, amely a Python segítségével plágiumdetektort épít fel GitHub adattár.
Importálja a szükséges modulokat. Határozzon meg egy módszert, load_file_or_display_contents() az úgy veszi belépés és text_widget mint érvek. Ez a módszer betölt egy szöveges fájlt, és megjeleníti annak tartalmát egy szöveges widgetben.
Használja a kap() módszer a fájl elérési útjának kibontására. Ha a felhasználó nem írt be semmit, használja a askopenfilename() módszer a fájl párbeszédablak megnyitásához a kívánt fájl kiválasztásához a plágiumellenőrzéshez. Ha a felhasználó kiválasztja a fájl elérési útját, törölje az előző bejegyzést, ha volt, az elejétől a végéig, és szúrja be az általa kiválasztott elérési utat.
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)
Nyissa meg a fájlt olvasási módban, és tárolja a tartalmát a szöveg változó. Törölje a text_widget tartalmát, és szúrja be a korábban kibontott szöveget.
with open(file_path, 'r') as file:
text = file.read()
text_widget.delete(1.0, tk.END)
text_widget.insert(tk.END, text)
Határozzon meg egy módszert, összehasonlítás_szöveg() amelyet két szövegrész összehasonlítására és a hasonlósági százalékuk kiszámítására fog használni. Használd a Difflib-et SequenceMatcher() osztály a sorozatok összehasonlításához és a hasonlóság meghatározásához. Állítsa be az egyéni összehasonlítási funkciót Egyik sem az alapértelmezett összehasonlítás használatához, és adja át az összehasonlítani kívánt szöveget.
Az arány módszerrel lebegőpontos formátumban kapja meg a hasonlóságot, amellyel kiszámíthatja a hasonlósági százalékot. Használja a get_opcodes() metódussal olyan műveletkészletet kérhet le, amellyel kiemelheti a szöveg hasonló részeit, és visszaadhatja azt a hasonlóság százalékával együtt.
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
Határozzon meg egy módszert, show_hasonlóság(). Használja a kap() módszerrel kivonhatja a szöveget mindkét szövegmezőből, és átadhatja azokat a összehasonlítás_szöveg() funkció. Törölje az eredményt megjelenítő szövegmező tartalmát, és szúrja be a hasonlósági százalékot. Távolítsa el a "azonos" címkét az előző kiemelésből (ha van).
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)
A get_opcode() A metódus öt sort ad vissza: az opcode karakterláncot, az első sorozat kezdő indexét, a végindexet az első sorozat kezdő indexe, a második sorozat záró indexe sorrend.
Az opcode karakterlánc négy lehetséges érték egyike lehet: csere, törlés, beszúrás és egyenlő. Meg fogod kapni cserélje ki amikor a szöveg egy része mindkét szekvenciában eltérő, és valaki az egyik részt egy másikra cserélte. Meg fogod kapni töröl amikor a szöveg egy része létezik az első sorozatban, de nem a másodikban.
Kapsz betét amikor a szöveg egy része hiányzik az első sorozatból, de jelen van a másodikban. Akkor lesz egyenlő, ha a szöveg részei azonosak. Ezeket az értékeket tárolja a megfelelő változókban. Ha az opcode karakterlánc az egyenlő, Add hozzá a azonos címkét a szövegsorozathoz.
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")
Inicializálja a Tkinter gyökérablakát. Adja meg az ablak címét, és definiáljon benne egy keretet. Rendezze el a keretet megfelelő párnázással mindkét irányban. Határozzon meg két megjelenítendő címkét 1. szöveg és 2. szöveg. Állítsa be a szülőelemet, amelyben lennie kell, és a szöveget, amelyet meg kell jelenítenie.
Határozzon meg három szövegdobozt, kettőt az összehasonlítani kívánt szövegekhez, egyet pedig az eredmény megjelenítéséhez. Deklarálja a szülőelemet, a szélességet és a magasságot, és állítsa be a tördelési beállítást tk. SZÓ annak biztosítása érdekében, hogy a program a szavakat a legközelebbi határra törje be, és ne törjön szót közöttük.
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)
Határozzon meg három gombot, kettőt a fájlok betöltéséhez és egyet az összehasonlításhoz. Határozza meg a szülőelemet, a megjelenítendő szöveget és a kattintáskor végrehajtandó függvényt. Hozzon létre két beviteli widgetet a fájl elérési útjának beviteléhez, és határozza meg a szülőelemet a szélességével együtt.
Rendezze ezeket az elemeket sorokba és oszlopokba a rácskezelő segítségével. Használja a csomagot a rendszerezéshez Összehasonlítás_gomb és a text_textbox_diff. Adjon hozzá megfelelő párnázást, ahol szükséges.
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)
Emelje ki az azonosként megjelölt szöveget sárga háttérrel és piros betűszínnel.
text_textbox1.tag_configure("same", foreground="red", background="lightyellow")
text_textbox2.tag_configure("same", foreground="red", background="lightyellow")
A mainloop() függvény azt mondja a Pythonnak, hogy futtassa a Tkinter eseményhurkot, és figyelje az eseményeket, amíg be nem zárja az ablakot.
root.mainloop()
Állítsa össze az egészet, és futtassa a kódot a plágium észleléséhez.
Példa a plágiumdetektor kimenetére
A program futtatásakor megjelenik egy ablak. Az ütéskor a Fájl betöltése 1 gombot, megnyílik egy fájl párbeszédpanel, és a fájl kiválasztását kéri. A fájl kiválasztásakor a program az első szövegmezőben jeleníti meg a tartalmat. Az ösvényre való belépéskor és ütéskor Fájl betöltése 2, a program a második szövegmezőben jeleníti meg a tartalmat. Az ütéskor a Hasonlítsa össze gombot, 100%-os hasonlóságot kap, és a teljes szöveget kiemeli a 100%-os hasonlóság érdekében.
Ha hozzáad egy másik sort az egyik szövegdobozhoz, és megnyomja Hasonlítsa össze, a program kiemeli a hasonló részt, a többit pedig kihagyja.
Ha kicsi vagy nincs hasonlóság, a program kiemel néhány betűt vagy szót, de a hasonlóság százaléka meglehetősen alacsony.
NLP használata plágiumészlelésre
Míg a Difflib hatékony módszer a szöveg-összehasonlításra, érzékeny a kisebb változtatásokra, korlátozott a kontextus megértése, és gyakran nem hatékony nagy szövegek esetén. Érdemes megfontolni a Natural Language Processing feltárását, mivel képes szemantikai elemzést végezni a szövegből, értelmes jellemzőket von ki, és kontextuális megértéssel rendelkezik.
Ezenkívül a modellt különböző nyelvekre betaníthatja, és a hatékonyság érdekében optimalizálhatja. A plágium észlelésére használható technikák közé tartozik a Jaccard-hasonlóság, a koszinusz-hasonlóság, a szóbeágyazás, a látens szekvenciaelemzés és a sorozat-szekvencia modellek.