Реализация обнаружения плагиата в тексте
Детекция плагиата — поиск заимствований из известного корпуса текстов. Техническая сложность определяется масштабом корпуса и типами плагиата: дословное копирование обнаруживается тривиально, перефразированное требует семантического сравнения.
Типы плагиата и методы обнаружения
| Тип | Описание | Метод |
|---|---|---|
| Дословное копирование | Точное совпадение фрагментов | Fingerprinting (Rabin-Karp) |
| Косметическая модификация | Замена синонимов, перестановка слов | N-gram + Jaccard similarity |
| Перефразирование | Сохранение смысла, другие слова | Semantic similarity (BERT) |
| Межъязычный | Перевод с другого языка | Cross-lingual embeddings |
Технический стек
Fingerprinting — самый быстрый для точного совпадения:
def get_shingles(text: str, k: int = 5) -> set:
words = text.lower().split()
return {tuple(words[i:i+k]) for i in range(len(words)-k+1)}
def jaccard_similarity(s1: set, s2: set) -> float:
return len(s1 & s2) / len(s1 | s2)
Семантическое сравнение (для перефразирования):
- Сегментация на предложения
- Sentence-BERT эмбеддинги для каждого предложения
- Cosine similarity матрица между всеми парами предложений
- Выявление пар с similarity > 0.85
Масштабирование: для корпуса > 1M документов — ANN-поиск через FAISS или Qdrant. Точный попарный поиск не масштабируется; ANN находит ближайших кандидатов за O(log N).
Интеграция с внешними сервисами
Для академических работ: API Antiplagiat.ru (российский стандарт для ВУЗов), iThenticate (международный). Кастомная система нужна при требованиях к приватности данных или собственном корпусе.
Отчётность
Результат проверки: процент заимствований + визуализация совпадений (подсветка в тексте с ссылкой на источник). Threshold для флагирования: 15–20% для академических работ, 30–40% для бизнес-контента.







