Что такое one-hot encoding для слов?

One-hot encoding для слов — это способ представления слов в виде векторов, в которых только один элемент равен 1 (единице), а все остальные — 0 (нули). Он широко используется в задачах обработки естественного языка (NLP) для преобразования слов в числовой формат, понятный моделям машинного обучения.

Идея и интуиция

Каждому уникальному слову в словаре (вокабуляре) сопоставляется уникальный индекс. Затем слово представляется вектором длиной, равной размеру словаря, где:

  • на позиции, соответствующей индексу этого слова — 1,

  • на всех остальных — 0.

Пример

Допустим, у нас есть словарь из 5 слов:

\["кот", "собака", "птица", "рыба", "лошадь"\]

Каждое слово можно закодировать следующим образом:

Слово Индекс One-hot вектор
кот 0 [1, 0, 0, 0, 0]
--- --- ---
собака 1 [0, 1, 0, 0, 0]
--- --- ---
птица 2 [0, 0, 1, 0, 0]
--- --- ---
рыба 3 [0, 0, 0, 1, 0]
--- --- ---
лошадь 4 [0, 0, 0, 0, 1]
--- --- ---

Таким образом, каждое слово представлено уникальным вектором, не пересекающимся с другими словами.

Как реализуется

  1. Создаётся словарь (vocabulary): уникальные слова из корпуса текста.

  2. **Каждому слову назначается индекс.
    **

  3. Слова кодируются в one-hot векторы — векторы той же длины, что и словарь.

На практике:

from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
import numpy as np
words = \["кот", "собака", "птица", "рыба", "лошадь"\]
\# Преобразуем в числовые индексы
label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(words) # \[0, 1, 4, 3, 2\]
\# Преобразуем в one-hot
integer_encoded = integer_encoded.reshape(-1, 1)
onehot_encoder = OneHotEncoder(sparse=False)
onehot = onehot_encoder.fit_transform(integer_encoded)
print(onehot)

Где используется

  • **Классификация слов
    **
  • Входной слой нейросетей (в простых моделях)

  • Обработка категориальных признаков, если слова — категории

  • Встроенные слои (Embedding) часто заменяют one-hot на более компактные представления, но на вход они получают именно индексы слов, которые могли бы быть представлены и как one-hot.

Свойства one-hot векторов

  • Размерность = количество уникальных слов в словаре.

  • Разреженность: только один элемент равен 1, остальные — 0.

  • Ортогональность: векторы разных слов не пересекаются (скалярное произведение = 0).

Преимущества

  1. Простота: легко реализуется и интерпретируется.

  2. Без потери информации о лексеме: каждому слову — уникальный код.

  3. Никаких предположений о семантике: используется как базовый метод.

Недостатки

  1. Отсутствие семантической информации
    Слова "кошка" и "собака" будут так же далеки друг от друга, как "кошка" и "шкаф".

  2. Высокая размерность
    В больших корпусах — десятки тысяч или миллионы слов → огромные разреженные векторы.

  3. Разреженность
    Большинство элементов — нули. Это неэффективно по памяти и вычислениям.

  4. Проблема OOV (Out of Vocabulary)
    Новые слова, не встречавшиеся при обучении, не имеют вектора.

Сравнение с другими методами

Метод Семантика Размерность Плотность Обработка новых слов
One-hot encoding Высокая Разреженная
--- --- --- --- ---
TF-IDF ❌ частично Средняя Разреженная
--- --- --- --- ---
Word2Vec, FastText Низкая (100-300) Плотная FastText: ✅
--- --- --- --- ---
BERT, GPT, ELMo ✅ контекст Средняя/высокая Плотная
--- --- --- --- ---

Как используется в нейронных сетях

В простых сетях:

  • One-hot подаётся на вход, например, в Dense-слой.

В современных моделях:

  • Индекс слова подаётся в Embedding слой, который преобразует его в плотный вектор.

  • Например, вместо one-hot ["кот"] → [1, 0, 0, 0, 0] модель может преобразовать "кот" → [0.12, -0.5, 0.8, ...]

Специальный случай — character-level one-hot

Иногда one-hot используется не для слов, а для символов:

"мир"

"м" = [1, 0, 0, ..., 0]

"и" = [0, 1, 0, ..., 0]

"р" = [0, 0, 1, ..., 0]

Применяется в генерации текста посимвольно, в captcha-распознавании, и там, где слова нестабильны или редки.

Подходы к снижению размерности

Из-за проблем высокой размерности, часто применяют:

  • Hashing trick — хеширование слов в фиксированное число корзин.

  • PCA / SVD / TruncatedSVD — для уменьшения размерности разреженной матрицы.

  • Embedding Layer — обучаемый слой, заменяющий one-hot на плотные векторы.

Когда использовать one-hot

  • При небольшом словаре (например, классификация категорий)

  • Как baseline для оценки более сложных моделей

  • Для обучения своих эмбеддингов с нуля

  • При использовании моделей, которые не требуют семантической близости между словами

One-hot encoding остаётся фундаментальным методом представления категориальных и текстовых данных, несмотря на его простоту и ограничения. Он помогает понять, как текст можно перевести в числовую форму, и служит основой для многих более продвинутых методов.