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

NLP: представление текста

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

TF-IDF - вопрос на «понимаешь ли механику, которой пользуешься»: формулу не спрашивают, спрашивают интуицию взвешивания и когда этот подход до сих пор лучший выбор.

// Спойлер: tf-idf + логрег - бейзлайн, который стыдно не поставить и трудно побить на длинных текстах.

Мешок слов и TF-IDF

Bag-of-words: текст - вектор частот слов, порядок потерян полностью. Для тем и спама этого часто хватает: лексика выдаёт класс.

TF-IDF (inverse document frequency) взвешивает частоту слова в документе на его редкость по корпусу: «и»/«в» гасятся, дискриминативные слова растут. Это лечит главный дефект сырых частот - доминирование общеупотребимого.

// N-граммы возвращают локальный порядок: «не нравится» перестаёт равняться «нравится». Обычно берут 1-2-граммы - дальше размерность растёт быстрее пользы.

TF-IDF
частота в документе × редкость в корпусе

Разреженное против плотного

Разреженные представления (мешки, tf-idf) дружат с линейными моделями: sparse-математика быстра, веса интерпретируемы. Деревьям на них плохо. Плотные (эмбеддинги) - наоборот: вход нейросетей и близость по смыслу.

Слабость всех мешков - синонимия и полисемия: «автомобиль» и «машина» - ортогональные оси. Это ровно то, что чинят эмбеддинги.

// Хеширующий векторайзер - фиксированная размерность без словаря: стриминг и огромные корпуса ценой коллизий и потери обратного отображения «признак → слово».

sparse / dense
мешки для линеек / эмбеддинги для сетей

Ловушка fit до сплита

fit TF-IDF на всём корпусе до train/test-сплита - утечка: IDF-статистика теста просочилась в трейн. Правильно: fit на трейне, transform на тесте.

Мелочь? На соревнованиях и в статьях эта «мелочь» регулярно объясняет невоспроизводимые проценты.

// Для текстов с опечатками и богатой морфологией символьные n-граммы часто сильнее словных - про них забывают почти все.

Как отвечать: «Когда tf-idf с линейной моделью лучше нейросети?»

Чаще, чем принято думать. Длинные тексты с выраженной лексикой - темы, спам, жанры: класс выдают сами слова, и tf-idf с логрегом даёт качество около трансформерного за проценты его цены, мгновенный инференс и интерпретируемые веса - видно, какие слова решили. Мало данных для дообучения, жёсткий бюджет латентности, нужна объяснимость - те же аргументы. Нейросеть выигрывает там, где решает смысл, а не лексика: короткие тексты, парафразы, тонкая семантика. Поэтому порядок всегда один: сначала tf-idf-бейзлайн, потом оправдывать усложнение приростом.

Конкретные условия выбора в обе стороны - вместо религиозного «нейросети лучше».

На чём валят

  • fit TF-IDF до сплита - IDF-статистика теста утекла в трейн.
  • Забыть символьные n-граммы для текстов с опечатками - они там сильнее словных.
  • Мешок слов на короткие перефразированные тексты - смысл не ловится, нужны эмбеддинги.
  • Плотный вектор в линейную модель «как tf-idf» - теряются и sparse-скорость, и интерпретируемость.

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

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

  1. #text_representation1 / 5
    Чем BM25 улучшает наивный TF-IDF для ранжирования в поиске?
    A)Насыщением TF (убывающая отдача частоты) и нормировкой на длину документа
    B)Полным переходом от разреженных представлений к плотным нейросетевым эмбеддингам документов
    C)Полным отказом от IDF-компоненты в формуле
    D)Принципиальным игнорированием длины ранжируемого документа при подсчёте релевантности
    показать ответ и разбор
    +A)Насыщением TF (убывающая отдача частоты) и нормировкой на длину документа

    // разбор: Наивный TF-IDF линеен по частоте и не учитывает длину. BM25 добавляет: насыщение TF через k1 (после нескольких вхождений отдача убывает — второе важнее десятого) и нормировку на длину через b (длинные документы не выигрывают просто за счёт объёма). Итог — лучше ранжирует; де-факто стандарт лексического поиска (BM25 в Elasticsearch).

  2. #text_representation2 / 5
    Главная практическая проблема разреженных BoW/TF-IDF векторов на большом словаре?
    A)Эти векторы получаются плотными и занимают много оперативной памяти при обработке
    B)Высокая размерность и разреженность: синонимы не сближаются, документ — точка среди десятков тысяч осей
    C)Они хранят порядок слов и потому очень медленные
    D)Они требуют мощного GPU для простого хранения
    показать ответ и разбор
    +B)Высокая размерность и разреженность: синонимы не сближаются, документ — точка среди десятков тысяч осей

    // разбор: BoW/TF-IDF живут в пространстве размерности = размер словаря (десятки-сотни тысяч), но документ активирует лишь горстку осей — вектор почти весь нулевой (разреженный). Хранят эффективно, но проблема семантическая: синонимы («авто»/«машина») — ортогональные оси, близости смысла нет; редкие слова шумны. Это мотивировало плотные эмбеддинги.

  3. #text_representation3 / 5
    Что даёт hashing trick (feature hashing) для текстовых признаков?
    A)Уникальный и стабильный индекс каждому слову без коллизий
    B)Плотные семантические эмбеддинги слов из нейросети
    C)Отображение слов в фиксированное число корзин хешем — без хранимого словаря, ценой возможных коллизий
    D)Ускорение за счёт предварительной сортировки словаря
    показать ответ и разбор
    +C)Отображение слов в фиксированное число корзин хешем — без хранимого словаря, ценой возможных коллизий

    // разбор: Feature hashing применяет хеш к слову и берёт остаток от числа корзин — индекс признака вычисляется на лету, словарь хранить не нужно (важно для потоков/огромных корпусов и OOV: новые слова тоже хешируются). Плата — коллизии: разные слова иногда в одной корзине, теряя различимость; смягчается большим числом корзин и знаковым хешем. Фиксированная размерность — плюс для памяти.

  4. #text_representation4 / 5
    Почему для сравнения TF-IDF векторов документов берут косинусную близость, а не евклидово расстояние?
    A)Косинус меряет угол (совпадение по составу слов) и не зависит от длины документа; евклид штрафует разницу длин
    B)Евклидово расстояние сложно вычислить для текстовых векторных представлений
    C)Косинусная близость вычисляется существенно быстрее
    D)Косинус дополнительно учитывает порядок следования слов
    показать ответ и разбор
    +A)Косинус меряет угол (совпадение по составу слов) и не зависит от длины документа; евклид штрафует разницу длин

    // разбор: TF-IDF вектор длинного документа имеет большие нормы просто из-за объёма. Евклидово расстояние смешало бы «разный смысл» и «разная длина». Косинус нормирует на длины и меряет угол — долю общего по составу/весам слов независимо от размера документа. Поэтому короткий и длинный тексты об одном получат высокую близость. Для нормированных векторов косинус монотонно связан с евклидом.

  5. #text_representation5 / 5
    Почему текст нельзя подать в ML-модель как есть, строкой?
    A)Строки слишком длинные и не влезают в память модели
    B)Модель считает числа: текст надо превратить в вектор
    C)Строки в Python неизменяемы, а модель меняет вход на месте
    D)Из-за кодировки: модель понимает ASCII, а не кириллицу
    показать ответ и разбор
    +B)Модель считает числа: текст надо превратить в вектор

    // разбор: Модель — это арифметика над числами: умножения, суммы, градиенты. Текст сначала режут на токены, затем каждому сопоставляют число (индекс в словаре), а дальше — вектор: счётчик в BoW, вес в TF-IDF, обучаемый эмбеддинг в нейросети. Способ векторизации и определяет, что модель вообще способна уловить.

дальше

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

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