Как перевести текст в числовое представление?

Перевод текста в числовое представление — это фундаментальный этап обработки естественного языка (NLP), позволяющий алгоритмам машинного обучения работать с текстами. Машины оперируют числами, и для подачи текстов в модель их необходимо закодировать численно. Существуют различные подходы, от простых мешков слов до современных контекстных эмбеддингов. Ниже подробно рассмотрены основные методы.

1. One-Hot Encoding (одноразовое кодирование)

Каждое уникальное слово представляется вектором, где только один элемент равен 1, а остальные — 0.

Пример:

Словарь: ["мама", "мыла", "раму"]
Текст: "мыла"

One-hot: [0, 1, 0]

Недостатки:

  • Векторы разреженные и высокоразмерные.

  • Нет информации о семантике или расстоянии между словами.

Используется редко, в основном в учебных примерах.

2. Bag-of-Words (BOW)

Векторизация текста на основе частот слов. Каждое слово соответствует позиции в векторе, а значение — количество вхождений в документ.

Пример:

Документы:

  1. "кошка сидит на ковре"

  2. "собака лежит на ковре"

Словарь: [кошка, собака, сидит, лежит, на, ковре]

Вектор для 1: [1, 0, 1, 0, 1, 1]
Вектор для 2: [0, 1, 0, 1, 1, 1]

Плюсы:

  • Простая реализация

  • Работает в базовых моделях (напр. наивный байес)

Минусы:

  • Не учитывает порядок слов

  • Повышает размерность при большом словаре

  • Синонимы — разные токены

Реализация в scikit-learn:

from sklearn.feature_extraction.text import CountVectorizer
corpus = \["кошка сидит на ковре", "собака лежит на ковре"\]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
print(X.toarray())

3. TF-IDF (Term Frequency – Inverse Document Frequency)

Модификация BOW. Взвешивает частоту слова в документе с учётом того, как часто оно встречается в других документах. Идея: слова, встречающиеся часто в одном документе, но редко в остальных, более значимы.

Формула:

TF(w) = число вхождений слова w в документ
IDF(w) = log(общее число документов / число документов с w)
TF-IDF(w) = TF(w) × IDF(w)

Плюсы:

  • Учитывает значимость слов

  • Подавляет влияние общеупотребительных слов

from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer()

X = vectorizer.fit_transform(corpus)

4. Word Embeddings (встраивания слов)

Это способ представления слов в виде плотных векторов фиксированной длины, обученных на большом корпусе. В отличие от BOW и TF-IDF, embeddings учитывают семантику: похожие слова имеют близкие векторы.

Word2Vec

Алгоритм от Google (2013), обучает векторные представления слов на основе их контекста в предложении.

  • CBOW (Continuous Bag of Words): предсказывает слово по окружению

  • Skip-gram: предсказывает контекст по слову

from gensim.models import Word2Vec
sentences = \[\["мама", "мыла", "раму"\], \["папа", "читал", "газету"\]\]
model = Word2Vec(sentences, vector_size=100, window=2, min_count=1)
vector = model.wv\["мама"\]

GloVe (Global Vectors)

Модель от Stanford, обучается на глобальных статистиках соотношений слов. Преимущества — точность и устойчивость.

FastText

Разработка от Facebook. В отличие от Word2Vec, учитывает морфологию слов через n-граммы, что полезно для флективных языков (например, русского). Позволяет строить вектор и для незнакомых слов.

from gensim.models import FastText
model = FastText(sentences, vector_size=100)

Плюсы embeddings:

  • Слова с похожим значением имеют близкие векторы

  • Компактность

  • Могут использоваться как вход в нейросети

5. Sequence Encoding (индексы слов)

Для подачи текста в нейросеть часто используют числовые индексы слов из словаря.

Пример:

Словарь: {'мама': 1, 'мыла': 2, 'раму': 3}
Текст: "мама мыла раму"
Результат: [1, 2, 3]

from keras.preprocessing.text import Tokenizer
tokenizer = Tokenizer()
tokenizer.fit_on_texts(\["мама мыла раму", "папа читал газету"\])
sequences = tokenizer.texts_to_sequences(\["мама мыла раму"\])

Можно дополнительно выравнивать длину последовательностей (pad_sequences) перед подачей в RNN или CNN.

6. Контекстные эмбеддинги (BERT и аналоги)

Современные трансформеры (например, BERT, RoBERTa, GPT) генерируют контекстно-зависимые вектора: один и тот же токен может иметь разное представление в зависимости от контекста.

Пример:

"bank" в "he sat on the river bank" и "he went to the bank" — разные вектора

Модели можно использовать через библиотеку transformers:

from transformers import BertTokenizer, BertModel
import torch
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model = BertModel.from_pretrained("bert-base-uncased")
inputs = tokenizer("hello world", return_tensors="pt")
outputs = model(\*\*inputs)

Выход: last_hidden_state — тензор размером [batch_size, sequence_length, hidden_size] (обычно hidden_size = 768)

7. Doc2Vec — векторизация целого документа

Модификация Word2Vec, которая обучает представление всего предложения/документа, а не только слов. Это полезно для классификации текстов или сравнения документов.

from gensim.models.doc2vec import Doc2Vec, TaggedDocument
documents = \[TaggedDocument(\["мама", "мыла", "раму"\], \[0\]),
TaggedDocument(\["папа", "читал", "газету"\], \[1\])\]
model = Doc2Vec(documents, vector_size=100)
vector = model.infer_vector(\["мама", "читала", "книгу"\])

8. Byte-Pair Encoding (BPE) и токенизация под трансформеры

Современные модели используют субсловные единицы (части слов), чтобы справляться с новыми словами. BPE позволяет разбить редкое слово на известные фрагменты.

from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
tokens = tokenizer.tokenize("embedding techniques")
**"embedding"  \['em', '##bed', '##ding'\]**

Это позволяет использовать фиксированный словарь и обрабатывать любые слова, включая новые.

Сравнение подходов

Метод Учитывает порядок Учитывает семантику Размерность Скорость Контекстуальность
One-hot Нет Нет Высокая Быстрая Нет
--- --- --- --- --- ---
BOW Нет Нет Средняя Быстрая Нет
--- --- --- --- --- ---
TF-IDF Нет Косвенно Средняя Средняя Нет
--- --- --- --- --- ---
Word2Vec Нет Да Низкая Быстрая Нет
--- --- --- --- --- ---
FastText Нет Да (морфология) Низкая Быстрая Нет
--- --- --- --- --- ---
BERT Да Да Средняя Медленно Да
--- --- --- --- --- ---
Doc2Vec Нет Да Низкая Средняя Частично
--- --- --- --- --- ---

Перевод текста в числа — важнейший этап, который влияет на эффективность модели. Выбор метода зависит от задачи, объёма данных, требований к точности и доступных ресурсов.