Инструмент для удаления дубликатов текста
Быстрое удаление повторяющегося содержимого из текста с поддержкой удаления дубликатов по строкам, словам и предложениям
Что такое удаление дубликатов текста?
Text Deduplicate удаляет повторяющиеся строки, слова или элементы из текста, делая списки чище и удобнее для проверки. Он полезен для импортированных CSV-фрагментов, списков ключевых слов, email-коллекций, фрагментов логов, кодов товаров, вариантов промптов и заметок, где дубли появились из-за копирования, объединения или плохого экспорта. Главное — правило сравнения: регистр, пробелы в начале и конце, пустые строки, пунктуация, нормализация и исходный порядок влияют на то, считать ли элементы одинаковыми. Инструмент ускоряет очистку, но не заменяет предметную проверку, если похожие записи должны оставаться отдельно или маленькие различия важны. Для опубликованного или многоязычного контента результат нужно проверить по языку, charset, контексту и edge cases.
Как использовать
Основные операции
- Введите или вставьте текст для удаления дубликатов в левое текстовое поле
- Выберите подходящий режим удаления дубликатов (по строкам, словам, предложениям и т.д.)
- При необходимости настройте параметры (учёт регистра, сохранение порядка и т.д.)
- Результат удаления дубликатов и статистика появятся справа в реальном времени
- Нажмите кнопку копирования, чтобы сохранить результат в буфер обмена
Описание режимов
- По строкам: каждая строка рассматривается как отдельная единица, одинаковые строки удаляются
- По словам: текст разбивается по пробелам, повторяющиеся слова удаляются
- По предложениям: разбивка по точкам, вопросительным и восклицательным знакам, повторяющиеся предложения удаляются
- По абзацам: разбивка по пустым строкам, повторяющиеся абзацы удаляются
- По символам: удаляются символы, встречающиеся в тексте несколько раз
Применение
Технический принцип
Дедупликация — это однопроходное сканирование на основе JavaScript Set. ECMAScript Set использует алгоритм сравнения SameValueZero (то же сравнение, что и Array.prototype.includes, где NaN равен NaN, а +0 равен -0) и по спецификации обеспечивает сублинейный средний поиск — V8 реализует Set как хеш-таблицу с открытой адресацией с амортизированным O(1) для вставки, поэтому весь проход имеет сложность O(n) по количеству элементов. Наивная альтернатива — добавление в результирующий массив и вызов indexOf для каждого элемента — даёт O(n²) и становится ощутимой проблемой уже на 10 000 записей. Разбиение зависит от режима: построчный режим разделяет по /\r?\n/, обрабатывая как CRLF (Windows), так и LF (Unix) переносы строк, пословный — по /\s+/, по предложениям — по /(?<=[.!?])\s+/, по абзацам — по /\n{2,}/. Каждая единица проходит через опциональные нормализаторы перед тем, как стать ключом Set: trim() для удаления начальных и конечных пробелов, toLowerCase() для сравнения без учёта регистра и String.prototype.normalize('NFC'), чтобы визуально идентичные строки, записанные в составной (é, U+00E9) или разложенной (e + U+0301) форме, складывались в одну запись. Порядок сохраняется, поскольку результирующий массив строится в порядке итерации — Set используется только как фильтр «видел ли я это раньше?». Та же структура данных лежит в основе SQL DISTINCT и Python set(); единственная реальная альтернатива для десятков миллионов элементов — вероятностный фильтр Блума, который обменивает небольшую частоту ложных срабатываний (≈1% при 10 битах/элемент) на постоянную память и является избыточным для браузерного текстового инструмента.
- Поиск Set использует алгоритм SameValueZero (ECMA-262 §7.2.10) — NaN совпадает с NaN, +0 совпадает с -0, в остальном строгое сравнение
- V8 реализует Set как хеш-таблицу; insert и has имеют амортизированный O(1), что делает всю дедупликацию O(n) против O(n²) на основе indexOf
- Построчный regex /\r?\n/ обрабатывает CRLF, LF и завершающий CR за одно разделение; без этого остаются невидимые суффиксы '\r', которые нарушают точное совпадение
- Нормализация Unicode через String.prototype.normalize('NFC') сворачивает составные/разложенные формы (например, 'é' U+00E9 и 'e' + U+0301) в один ключ
- Режим без учёта регистра приводит ключ к нижнему регистру — значение в оригинальном регистре сохраняется в выводе, поэтому первое 'ERROR' остаётся как есть, а последующие строки 'error' отбрасываются
- Сохранение порядка бесплатно: результирующий массив строится в порядке ввода, а Set используется только как фильтр, поэтому поведение аналогично SQL DISTINCT со стабильной сортировкой
- Для 10 млн+ элементов, где память становится узким местом, фильтр Блума (≈10 бит/элемент при 1% ложных срабатываний) заменяет Set — в браузере это не нужно, так как Set из 1 млн строк укладывается в 100 МБ
Примеры
Дедупликация строк, сохраняется первое вхождение
Вход:
apple
banana
apple
orange
banana
Выход:
apple
banana
orangeДедупликация строк с обрезкой пробелов
Вход:
hello
hello
hello
world
Выход (после обрезки):
hello
worldДедупликация без учёта регистра
Вход:
ERROR
error
Warning
WARNING
warning
Выход (без учёта регистра):
ERROR
WarningИзвлечение списка уникальных email-адресов
Вход:
alice@example.com
bob@example.com
ALICE@example.com
carol@example.com
bob@example.com
Выход (без учёта регистра, режим строк):
alice@example.com
bob@example.com
carol@example.comДедупликация слов
Вход: hello world hello again world
Выход: hello world againДедупликация предложений
Вход: This is a test. This is a test. Another sentence.
Выход: This is a test. Another sentence.Часто задаваемые вопросы
Что считается дубликатом?
Каждая единица (строка, слово, предложение, абзац или символ) сравнивается с остальными. Идентичные единицы — дубликаты. Чувствительность к регистру включается отдельно. Страница выводит список без дубликатов и сообщает, сколько повторов было удалено.
Сохраняется ли порядок?
Да — первое вхождение каждого уникального элемента остаётся на своей исходной позиции, последующие дубликаты удаляются. В выводе сохраняется исходный порядок.
Считаются ли пустые строки дубликатами?
Пустые строки сравниваются как любые другие. Первая пустая строка остаётся; одинаковые пустые строки далее по тексту удаляются вместе с прочими дубликатами.
Можно ли дедуплицировать по подстроке или столбцу?
Нет. Дедупликация работает по полному содержимому каждой единицы (строки, слова, предложения, абзаца или символа). Режима по столбцам или подстрокам не предусмотрено.
Сортируется ли вывод?
Нет. Вывод всегда сохраняет исходный порядок. Опции сортировки нет.
Какого размера файл инструмент потянет?
Лимит — память браузера. Сотни тысяч строк нормально обрабатываются на десктопных браузерах. Файлы с миллионами строк могут не уместиться в памяти; для них используйте CLI-утилиты вроде `sort -u` или `awk '!seen[$0]++'`.
Загружается ли мой текст?
Нет. Дедупликация использует Set в памяти вашего браузера. Вставленные строки не передаются.