Проверка уникальности текста на Python: выявление плагиата и дубликатов

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

Алгоритм проверки уникальности

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

  1. Предварительная обработка текста: Очистка текста от ненужных символов, преобразование в нижний регистр, удаление стоп-слов (наиболее распространенных слов, не несущих смысловой нагрузки) и токенизация – разделение текста на отдельные слова или токены.
  2. Создание отпечатка текста: Преобразование обработанного текста в уникальный отпечаток, который может быть представлен в виде хеш-кода или векторного представления.
  3. Сравнение отпечатков: Сравнение отпечатка проверяемого текста с отпечатками в базе данных или с другими текстами для выявления совпадений.
  4. Расчет уникальности: Определение процента уникальности текста на основе количества совпадений и общего объема текста.

Реализация на Python

Для реализации проверки уникальности текста на Python мы будем использовать некоторые полезные библиотеки:

  • re – для работы с регулярными выражениями и очистки текста;
  • hashlib – для создания хеш-кода текста;
  • numpy – для работы с массивами и матричных операций (необязательно, но может быть полезно для векторного представления текста).

Начнем с импорта необходимых модулей:

import re
import hashlib
import numpy as np

1. Предварительная обработка текста

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

def clean_text(text):
    # Удаление знаков препинания и цифр
    text = re.sub(r'[^а-я ]', '', text.lower())

    # Разделение текста на слова
    words = text.split()

    # Список стоп-слов (можно заменить на собственный)
    stopwords = ['и', 'на', 'из', 'он', 'она', 'они', 'это', 'в', 'с', 'по', 'а', 'но', 'если']

    # Фильтрация стоп-слов
    filtered_words = [word for word in words if word not in stopwords]

    return ' '.join(filtered_words)

2. Создание отпечатка текста

Для создания уникального отпечатка текста мы будем использовать хеш-функцию SHA-256 из библиотеки hashlib. SHA-256 обеспечивает высокую вероятность того, что два разных текста не дадут один и тот же хеш.

def text_fingerprint(text):
    # Очистка текста
    cleaned_text = clean_text(text)

    # Создание хеш-кода SHA-256
    hash_object = hashlib.sha256(cleaned_text.encode())
    hex_dig = hash_object.hexdigest()

    return hex_dig

3. Сравнение отпечатков и расчет уникальности

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

def uniqueness_check(text1, text2):
    fingerprint1 = text_fingerprint(text1)
    fingerprint2 = text_fingerprint(text2)

    if fingerprint1 == fingerprint2:
        return 0  # Полное совпадение, текст не уникален

    # Вычисление процента уникальности
    unique_words1 = set(clean_text(text1).split())
    unique_words2 = set(clean_text(text2).split())
    common_words = unique_words1.intersection(unique_words2)
    uniqueness_percentage = (len(unique_words1) + len(unique_words2) - 2 * len(common_words)) / (len(unique_words1) + len(unique_words2)) * 100

    return uniqueness_percentage

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

Пример использования

Давайте проверим уникальность двух текстов:

text1 = "Python - мощный и универсальный язык программирования. Он позволяет разрабатывать различные приложения, включая веб-сайты, игры и научные проекты. Язык Python прост в изучении и имеет обширные библиотеки."

text2 = "Язык программирования Python используется для создания веб-сайтов, игр и научных приложений. Он универсален и прост в освоении благодаря обширным библиотекам."

uniqueness = uniqueness_check(text1, text2)
print(f"Процент уникальности текста: {uniqueness:.2f}%")

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

Расширение базы данных

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

Заключение

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

import re
import hashlib

# Функция для очистки текста
def clean_text(text):
    # Удаление знаков препинания и цифр
    text = re.sub(r'[^а-я ]', '', text.lower())
    return text

# Функция для создания отпечатка текста (хеш-кода SHA-256)
def text_fingerprint(text):
    cleaned_text = clean_text(text)
    hash_object = hashlib.sha256(cleaned_text.encode())
    return hash_object.hexdigest()

# Функция для проверки уникальности двух текстов
def uniqueness_check(text1, text2):
    fingerprint1 = text_fingerprint(text1)
    fingerprint2 = text_fingerprint(text2)
    
    if fingerprint1 == fingerprint2:
        return 0, "Тексты идентичны"
    
    # Вычисление процента уникальности
    unique_words1 = set(clean_text(text1).split())
    unique_words2 = set(clean_text(text2).split())
    common_words = unique_words1.intersection(unique_words2)
    uniqueness_percentage = (len(unique_words1) + len(unique_words2) - 2 * len(common_words)) / (len(unique_words1) + len(unique_words2)) * 100
    
    return uniqueness_percentage, "Тексты уникальны"

# Пример использования
text1 = "Python - мощный и универсальный язык программирования. Он позволяет разрабатывать различные приложения, включая веб-сайты, игры и научные проекты. Язык Python прост в изучении и имеет обширные библиотеки."
text2 = "Язык программирования Python используется для создания веб-сайтов, игр и научных приложений. Он универсален и прост в освоении благодаря обширным библиотекам."

uniqueness, message = uniqueness_check(text1, text2)
print(f"Процент уникальности текста: {uniqueness:.2f}%. {message}")