TL;DR
LLM-based text preprocessing — использование больших языковых моделей для удаления стоп-слов, лемматизации (приведение к словарной форме: "бежал" → "бежать") и стемминга (отсечение до корня: "бежал" → "беж"). Вместо жёстких списков и правил LLM получает промпт с описанием задачи и несколькими примерами (few-shot learning), затем обрабатывает текст с учётом контекста.
Традиционные методы работают без учёта контекста: стоп-слово "не" удаляется везде, хотя для анализа тональности оно критически важно. Слово "leaves" лемматизируется одинаково в статье про ботанику ("лист") и HR-документе ("отпуск"), хотя это разные значения. Модель следует фиксированным спискам и правилам, которые не знают ни о задаче, ни о домене, ни о контексте предложения.
LLM решает это через явное указание контекста в промпте: для sentiment analysis можно написать "слово 'не' часто важно, оставь его", для ботанической статьи — "это текст о растениях". Модель анализирует окружение слова, тему документа и цель обработки, затем принимает решение для каждого слова отдельно. Исследование показало: LLM воспроизводят традиционные методы с точностью 97% для стоп-слов, 82% для лемматизации, 74% для стемминга, а ML-классификаторы на LLM-обработанных текстах показывают +6% F1-score против традиционной предобработки.
Схема метода
Одношаговый промпт:
ПРОМПТ: [описание операции] + [few-shot примеры] + [контекст задачи] + [текст для обработки]
↓
LLM: генерирует обработанный текст
Компоненты промпта:
- Описание: "Стоп-слова — это артикли, предлоги, местоимения..."
- Примеры: "например 'is', 'are', 'being', 'the', 'an'..."
- Контекст: "задача — определить тональность твита (позитив/негатив)"
- Исключения: "слово 'not' важно для задачи, оставь его"
- Инструкция: "выведи только обработанный текст без пояснений"
Пример применения
Задача: Подготовить отзывы с Wildberries для классификатора тональности. Нужно убрать шум (стоп-слова), но сохранить важные для оценки слова типа "не понравилось".
Промпт:
Ты специализируешься на удалении стоп-слов из текста.
Стоп-слова — это слова, не важные для обработки текста.
Обычно это артикли, предлоги, местоимения, вспомогательные глаголы.
Например: 'это', 'был', 'были', 'я', 'ты', 'который', 'что', 'по', 'для'.
Контекст: нужно определить тональность отзыва (положительный/отрицательный).
В этой задаче слово 'не' часто важно — оставь его в тексте.
Убери стоп-слова из этого отзыва:
"Заказывала через приложение, пришло быстро. Качество не очень,
но за эту цену норм. Рекомендую тем кто не привередливый."
Выведи только обработанный текст, без пояснений.
Результат: Модель выдаст текст с удалёнными общими стоп-словами ("через", "за", "тем", "кто"), но сохранит критичное "не очень" и "не привередливый". Традиционный метод удалил бы "не" везде, разрушив смысл. Формат вывода — чистый текст без технических блоков, готовый для следующего этапа пайплайна.
Почему это работает
Слабость традиционных методов: они применяют универсальные правила без понимания контекста. Список стоп-слов для новостей включает "президент", "заявил" — но для политической классификации эти слова критичны. Лемматизатор видит слово "saw" и не знает, глагол это ("видел" → "see") или существительное ("пила" → "saw"), потому что не видит окружение. Стеммер обрезает "running" → "run" по правилу, но в документе про спортивную обувь "running shoes" и "runs fast" — это разные концепты, которые не должны схлопываться в один термин.
Сильная сторона LLM: модель обучена на миллиардах примеров использования слов в разных контекстах. Она умеет определять часть речи, значение, роль слова в предложении через анализ окружения. Когда видит "saw a tree" и "used a saw" — понимает разницу. Few-shot примеры в промпте дают модели паттерн поведения для конкретной задачи, а описание контекста ("это sentiment analysis") объясняет критерии важности слов.
Механика обхода слабости: промпт создаёт виртуальные правила через естественный язык. Вместо "если слово из списка → удали" LLM получает: "если слово не важно для определения тональности → удали". Модель применяет понимание контекста к задаче, описанной словами. Для каждого слова она оценивает: важно ли оно здесь, в этом предложении, для этой цели. Результат — динамическая фильтрация вместо статических списков.
Рычаги управления:
- Few-shot примеры (количество и качество) → меньше примеров = быстрее, но может быть менее точно
- Описание контекста ("это медицинские тексты", "это отзывы пользователей") → меняет критерии отбора
- Явные исключения ("оставь 'не'", "сохрани числа") → точная настройка под задачу
- Инструкция вывода ("только текст" vs "текст + объяснение") → контроль формата для парсинга
Шаблон промпта
Удаление стоп-слов
Ты специализируешься на удалении стоп-слов из текста.
Стоп-слова — это слова, не важные для обработки текста.
Обычно это артикли, предлоги, местоимения, вспомогательные глаголы.
Например: {примеры_стоп_слов}.
Контекст: {описание_задачи}.
{исключения_если_нужны}.
Убери стоп-слова из этого {тип_текста}:
"{текст}"
Выведи только обработанный текст, без пояснений.
Подставь:
{примеры_стоп_слов}— 8-12 примеров на языке текста{описание_задачи}— "определить тональность", "извлечь ключевые темы"{исключения_если_нужны}— "Слово 'не' важно — оставь его" (для sentiment){тип_текста}— "отзыва", "новости", "поста"{текст}— твой текст для обработки
Лемматизация
Ты специализируешься на лемматизации текста.
Лемматизация — это приведение слов к их словарной форме (лемме).
Например: глаголы "бежал", "бежит", "побежит" → лемма "бежать".
Существительные "компьютера", "компьютеру" → лемма "компьютер".
Контекст: {описание_контекста_документа}.
Лемматизируй этот {тип_текста}:
"{текст}"
Выведи только лемматизированный текст, без пояснений.
Подставь:
{описание_контекста_документа}— "это технический текст", "это разговорная речь"{тип_текста},{текст}— как выше
Стемминг
Ты специализируешься на стемминге текста.
Стемминг — это приведение слов к базовой форме (корню).
Например: "программист", "программирование", "программа" → корень "программ".
Слова "доказательство", "доказал", "доказывает" → корень "доказ".
Примени стемминг к этому {тип_текста}:
"{текст}"
Выведи только обработанный текст, без пояснений.
🚀 Быстрый старт — вставь в чат:
Вот шаблон для [лемматизации/удаления стоп-слов/стемминга].
Адаптируй под мою задачу: [опиши свою задачу].
Задавай вопросы, чтобы заполнить поля.
[вставить шаблон выше]
LLM спросит про язык текста, домен, цель обработки — потому что эти детали влияют на выбор стоп-слов и способ обработки. Она возьмёт структуру из шаблона и заполнит конкретными примерами для твоей задачи.
Ограничения
⚠️ Стемминг — слабое место: LLM показывают 74% точности против традиционных алгоритмов и непоследовательны — одно слово могут обработать по-разному в разных текстах. Для стемминга традиционные методы (Porter, Snowball) пока надёжнее.
⚠️ Вычислительная стоимость: запрос к LLM в тысячи раз дороже чем вызов библиотечной функции. Оправдано для небольших объёмов или когда контекст критичен.
⚠️ Оптимально для низкоресурсных языков: если для языка нет качественных лемматизаторов — LLM даёт хороший результат из коробки. Для английского/русского традиционные инструменты работают отлично и быстрее.
⚠️ Зависимость от промпта: результат сильно зависит от качества описания задачи и примеров. Плохо сформулированный промпт может дать худший результат чем традиционные методы.
Как исследовали
Команда взяла 5 современных LLM (Gemma-2, Gemma-3, Llama-3.1, Phi-4, Qwen-2.5) и проверила их на 7 английских датасетах (Twitter, новости) плюс 5 языках (французский, немецкий, итальянский, португальский, испанский). Тестировали три операции: удаление стоп-слов, лемматизацию, стемминг.
Двойная проверка эффективности: (1) измерили насколько LLM повторяют традиционные методы — сравнили каждое слово с выводом NLTK/spaCy; (2) обучили три ML-классификатора (Naive Bayes, Decision Tree, Logistic Regression) на традиционно обработанных и LLM-обработанных текстах — измерили F1-score на реальных задачах классификации.
Ключевой дизайн: промпты содержали few-shot примеры (8-12 слов) и описание downstream-задачи ("определить тональность твита"). Например, для sentiment analysis явно указывали "слово 'not' важно — оставь его", чтобы LLM не удалила отрицание. Для неанглийских языков проверили оба варианта — промпт на английском и на целевом языке.
Результаты удивили: LLM превзошли традиционные методы в 25 из 35 комбинаций (датасет + операция) на английском. Особенно сильны в лемматизации — лучший результат во всех 7 датасетах. Улучшение классификации достигло +6% F1 (датасет AG News, удаление стоп-слов + лемматизация).
Неожиданная находка про языки: для неанглийских языков язык промпта почти не важен — английский промпт работал так же хорошо как native. Исключение — Llama-3.1 показала +20% улучшение с промптами на целевом языке (80% задач), хотя она изначально multilingual. Gemma-2 (обучена в основном на английском) показала лучшие результаты среди всех моделей даже на других языках.
Инсайт про контекст: LLM удаляют 13-33% слов, которые НЕ стоп-слова по традиционным спискам. Это не баг — это feature: модель убирает контекстно-избыточные слова. Например, "user" часто удаляется в Twitter-данных (и правильно — это шум для классификации). Традиционные методы слепо следуют списку, LLM понимают домен.
Адаптации и экстраполяции
💡 Адаптация: гибридный подход — LLM + традиционные методы
Для больших объёмов: (1) традиционный метод на 90% текста, (2) LLM только на спорных случаях или сложном контексте.
Ты специализируешься на проверке предобработки текста.
Текст уже обработан автоматически: удалены стоп-слова из стандартного списка.
Твоя задача: найти ОШИБКИ — слова, которые:
- Удалены, но важны для задачи "{задача}"
- Оставлены, но являются шумом в контексте
Обработанный текст: "{текст}"
Оригинал: "{оригинал}"
Выведи:
1. Ложно удалённые (важные слова, которые убрали)
2. Ложно оставленные (шум, который остался)
3. Исправленную версию текста
Выгода: LLM работает как контроль качества — дешёвый базовый метод + точная коррекция сложных случаев. Снижение стоимости в 10-20 раз при сохранении качества LLM-обработки.
🔧 Техника: указание специфичных доменных стоп-слов
Вместо общих примеров — дай специфичные для домена стоп-слова в few-shot.
Было (общие примеры):
Например: 'is', 'are', 'the', 'an', 'and', 'I', 'which'...
Стало (доменные примеры):
Для медицинских текстов стоп-слова:
'пациент', 'исследование', 'данные', 'результат', 'показал', 'выявлено'
(часто встречаются, но не несут специфичного медицинского смысла)
Для tech-новостей стоп-слова:
'компания', 'заявил', 'сообщил', 'представил', 'анонсировал'
(канцелярит, не ключевые термины)
Эффект: модель понимает специфику домена через примеры → точнее определяет что важно именно для этой области. Few-shot learning натаскивает модель на паттерны конкретной предметной зоны.
💡 Экстраполяция: создание кастомного списка стоп-слов для задачи
Используй LLM для генерации списка доменных стоп-слов, затем применяй традиционный метод с этим списком.
Проанализируй корпус из {количество} {тип_текстов}.
Задача: {описание_задачи}.
Сгенерируй список из 50-100 стоп-слов для этой задачи:
- Слова, которые часто встречаются, но не важны для {задача}
- Канцелярит и шаблонные фразы специфичные для {домен}
- Технические термины, которые не несут смысловой нагрузки
Формат вывода: один список, каждое слово с новой строки.
Примеры текстов:
"{пример_1}"
"{пример_2}"
"{пример_3}"
Выгода: получаешь кастомный список за один запрос к LLM, затем используешь быстрый традиционный метод для обработки миллионов текстов. Лучшее из двух миров: контекстное понимание LLM + скорость традиционных методов.
Ресурсы
Investigating Large Language Models' Linguistic Abilities for Text Preprocessing
- GitHub: https://github.com/GianCarloMilanese/llm_pipeline_wi-iat
- Авторы: Gabriella Pasi, Marco Braga, Gian Carlo Milanese
- University of Milano-Bicocca, Politecnico di Torino
