Направите сопствени алат за проверу копирања и научите о моћним могућностима Диффлиб модула.

Како је дигитални садржај постао популаран, постало је важније него икада да га заштитимо од копирања и злоупотребе. Алат за откривање плагијата може помоћи наставницима да процене рад ученика, институцијама да провере истраживачке радове, а писцима да открију крађу њихове интелектуалне својине.

Прављење алата за плагијат може вам помоћи да разумете подударање секвенци, операције са датотекама и кориснички интерфејс. Такође ћете истражити технике обраде природног језика (НЛП) како бисте побољшали своју апликацију.

Модул Ткинтер и Диффлиб

Да бисте направили детектор плагијата, користићете Ткинтер и Диффлиб модул. Ткинтер је једноставна библиотека на више платформи које можете користити за креирање графички кориснички интерфејси брзо.

Модул Диффлиб је део Питхон стандардне библиотеке која обезбеђује класе и функције за упоређивање секвенци као што су стрингови, листе и датотеке. Помоћу њега можете да правите програме попут аутоматског исправљача текста, поједностављеног

систем контроле верзија, или алат за сумирање текста.

Како направити детектор плагијата користећи Питхон

Можете пронаћи цео изворни код који гради детектор плагијата користећи Питхон у овоме ГитХуб спремиште.

Увезите потребне модуле. Дефинишите метод, лоад_филе_ор_дисплаи_цонтентс() то узима улазак и тект_видгет као аргументи. Овај метод ће учитати текстуалну датотеку и приказати њен садржај у текстуалном виџету.

Користити добити() метод за издвајање путање датотеке. Ако корисник није ништа унео, употребите аскопенфиленаме() метод за отварање прозора дијалога датотеке да бисте изабрали жељену датотеку за проверу плагијата. Ако корисник изабере путању датотеке, обришите претходни унос, ако постоји, од почетка до краја и убаците путању коју је изабрао.

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)

Отворите датотеку у режиму читања и сачувајте садржај у текст променљива. Обришите садржај тект_видгет-а и уметните текст који сте раније издвојили.

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

Дефинишите метод, упореди_текст() које ћете користити да упоредите два дела текста и израчунате њихов проценат сличности. Користите Диффлиб СекуенцеМатцхер() класе за упоређивање низова и утврђивање сличности. Поставите прилагођену функцију поређења на Ниједан да користите подразумевано поређење и проследите текст који желите да упоредите.

Користите метод односа да бисте добили сличност у формату с помичним зарезом који можете користити за израчунавање процента сличности. Користити гет_опцодес() метод за преузимање скупа операција које можете користити да истакнете сличне делове текста и вратите га заједно са процентом сличности.

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

Дефинишите метод, схов_симиларити(). Користити добити() метод за издвајање текста из оба текстуална оквира и прослеђивање у упореди_текст() функција. Обришите садржај оквира за текст који ће приказати резултат и убаците проценат сличности. Уклони "исти" ознаку из претходног истицања (ако постоји).

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)

Тхе гет_опцоде() метода враћа пет торки: стринг опкода, почетни индекс прве секвенце, завршни индекс прве секвенце, почетни индекс друге секвенце и крајњи индекс друге низ.

Низ опкода може бити једна од четири могуће вредности: замени, избриши, убаци и једнак. Добићете заменити када је део текста у оба низа другачији, а неко је један део заменио другим. Добићете избрисати када део текста постоји у првом низу, али не и у другом.

Добијате уметнути када је део текста одсутан у првој секвенци али је присутан у другој. Постајете једнаки када су делови текста исти. Чувајте све ове вредности у одговарајућим променљивим. Ако је низ опкода једнаки, Додајте исти ознаку на текстуални низ.

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

Иницијализујте Ткинтер роот прозор. Поставите наслов прозора и дефинишите оквир унутар њега. Организујте оквир са одговарајућим подлогама у оба смера. Дефинишите две ознаке за приказ Текст 1 и Текст 2. Подесите родитељски елемент у коме треба да се налази и текст који треба да прикаже.

Дефинишите три оквира за текст, два за текстове које желите да упоредите и један за приказ резултата. Декларисајте родитељски елемент, ширину и висину и подесите опцију премотавања на тк. ВОРД како би се осигурало да програм омота речи на најближој граници и да не преломи ниједну реч између.

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)

Дефинишите три дугмета, два за учитавање датотека и једно за поређење. Дефинишите родитељски елемент, текст који треба да прикаже и функцију коју треба да изврши када се кликне. Направите два виџета за унос да бисте унели путању датотеке и дефинисали родитељски елемент заједно са његовом ширином.

Организујте све ове елементе у редове и колоне помоћу менаџера мреже. Користите пакет да организујете цомпаре_буттон анд тхе тект_тектбок_дифф. Додајте одговарајућу подлогу где је потребно.

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)

Истакните текст означен као исти жутом позадином и црвеном бојом фонта.

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

Тхе маинлооп() функција каже Питхон-у да покрене Ткинтер петљу догађаја и ослушкује догађаје док не затворите прозор.

root.mainloop()

Ставите све заједно и покрените код да откријете плагијат.

Пример излаза детектора плагијата

Када покренете програм, он приказује прозор. На удару у Учитај датотеку 1 дугме, отвара се дијалог датотеке и тражи од вас да изаберете датотеку. Приликом одабира датотеке, програм приказује садржај унутар првог оквира за текст. При уласку на стазу и удару Учитај датотеку 2, програм приказује садржај у другом текстуалном пољу. На удару у Упоредити дугме, добијате сличност као 100%, а оно истиче цео текст за 100% сличности.

Ако додате још једну линију у један од оквира за текст и притиснете Упоредити, програм истиче сличан део и изоставља остатак.

Ако постоји мала или никаква сличност, програм истиче нека слова или речи, али проценат сличности је прилично низак.

Коришћење НЛП-а за откривање плагијата

Иако је Диффлиб моћан метод за поређење текста, он је осетљив на мање промене, има ограничено разумевање контекста и често је неефикасан за велике текстове. Требало би да размислите о истраживању обраде природног језика јер може да изврши семантичку анализу текста, издвоји значајне карактеристике и има контекстуално разумевање.

Штавише, можете да обучите свој модел за различите језике и да га оптимизујете за ефикасност. Неколико техника које можете да користите за откривање плагијата обухватају сличност по Јаццарду, косинусну сличност, уграђивање речи, анализу латентне секвенце и моделе од секвенце до секвенце.