сеньорчикОткрыть в Telegram
← вся теориятеория к собесу · NLP

NLP: препроцессинг текста

Зачем это спрашивают

Предобработка текста - место, где по инерции делают «как в учебнике» и ломают модель. Вопрос-детектор: «нужна ли лемматизация перед BERT?» Правильный ответ - нет, и объяснение почему.

// Универсальный принцип: пайплайн под модель, а не по традиции.

Пайплайн под модель

Для мешка слов и tf-idf нормализация полезна: лемматизация склеивает словоформы, чистка убирает шум. Для BERT - сырой текст: у модели свой токенизатор, и она предобучена на живом тексте; лемматизация ломает распределение, на котором она училась.

Стоп-слова - не автоматизм: списки агрессивны, и «не» в тональности критично. Решение проверяется метрикой, а не привычкой.

// Нормализация тоже задачезависима: lowercase полезен классификации и убивает NER (named entity recognition) - регистр там признак сущности («Орёл» город против «орёл» птица).

лемматизация / стемминг
словарная форма (чище) / обрезка суффиксов (быстрее)

Русская специфика

Богатая морфология: «кот/кота/коту/котом» для мешка слов - четыре разных признака. Лемматизация (pymorphy/natasha-стек) склеивает их и даёт классическим методам заметный прирост.

Токенизация нетривиальна: дефисы, сокращения, инициалы. Разбиение на предложения - не сплит по точке: «т.д.», «А.С. Пушкин» рвутся неправильно.

// Ещё унификация: ё/е, числа, URL - мелочи, которые дают расхождения признаков на ровном месте.

pymorphy / natasha
рабочий стек морфологии и NER для русского

Предобработка - часть модели

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

Это тот же training-serving skew, что и в табличном ML, только прячется он в «мелочах»: другая версия лемматизатора, другой список стоп-слов, забытая унификация ё.

// Сериализуй пайплайн предобработки как артефакт вместе с моделью - не переписывай «по памяти» на сервинге.

Как отвечать: «Какая предобработка нужна тексту перед моделью?»

Зависит от модели это и есть ответ. Для tf-idf и классики: лемматизация (для русского с его морфологией - обязательно), унификация регистра и ё/е, стоп-слова - только если метрика подтверждает пользу, потому что в тональности «не» решает. Для BERT-класса - почти ничего: сырой текст, у модели свой подсловный токенизатор, и агрессивная чистка ломает распределение предобучения. Для NER регистр не трогаю это признак сущности. И любую предобработку фиксирую версией вместе с моделью: разный код на трейне и сервинге - тихая деградация.

Ответ ветвится по типу модели и задаче вместо универсального рецепта - ровно та зрелость, которую проверяют.

На чём валят

  • Лемматизировать текст перед BERT - ломаешь распределение предобучения.
  • Удалить стоп-слова и потерять отрицания в тональности.
  • Разная предобработка в трейне и проде - деградация без ошибок в логах.
  • Lowercase до NER - «Орёл» и «орёл» неразличимы.

Проверьте себя

Пять вопросов из банка по этой подтеме. Всего их 10, остальные разбираются в тренажёре.

  1. #preprocessing1 / 5
    Что дают биграммы/триграммы (n-граммы) поверх мешка отдельных слов?
    A)Существенно уменьшают итоговую размерность пространства признаков модели
    B)Делают модель независимой от конкретного языка
    C)Захватывают локальный порядок и словосочетания («не хорошо», «машинное обучение»), теряемые мешком слов
    D)Заменяют собой синтаксический разбор предложения
    показать ответ и разбор
    +C)Захватывают локальный порядок и словосочетания («не хорошо», «машинное обучение»), теряемые мешком слов

    // разбор: Мешок слов игнорирует порядок: «не хорошо» и «хорошо» неразличимы по униграммам. N-граммы (пары/тройки подряд идущих слов) возвращают локальный контекст и устойчивые словосочетания, что важно для сентимента и терминов. Цена — взрыв размерности (комбинаторно много n-грамм) и разреженность, поэтому n ограничивают (2-3) и отсекают редкие.

  2. #preprocessing2 / 5
    Классический BoW/TF-IDF встречает на инференсе слово, которого не было в обучении. Что происходит?
    A)Модель падает с ошибкой выполнения
    B)Это слово автоматически добавляется в словарь признаков и переобучает всю модель с нуля
    C)Оно автоматически заменяется ближайшим синонимом
    D)OOV-слово игнорируется — его нет в фиксированном словаре признаков, информация теряется
    показать ответ и разбор
    +D)OOV-слово игнорируется — его нет в фиксированном словаре признаков, информация теряется

    // разбор: Словарь признаков BoW/TF-IDF фиксируется на обучении. Слово вне словаря (OOV) не имеет колонки-признака и просто выпадает — модель его «не видит», часть сигнала теряется. Это ограничение sparse-представлений. Смягчения: больший корпус, subword-признаки (character n-grams, fastText), хеширование признаков (hashing trick — нет фиксированного словаря).

  3. #preprocessing3 / 5
    Частоты слов в корпусе подчиняются закону Ципфа. Практическое следствие для NLP?
    A)Мало слов сверхчастотны, огромный хвост редких: признаки разрежены, редкие слова плохо оценены
    B)Все слова в корпусе встречаются примерно одинаково часто
    C)Частота употребления слова не связана с его рангом — это независимые статистические характеристики
    D)Длинные слова встречаются частотнее коротких
    показать ответ и разбор
    +A)Мало слов сверхчастотны, огромный хвост редких: признаки разрежены, редкие слова плохо оценены

    // разбор: Закон Ципфа: частота слова обратно пропорциональна его рангу — горстка слов даёт большую долю токенов, а десятки тысяч встречаются единично. Следствия: словарь длинный и разреженный, редкие слова имеют шумные оценки (частоты, эмбеддинги), а частотные (часто стоп-слова) малоинформативны. Отсюда отсечение редких (min_df) и частых (max_df), сглаживание, subword.

  4. #preprocessing4 / 5
    Когда агрессивный препроцессинг (стемминг + удаление стоп-слов + lowercasing) вредит?
    A)Редко: агрессивная нормализация текста улучшает итоговое качество модели
    B)Когда важны регистр/пунктуация/отрицания/сущности: «US» vs «us», «not good», имена — их теряем
    C)На очень маленьких обучающих корпусах текстов
    D)При использовании именно TF-IDF, а не BoW
    показать ответ и разбор
    +B)Когда важны регистр/пунктуация/отрицания/сущности: «US» vs «us», «not good», имена — их теряем

    // разбор: Нормализация снижает разреженность, но стирает сигнал: lowercasing склеивает «US» (страна) и «us»; удаление стоп-слов убивает отрицания («not good»→«good»); стемминг склеивает разные смыслы; выброс пунктуации ломает структуру. Для сентимента, NER, поиска сущностей это ощутимо. Препроцессинг подбирают под задачу, а не «максимально агрессивно по умолчанию».

  5. #preprocessing5 / 5
    Зачем в классическом NLP-пайплайне текст приводят к нижнему регистру?
    A)Чтобы «Кот» и «кот» не стали двумя разными признаками
    B)Чтобы токенизатор смог разбить текст по пробелам
    C)Чтобы уменьшить длину документа и ускорить обучение
    D)Чтобы заодно вычистить из текста пунктуацию и служебные символы
    показать ответ и разбор
    +A)Чтобы «Кот» и «кот» не стали двумя разными признаками

    // разбор: В мешке слов признак — это конкретная строка. Без lowercasing «Кот», «кот» и «КОТ» занимают три позиции в словаре, дробя статистику и раздувая размерность. Плата: пропадает сигнал регистра — имена собственные, аббревиатуры (US против us), крик капсом в отзыве. Для NER или тональности это стоит качества.

дальше

Теорию прочитали. Навык ставится повторением

В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.