05 / 37 · Классический NLP
Мешок слов и TF-IDF
Первый классификатор текстов считает, какие токены содержит документ, и подаёт счётчики линейной модели; TF-IDF перевзвешивает счётчики, чтобы частые неинформативные токены перестали доминировать. На AG News этот базовый уровень даёт 92% правильных ответов и задаёт планку для каждой следующей нейросетевой модели.
На этой странице 10
У нас есть идентификаторы токенов и способ измерить качество классификатора. Задача этой заметки конкретна: 120 000 новостных статей, четыре темы (World, Sports, Business, Sci/Tech) и модель, которая приписывает тему новой статье. Линейному классификатору нужен вектор фиксированной длины для каждого документа, а документы имеют разную длину. Простейший способ получить вектор фиксированной длины — полностью забыть о порядке и считать.
Обозначения. — словарь из записей, — обучающий корпус из документов. — число вхождений токена в документ ; — число документов, содержащих . Документ представлен вектором .
Отправная точка: подсчёт токенов#
Представление мешок слов (bag of words) задаёт
Документ становится вектором, координата которого для каждой записи словаря равна числу её вхождений. Порядок слов отбрасывается: «dog bites man» и «man bites dog» получают один и тот же вектор. Остаётся то, какие токены встречаются и как часто, и для классификации по темам это бо́льшая часть сигнала: статья о футбольном матче содержит match, goal и coach, в каком бы порядке ни шли предложения.
Размерности показывают цену. Со словарём AG News из заметки о предобработке , и обучающая матрица имеет форму . В плотном виде это было бы элементов; в разреженном — совсем немного, потому что у статьи из 40 различных токенов 40 ненулевых координат из 29 350. Всё в этой заметке работает с разреженными матрицами.
Линейный классификатор на счётчиках#
Многоклассовая логистическая регрессия отображает вектор в одну оценку на класс и нормирует оценки через softmax:
Строка матрицы содержит по одному весу на запись словаря; положительный вес goal в строке Sports повышает оценку Sports всякий раз, когда в статье встречается goal, пропорционально числу вхождений. Модель обучается минимизацией кросс-энтропии истинной метки относительно предсказанного распределения, усреднённой по корпусу:
Почему функция потерь именно такая и как она связана с энтропией и KL-дивергенцией, выведено в курсе по генеративным моделям; заметка об n-граммах повторяет четыре эквивалентные формы для случая языковой модели. Пока достаточно того, что минимизация максимизирует правдоподобие обучающих меток.
Разобранный пример#
Три однострочных документа и словарь из пяти слов:
cat | dog | sat | ran | fast | |
|---|---|---|---|---|---|
| = «the cat sat» | 1 | 0 | 1 | 0 | 0 |
| = «the dog ran fast» | 0 | 1 | 0 | 1 | 1 |
| = «the cat ran fast fast» | 1 | 0 | 0 | 1 | 2 |
the удалено как стоп-слово. У в столбце fast стоит 2, потому что токен встречается дважды. Классификатор, которому нужно отделить статьи «о животных» от статей «о движении», может поставить положительные веса на sat/cat/dog в одной строке и на ran/fast в другой; , где смешано и то и другое, получает оценку, зависящую от счётчиков.
Где сырые счётчики не работают#
Векторы счётчиков искажают два эффекта.
Длина. У длинного документа счётчики больше, чем у короткого на ту же тему, поэтому его вектор длиннее, а оценки масштабируются вверх. Уверенность классификатора тогда измеряет длину, а не свидетельства.
Частые токены. Даже после удаления стоп-слов некоторые токены есть в большинстве документов корпуса: в новостном корпусе это said, year, new. Их счётчики велики, поэтому они доминируют в скалярных произведениях , ничего не говоря о теме. Токен, который есть в каждом документе, самим своим присутствием ничего не говорит. Его счётчик всё ещё может различаться между классами (один раз на статью в одной теме, десять раз — в другой), но такие токены обычно мало говорят о теме. IDF понижает их вес по фиксированному правилу, которое не смотрит на метки; обученный классификатор тоже может выучить для них малые веса.
TF-IDF: перевзвешивание счётчиков#
Частота термина (term frequency) — это счётчик, в некоторых вариантах нормированный на длину документа:
Обратная документная частота (inverse document frequency) измеряет, насколько токен редок среди документов:
У токена, который есть в каждом документе, и : он выключается. У токена, который есть в одном документе из тысячи, . Логарифм сжимает диапазон, так что токен из 1% документов не в 100 раз важнее токена из 100% документов, а важнее на единицы. Произведение
и есть новая координата. Результаты ниже получены реализацией scikit-learn, которая отличается тремя деталями, важными при воспроизведении чисел: в качестве tf она берёт сырой счётчик ; она сглаживает idf как — как будто есть ещё один документ, содержащий все токены, — так что ни один вес не бесконечен, а прибавленная единица оставляет токену, который есть в каждом документе, вес 1 вместо 0; и она нормирует вектор каждого документа к единичной евклидовой норме, что напрямую убирает эффект длины и делает деление счётчиков на длину ненужным.
Разобранный пример, продолжение#
Для трёх документов выше . Документные частоты: cat 2, dog 1, sat 1, ran 2, fast 2. По простому определению , . Для (пять токенов вместе с the, четыре после удаления стоп-слов):
| Токен | tf-idf | |||
|---|---|---|---|---|
cat | 1 | 0.25 | 0.405 | 0.101 |
ran | 1 | 0.25 | 0.405 | 0.101 |
fast | 2 | 0.50 | 0.405 | 0.203 |
Если бы fast встречалось во всех трёх документах, его idf был бы равен 0, и самый большой счётчик в векторе ничего бы не дал. Перевзвешивание делает то, что мы просили: счётчики по-прежнему важны, но только для токенов, которые различают документы.
Весь метод на трёх документах — от счётчиков до классификатора:
От счётчиков через TF-IDF к линейной модели
Результаты на AG News#
Конвейер такой: обучить векторизатор на обучающих текстах (словарь и idf), преобразовать обе части, обучить логистическую регрессию, измерить долю правильных ответов (accuracy).
| Признаки | Словарь | Доля верных (обучение) | Доля верных (тест) |
|---|---|---|---|
TF-IDF, униграммы, min_df=4, max_df=0.95 | 29 350 | 0.940 | 0.918 |
TF-IDF, 1–3-граммы, min_df=10, max_df=0.95 | 101 284 | 0.951 | 0.920 |
Словарь формируют два отсечения по частоте. min_df=4 отбрасывает токены, встреченные меньше чем в четырёх обучающих документах: они слишком редки, чтобы оценить для них вес, и это в основном опечатки и имена; max_df=0.95 отбрасывает токены, встречающиеся более чем в 95% документов, которые idf и так почти обнулил бы.
Вторая строка добавляет n-граммы: идущие подряд пары и тройки токенов как дополнительные записи словаря. Это стандартное частичное решение проблемы порядка: not done становится отдельным признаком, отличным от not и done. Цена — размер словаря. При униграммах биграмм может быть до , поэтому отсечение по частоте приходится поднять (min_df=10), чтобы матрица оставалась обозримой, а выигрыш здесь — 0.2 пункта, в пределах выборочной погрешности тестовой выборки из 7600 примеров: одна стандартная ошибка доли правильных ответов около 0.92 равна , то есть 0.3 пункта. На этом корпусе тему несут отдельные токены, и биграммы мало что добавляют.
Разрыв в 2–3 пункта между долей правильных ответов на обучении и на тесте — умеренное переобучение: при 29 350 весах на класс и 120 000 документах модель может запомнить часть токенов, характерных только для обучающей выборки.
Что изменилось#
| Мешок слов | TF-IDF | |
|---|---|---|
| Координата | , вектор нормирован | |
| Частые токены | Доминируют | Вес понижен почти до 0 |
| Длина документа | Масштабирует вектор | Убрана нормировкой |
| Порядок слов | Игнорируется | Игнорируется (n-граммы возвращают соседние пары) |
| Стоимость | Одна разреженная матрица | То же плюс один проход для idf |
Представление по-прежнему — разреженный вектор счётчиков; изменилось взвешивание, и одного этого хватает, чтобы линейная модель стала конкурентоспособной. Доля правильных ответов 0.92 на тесте — число, которое стоит запомнить: в заметке о CNN свёрточные сети поверх векторов слов достигают 0.90–0.91, ниже этого базового уровня, и только дообученный предобученный трансформер явно превосходит его в заметке о переносе обучения.
Ограничения#
- Нет порядка дальше n-грамм. «The film was not bad, it was great» и «the film was not great, it was bad» имеют почти все униграммы и биграммы общими.
- Нет сходства между токенами.
catиdog— ортогональные координаты; вес, выученный для одного, ничего не говорит о другом. Каждый токен должен встретиться при обучении достаточно часто, чтобы получить собственный вес. Ответ на это — заметка о векторах слов. - Открытый словарь. У токена, которого не было в обучающей выборке, нет координаты, и при тестировании он молча отбрасывается.
- Размерность. координат на документ и с биграммами; представление не сжимает.
- Тема, а не смысл. Метод работает там, где метку можно предсказать по тому, какие слова встречаются. Он не может ответить на вопрос, перевести текст или сказать, кто что сделал с кем.
Что нужно запомнить#
- Мешок слов: документ — вектор счётчиков его токенов. Порядок отбрасывается; матрица разреженная.
- Линейный классификатор на этих счётчиках, обученный с кросс-энтропией, — сильный базовый уровень для классификации по темам.
- TF-IDF умножает каждый счётчик на , выключая токены, которые встречаются везде, и нормирует вектор, чтобы погасить влияние длины.
- Словарь и idf обучаются только на обучающих данных.
- AG News: 0.918 правильных ответов на тесте с униграммами, 0.920 с 1–3-граммами. Нейросетевые модели из следующих заметок должны превзойти 0.92, чтобы оправдать свою цену.
Ноутбук#
week01_word_embeddings.ipynb. Номера ячеек считают все ячейки, включая текстовые, начиная с 1. Приведённые числа взяты из прогона, сохранённого в курсе; у ячеек, изменённых с тех пор под текущие версии библиотек, сохранённого выхода нет.
- Ячейки 33–36 загружают AG News (120 000 обучающих и 7600 тестовых примеров, столбцы
textиlabel, разделённые табуляцией); ячейка 38 строит сбалансированную гистограмму классов. - Ячейки 42–43 приводят использованные выше формулы tf и idf.
- Ячейки 44–48 обучают
TfidfVectorizer(min_df=4, max_df=0.95)на обучающих текстах, преобразуют обе части (обучающая матрица имеет форму(120000, 29350)), обучаютLogisticRegression(max_iter=500)и печатают долю правильных ответов 0.94 на обучении и 0.918 на тесте. - Ячейки 49–52 повторяют то же с
ngram_range=(1, 3)иmin_df=10: 0.951 на обучении, 0.92 на тесте. Размер этого словаря ноутбук не печатает; 101 284 получено отдельным обучением того же векторизатора.
Дальше#
Подсчёт токенов отвечает на вопрос «о чём этот документ». Он не может ответить на вопрос «что дальше», а это вопрос, стоящий за каждой генеративной моделью курса. Следующая заметка сохраняет подход подсчёта, но считает короткие последовательности токенов, что даёт первую языковую модель, способ порождать текст и метрику (перплексию), по которой измеряется каждая следующая языковая модель.
Литература#
- K. Spärck Jones. A statistical interpretation of term specificity and its application in retrieval. Journal of Documentation, 28(1), 1972. Взвешивание idf.
- C. D. Manning, P. Raghavan, H. Schütze. Introduction to Information Retrieval. Cambridge University Press, 2008. §6.2 (tf-idf) и §13 (классификация текстов).
- D. Jurafsky, J. H. Martin. Speech and Language Processing, 3rd ed. draft. Глава 5 (логистическая регрессия для текстов).
- scikit-learn developers. TfidfVectorizer и Feature extraction, §6.2.3.4. Сглаженный idf и нормировка L2, использованные в ноутбуке.
- X. Zhang, J. Zhao, Y. LeCun. Character-level Convolutional Networks for Text Classification. NeurIPS, 2015. Бенчмарк AG News; в таблице 4 приведены базовые уровни мешка слов и TF-IDF того же порядка, что и выше.