Създайте свой собствен инструмент за проверка на копиране и научете за мощните възможности на модула Difflib.

С нарастването на популярността на дигиталното съдържание стана по-важно от всякога то да се защитава от копиране и злоупотреба. Инструментът за откриване на плагиатство може да помогне на учителите да оценят работата на учениците, на институциите да проверят научни статии и на писателите да открият кражба на тяхната интелектуална собственост.

Създаването на инструмент за плагиатство може да ви помогне да разберете съпоставянето на последователности, файловите операции и потребителските интерфейси. Ще изследвате и техниките за обработка на естествен език (NLP), за да подобрите приложението си.

Модулът Tkinter и Difflib

За да създадете детектор за плагиатство, ще използвате Tkinter и модула Difflib. Tkinter е проста, крос-платформена библиотека които можете да използвате за създаване графични потребителски интерфейси бързо.

Модулът Difflib е част от стандартната библиотека на Python, която предоставя класове и функции за сравняване на последователности като низове, списъци и файлове. С него можете да създавате програми като автоматичен коректор на текст, опростен

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

Как да създадете детектор за плагиатство с помощта на Python

Можете да намерите целия изходен код за изграждане на детектор за плагиатство с помощта на Python тук GitHub хранилище.

Импортирайте необходимите модули. Определете метод, load_file_or_display_contents() това отнема влизане и text_widget като аргументи. Този метод ще зареди текстов файл и ще покаже съдържанието му в текстов уиджет.

Използвай получи() метод за извличане на пътя на файла. Ако потребителят не е въвел нищо, използвайте askopenfilename() метод за отваряне на диалогов прозорец за файл, за да изберете желания файл за проверка за плагиатство. Ако потребителят избере пътя на файла, изчистете предишния запис, ако има такъв, от началото до края и вмъкнете пътя, който е избрал.

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)

Отворете файла в режим на четене и запазете съдържанието в текст променлива. Изчистете съдържанието на text_widget и вмъкнете текста, който сте извлекли по-рано.

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

Определете метод, compare_text() който ще използвате, за да сравните две части от текста и да изчислите техния процент на сходство. Използвайте Difflib's SequenceMatcher() клас за сравняване на последователности и определяне на сходството. Задайте функцията за персонализирано сравнение на Нито един за да използвате сравнението по подразбиране и да предадете текста, който искате да сравните.

Използвайте метода на съотношението, за да получите сходството във формат с плаваща запетая, който можете да използвате за изчисляване на процента на сходство. Използвай get_opcodes() метод за извличане на набор от операции, които можете да използвате, за да маркирате подобни части от текст и да го върнете заедно с процента на сходство.

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

Определете метод, show_similarity(). Използвай получи() метод за извличане на текста от двете текстови полета и предаването им в compare_text() функция. Изчистете съдържанието на текстовото поле, което ще покаже резултата, и вмъкнете процента на сходство. Премахни "един и същ" таг от предишното маркиране (ако има такъв).

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() методът връща пет кортежа: низът на операционния код, началният индекс на първата последователност, крайният индекс на първата последователност, началния индекс на втората последователност и крайния индекс на втората последователност.

Низът на операционния код може да бъде една от четири възможни стойности: замяна, изтриване, вмъкване и равно. Ще получите замени когато част от текста в двете поредици е различна и някой е заменил една част с друга. Ще получите Изтрий когато част от текста съществува в първата последователност, но не и във втората.

Вие получавате вмъкнете когато част от текста отсъства в първата последователност, но присъства във втората. Получавате равни, когато частите от текста са еднакви. Съхранявайте всички тези стойности в подходящи променливи. Ако низът на операционния код е равен, добавете един и същ етикет към текстовата последователност.

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

Инициализирайте главния прозорец на Tkinter. Задайте заглавието на прозореца и дефинирайте рамка вътре в него. Организирайте рамката с подходящи подложки в двете посоки. Дефинирайте два етикета за показване Текст 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)

Определете три бутона, два за зареждане на файловете и един за сравнение. Дефинирайте родителския елемент, текста, който трябва да показва, и функцията, която трябва да изпълнява при щракване. Създайте две приспособления за въвеждане, за да въведете пътя на файла и да дефинирате родителския елемент заедно с неговата ширина.

Организирайте всички тези елементи в редове и колони с помощта на мениджъра на мрежата. Използвайте пакета, за да организирате compare_button и на text_textbox_diff. Добавете подходяща подложка, където е необходимо.

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

The mainloop() функцията казва на Python да стартира цикъла на събитията на Tkinter и да слуша за събития, докато затворите прозореца.

root.mainloop()

Съберете всичко заедно и стартирайте кода, за да откриете плагиатство.

Примерен резултат от детектора за плагиатство

Когато стартирате програмата, тя показва прозорец. При удряне на Заредете файл 1 се отваря диалогов прозорец за файл и ви подканва да изберете файл. При избор на файл програмата показва съдържанието в първото текстово поле. При навлизане в пътеката и удряне Заредете файл 2, програмата показва съдържанието във второто текстово поле. При удряне на Сравнете бутон, получавате сходството като 100% и той подчертава целия текст за 100% сходство.

Ако добавите още един ред към едно от текстовите полета и натиснете Сравнете, програмата подчертава подобната част и пропуска останалите.

Ако има малко или никакво сходство, програмата подчертава някои букви или думи, но процентът на сходство е доста нисък.

Използване на НЛП за откриване на плагиатство

Въпреки че Difflib е мощен метод за сравнение на текст, той е чувствителен към незначителни промени, има ограничено разбиране на контекста и често е неефективен за големи текстове. Трябва да обмислите проучване на обработката на естествен език, тъй като тя може да извършва семантичен анализ на текста, да извлича значими функции и има контекстуално разбиране.

Освен това можете да обучите вашия модел за различни езици и да го оптимизирате за ефективност. Няколко от техниките, които можете да използвате за откриване на плагиатство, включват сходство по Jaccard, косинусово сходство, вграждане на думи, латентен анализ на последователност и модели от последователност към последователност.