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, остальные разбираются в тренажёре.
- Что дают биграммы/триграммы (n-граммы) поверх мешка отдельных слов?A)Существенно уменьшают итоговую размерность пространства признаков моделиB)Делают модель независимой от конкретного языкаC)Захватывают локальный порядок и словосочетания («не хорошо», «машинное обучение»), теряемые мешком словD)Заменяют собой синтаксический разбор предложения
показать ответ и разбор
+C)Захватывают локальный порядок и словосочетания («не хорошо», «машинное обучение»), теряемые мешком слов// разбор: Мешок слов игнорирует порядок: «не хорошо» и «хорошо» неразличимы по униграммам. N-граммы (пары/тройки подряд идущих слов) возвращают локальный контекст и устойчивые словосочетания, что важно для сентимента и терминов. Цена — взрыв размерности (комбинаторно много n-грамм) и разреженность, поэтому n ограничивают (2-3) и отсекают редкие.
- Классический BoW/TF-IDF встречает на инференсе слово, которого не было в обучении. Что происходит?A)Модель падает с ошибкой выполненияB)Это слово автоматически добавляется в словарь признаков и переобучает всю модель с нуляC)Оно автоматически заменяется ближайшим синонимомD)OOV-слово игнорируется — его нет в фиксированном словаре признаков, информация теряется
показать ответ и разбор
+D)OOV-слово игнорируется — его нет в фиксированном словаре признаков, информация теряется// разбор: Словарь признаков BoW/TF-IDF фиксируется на обучении. Слово вне словаря (OOV) не имеет колонки-признака и просто выпадает — модель его «не видит», часть сигнала теряется. Это ограничение sparse-представлений. Смягчения: больший корпус, subword-признаки (character n-grams, fastText), хеширование признаков (hashing trick — нет фиксированного словаря).
- Частоты слов в корпусе подчиняются закону Ципфа. Практическое следствие для NLP?A)Мало слов сверхчастотны, огромный хвост редких: признаки разрежены, редкие слова плохо оцененыB)Все слова в корпусе встречаются примерно одинаково частоC)Частота употребления слова не связана с его рангом — это независимые статистические характеристикиD)Длинные слова встречаются частотнее коротких
показать ответ и разбор
+A)Мало слов сверхчастотны, огромный хвост редких: признаки разрежены, редкие слова плохо оценены// разбор: Закон Ципфа: частота слова обратно пропорциональна его рангу — горстка слов даёт большую долю токенов, а десятки тысяч встречаются единично. Следствия: словарь длинный и разреженный, редкие слова имеют шумные оценки (частоты, эмбеддинги), а частотные (часто стоп-слова) малоинформативны. Отсюда отсечение редких (min_df) и частых (max_df), сглаживание, subword.
- Когда агрессивный препроцессинг (стемминг + удаление стоп-слов + 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, поиска сущностей это ощутимо. Препроцессинг подбирают под задачу, а не «максимально агрессивно по умолчанию».
- Зачем в классическом NLP-пайплайне текст приводят к нижнему регистру?A)Чтобы «Кот» и «кот» не стали двумя разными признакамиB)Чтобы токенизатор смог разбить текст по пробеламC)Чтобы уменьшить длину документа и ускорить обучениеD)Чтобы заодно вычистить из текста пунктуацию и служебные символы
показать ответ и разбор
+A)Чтобы «Кот» и «кот» не стали двумя разными признаками// разбор: В мешке слов признак — это конкретная строка. Без lowercasing «Кот», «кот» и «КОТ» занимают три позиции в словаре, дробя статистику и раздувая размерность. Плата: пропадает сигнал регистра — имена собственные, аббревиатуры (US против us), крик капсом в отзыве. Для NER или тональности это стоит качества.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.