Что такое 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] |
--- | --- | --- |
Таким образом, каждое слово представлено уникальным вектором, не пересекающимся с другими словами.
Как реализуется
-
Создаётся словарь (vocabulary): уникальные слова из корпуса текста.
-
**Каждому слову назначается индекс.
** - Слова кодируются в 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).
Преимущества
-
Простота: легко реализуется и интерпретируется.
-
Без потери информации о лексеме: каждому слову — уникальный код.
-
Никаких предположений о семантике: используется как базовый метод.
Недостатки
-
Отсутствие семантической информации
Слова "кошка" и "собака" будут так же далеки друг от друга, как "кошка" и "шкаф". -
Высокая размерность
В больших корпусах — десятки тысяч или миллионы слов → огромные разреженные векторы. -
Разреженность
Большинство элементов — нули. Это неэффективно по памяти и вычислениям. -
Проблема 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 остаётся фундаментальным методом представления категориальных и текстовых данных, несмотря на его простоту и ограничения. Он помогает понять, как текст можно перевести в числовую форму, и служит основой для многих более продвинутых методов.