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

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

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

Ладно, хватит вступления. Давай приступим к работе!

Набор данных

Я подготовил очень простой набор данных для этого урока. Он содержит образцы содержания плагиата и неплагиата — это определяется меткой 0 для ложного и 1 для истинного.

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

source_text,plagiarized_text,label
"Researchers have discovered a new species of butterfly in the Amazon rainforest.","Scientists have found a previously unknown butterfly species in the Amazon jungle.",1
"The moon orbits the Earth in approximately 27.3 days.","Our natural satellite takes around 27.3 days to complete one orbit around our planet.",1
"Water is composed of two hydrogen atoms and one oxygen atom.","H2O consists of 2 hydrogen atoms and 1 oxygen atom.",1
"The history of Rome dates back to 753 BC.","Rome has a long history that can be traced back to 753 BC.",1
"Pluto was once considered the ninth planet in our solar system.","In the past, Pluto was classified as the ninth planet in our sun's planetary system.",1
"This is a unique and original sentence.","This sentence is unique and original.",0
"Artificial intelligence is reshaping industries.","AI is changing the landscape of various sectors.",0
"Python is a popular programming language for data science.","Data science often relies on Python as a widely used programming language.",0
"The Earth revolves around the Sun in a nearly circular orbit.","Our planet follows an almost circular path as it moves around the central star.",0
"Paris is the capital of France.","France's capital city is Paris.",0

Составляем сценарий

Итак, давайте настроим нашу кодовую базу. Давайте начнем с импорта библиотеки sklearn и других необходимых компонентов, которые мы будем использовать.

  1. Импортировать библиотеки
import nltk
nltk.download("popular")
from sklearn.metrics.pairwise import cosine_similarity
import pandas as pd
import string
from nltk.corpus import stopwords
import joblib
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
from sklearn.feature_extraction.text import TfidfVectorizer

Предоставленный код и библиотеки облегчают разработку и оценку модели обнаружения плагиата. Он начинается с загрузки необходимых ресурсов Natural Language Toolkit (NLTK), обеспечивающих доступ к ценным наборам лингвистических данных и моделям. Далее код импортирует несколько важных библиотек.

Из scikit-learn код импортирует функцию cosine_similarity, которая вычисляет сходство между векторами и полезна для сравнения документов. Кроме того, импортируется Pandas (import pandas as pd) для эффективного манипулирования и анализа данных.

В коде используется модуль string для обработки строковых операций, особенно предварительной обработки текста, и импортируется корпус stopwords из NLTK. Этот корпус содержит общие слова, которые часто удаляются во время предварительной обработки текста.

Для сохранения и загрузки объектов Python, включая модели машинного обучения, импортируется joblib. Для задач классификации, таких как обнаружение плагиата, код импортирует класс LogisticRegression из scikit-learn.

Для разделения набора данных во время оценки модели импортируется train_test_split. Наконец, код вводит метрики оценки, такие как accuracy_score и classification_report, для оценки производительности модели.

Наконец, импортируется класс TfidfVectorizer из scikit-learn, предлагающий извлечение текстовых признаков на основе TF-IDF — важный метод в задачах классификации текста и поиска информации.

2. Загрузить CSV

Далее давайте загрузим CSV-файл, используя

data = pd.read_csv("article50.csv")

3. Набор данных очистки

Также нам нужно очистить текст:

def preprocess_text(text):
    # Remove punctuation
    text = text.translate(str.maketrans("", "", string.punctuation))
    # Convert to lowercase
    text = text.lower()
    # Remove stop words
    stop_words = set(stopwords.words("english"))
    text = " ".join(word for word in text.split() if word not in stop_words)
    return text
data["source_text"] = data["source_text"].apply(preprocess_text)
data["plagiarized_text"] = data["plagiarized_text"].apply(preprocess_text)

Код определяет функцию предварительной обработки текста, которая:
 – удаляет знаки препинания.
 – преобразует текст в нижний регистр.
 – удаляет распространенные английские стоп-слова (например, «the», «and»).
Затем эта предварительная обработка применяется к двум текстовым столбцам в наборе данных. Цель состоит в том, чтобы очистить и стандартизировать текст для дальнейшего анализа или моделирования, например, для обнаружения плагиата.

4. Векторизация

Далее мы используем технику векторизации TF-IDF для преобразования текстовых данных из двух столбцов в числовой формат. Он объединяет текст из столбцов «source_text» и «plagiarized_text», вычисляет значения TF-IDF для каждого слова и сохраняет эти значения в матрице признаков под названием «X». Это преобразование необходимо для подготовки текстовых данных для моделей машинного обучения.

TF-IDF означает «Частота термина, обратная частота документа», и это числовая статистика, используемая при обработке естественного языка и поиске информации для оценки важности слова в документе относительно набора документов (корпуса). TF-IDF — это широко используемый метод предварительной обработки текстовых данных и извлечения признаков.

tfidf_vectorizer = TfidfVectorizer()
X = tfidf_vectorizer.fit_transform(data["source_text"] + " " + data["plagiarized_text"])
y = data["label"]

5.Логистическая регрессия и обучение
Создает модель логистической регрессии и model.fit(X, y) обучает модель, используя функции X и целевую переменную y. Здесь мы тренируемся больше всего.

Разделение данных. Он делит набор данных на два подмножества: обучающий набор (используется для обучения модели) и проверочный набор (используется для оценки модели). Разделение составляет 80% на обучение и 20% на тестирование.

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

Расчет точности: код вычисляет точность прогнозов модели, сравнивая их с истинными метками в тестовом наборе. Точность определяет, насколько часто прогнозы модели совпадают с фактическими результатами.

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

model = LogisticRegression()
model.fit(X, y)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
classification_rep = classification_report(y_test, y_pred)

print("Accuracy:", accuracy)
print("Classification Report:")
print(classification_rep)

Результат:

6. Сохранение модели

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

joblib.dump(model, 'plagiarism_model.pkl')

Использование модели для проверки на плагиат

# Load the saved model
loaded_model = joblib.load('plagiarism_model.pkl')

# New text for plagiarism detection
new_text = "A new group of researchers found out a new class of butterfly in the Amazon forest of rain."

# Preprocess the new text (e.g., apply the same preprocessing steps as during training)
new_text = preprocess_text(new_text)

# Convert the preprocessed text into TF-IDF vectors (assuming you have the vectorizer)
new_text_vector = tfidf_vectorizer.transform([new_text])

# Make predictions using the loaded model
prediction = loaded_model.predict(new_text_vector)

# Calculate cosine similarity between new text and training data
cosine_similarity_score = cosine_similarity(new_text_vector, X_train).max()

# Interpret the prediction and similarity score
if prediction[0] == 0:
    print("The text is not plagiarized.")
else:
    print(f"The text is plagiarized with a similarity score of {cosine_similarity_score*100:.2f}%.")

Давайте также возьмем текст из набора данных и воспользуемся таким инструментом, как Quillbot, чтобы перефразировать его. Затем мы проверяем, обнаружит ли модель его по-прежнему.

Как видите, он обнаруживает его с высоким показателем 94,57%.

Давайте использовать нейтральный оригинальный текст «Нет в модели» или аналогичный ему: «Я люблю мороженое».

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

Исходный код: https://colab.research.google.com/drive/15Rp8aGGYVdFhQhKrVpdpZsye6zrUX3H4?usp=sharing