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

instagram viewer
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 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)

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.