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

По мере роста популярности цифрового контента становится как никогда важно защитить его от копирования и неправомерного использования. Инструмент обнаружения плагиата может помочь учителям оценить работу студентов, учреждениям проверить исследовательские работы, а писателям обнаружить кражу их интеллектуальной собственности.

Создание инструмента плагиата может помочь вам понять сопоставление последовательностей, операции с файлами и пользовательские интерфейсы. Вы также изучите методы обработки естественного языка (NLP) для улучшения вашего приложения.

Модуль Tkinter и Difflib

Чтобы создать детектор плагиата, вы будете использовать Tkinter и модуль Difflib. Tkinter — простая кроссплатформенная библиотека. которые вы можете использовать для создания графические пользовательские интерфейсы быстро.

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

instagram viewer
система контроля версий, или инструмент для суммирования текста.

Как создать детектор плагиата с помощью Python

Вы можете найти весь исходный код для создания детектора плагиата с использованием Python в этом Репозиторий GitHub.

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

Использовать получать() метод извлечения пути к файлу. Если пользователь ничего не ввел, используйте спроситьоткрытьимяфайла() способ открыть диалоговое окно файла для выбора нужного файла для проверки на плагиат. Если пользователь выбирает путь к файлу, очистите предыдущую запись, если она есть, от начала до конца и вставьте выбранный путь.

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)

Определите метод, сравнить_текст() который вы будете использовать для сравнения двух фрагментов текста и расчета процента их сходства. Используйте Difflib Сопоставитель последовательности () класс для сравнения последовательностей и определения сходства. Установите пользовательскую функцию сравнения на Никто, чтобы использовать сравнение по умолчанию, и передать текст, который вы хотите сравнить.

Используйте метод соотношения, чтобы получить сходство в формате с плавающей запятой, который можно использовать для расчета процента сходства. Использовать 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

Определите метод, показать_подобие(). Использовать получать() метод для извлечения текста из обоих текстовых полей и передачи их в сравнить_текст() функция. Очистите содержимое текстового поля, в котором будет отображаться результат, и вставьте процент сходства. Удалить "такой же" тег из предыдущего выделения (если есть).

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

Инициализируйте корневое окно 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)

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

Организуйте все эти элементы в строки и столбцы с помощью диспетчера сетки. Используйте пакет для организации сравнить_кнопка и 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")

основной цикл () Функция сообщает Python запустить цикл событий Tkinter и прослушивать события, пока вы не закроете окно.

root.mainloop()

Соберите все вместе и запустите код для обнаружения плагиата.

Пример вывода детектора плагиата

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

Если вы добавите еще одну строку в одно из текстовых полей и нажмете Сравнивать, программа выделяет похожую часть и пропускает все остальное.

Если сходства практически нет, программа выделяет некоторые буквы или слова, но процент сходства довольно низкий.

Использование НЛП для обнаружения плагиата

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

Более того, вы можете обучить свою модель работе с разными языками и оптимизировать ее для повышения эффективности. Некоторые из методов, которые вы можете использовать для обнаружения плагиата, включают сходство Жаккара, косинусное сходство, встраивание слов, анализ скрытой последовательности и модели последовательностей.