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, остальные разбираются в тренажёре.
- Чем BM25 улучшает наивный TF-IDF для ранжирования в поиске?A)Насыщением TF (убывающая отдача частоты) и нормировкой на длину документаB)Полным переходом от разреженных представлений к плотным нейросетевым эмбеддингам документовC)Полным отказом от IDF-компоненты в формулеD)Принципиальным игнорированием длины ранжируемого документа при подсчёте релевантности
показать ответ и разбор
+A)Насыщением TF (убывающая отдача частоты) и нормировкой на длину документа// разбор: Наивный TF-IDF линеен по частоте и не учитывает длину. BM25 добавляет: насыщение TF через k1 (после нескольких вхождений отдача убывает — второе важнее десятого) и нормировку на длину через b (длинные документы не выигрывают просто за счёт объёма). Итог — лучше ранжирует; де-факто стандарт лексического поиска (BM25 в Elasticsearch).
- Главная практическая проблема разреженных BoW/TF-IDF векторов на большом словаре?A)Эти векторы получаются плотными и занимают много оперативной памяти при обработкеB)Высокая размерность и разреженность: синонимы не сближаются, документ — точка среди десятков тысяч осейC)Они хранят порядок слов и потому очень медленныеD)Они требуют мощного GPU для простого хранения
показать ответ и разбор
+B)Высокая размерность и разреженность: синонимы не сближаются, документ — точка среди десятков тысяч осей// разбор: BoW/TF-IDF живут в пространстве размерности = размер словаря (десятки-сотни тысяч), но документ активирует лишь горстку осей — вектор почти весь нулевой (разреженный). Хранят эффективно, но проблема семантическая: синонимы («авто»/«машина») — ортогональные оси, близости смысла нет; редкие слова шумны. Это мотивировало плотные эмбеддинги.
- Что даёт hashing trick (feature hashing) для текстовых признаков?A)Уникальный и стабильный индекс каждому слову без коллизийB)Плотные семантические эмбеддинги слов из нейросетиC)Отображение слов в фиксированное число корзин хешем — без хранимого словаря, ценой возможных коллизийD)Ускорение за счёт предварительной сортировки словаря
показать ответ и разбор
+C)Отображение слов в фиксированное число корзин хешем — без хранимого словаря, ценой возможных коллизий// разбор: Feature hashing применяет хеш к слову и берёт остаток от числа корзин — индекс признака вычисляется на лету, словарь хранить не нужно (важно для потоков/огромных корпусов и OOV: новые слова тоже хешируются). Плата — коллизии: разные слова иногда в одной корзине, теряя различимость; смягчается большим числом корзин и знаковым хешем. Фиксированная размерность — плюс для памяти.
- Почему для сравнения TF-IDF векторов документов берут косинусную близость, а не евклидово расстояние?A)Косинус меряет угол (совпадение по составу слов) и не зависит от длины документа; евклид штрафует разницу длинB)Евклидово расстояние сложно вычислить для текстовых векторных представленийC)Косинусная близость вычисляется существенно быстрееD)Косинус дополнительно учитывает порядок следования слов
показать ответ и разбор
+A)Косинус меряет угол (совпадение по составу слов) и не зависит от длины документа; евклид штрафует разницу длин// разбор: TF-IDF вектор длинного документа имеет большие нормы просто из-за объёма. Евклидово расстояние смешало бы «разный смысл» и «разная длина». Косинус нормирует на длины и меряет угол — долю общего по составу/весам слов независимо от размера документа. Поэтому короткий и длинный тексты об одном получат высокую близость. Для нормированных векторов косинус монотонно связан с евклидом.
- Почему текст нельзя подать в ML-модель как есть, строкой?A)Строки слишком длинные и не влезают в память моделиB)Модель считает числа: текст надо превратить в векторC)Строки в Python неизменяемы, а модель меняет вход на местеD)Из-за кодировки: модель понимает ASCII, а не кириллицу
показать ответ и разбор
+B)Модель считает числа: текст надо превратить в вектор// разбор: Модель — это арифметика над числами: умножения, суммы, градиенты. Текст сначала режут на токены, затем каждому сопоставляют число (индекс в словаре), а дальше — вектор: счётчик в BoW, вес в TF-IDF, обучаемый эмбеддинг в нейросети. Способ векторизации и определяет, что модель вообще способна уловить.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.