Как перевести текст в числовое представление?
Перевод текста в числовое представление — это фундаментальный этап обработки естественного языка (NLP), позволяющий алгоритмам машинного обучения работать с текстами. Машины оперируют числами, и для подачи текстов в модель их необходимо закодировать численно. Существуют различные подходы, от простых мешков слов до современных контекстных эмбеддингов. Ниже подробно рассмотрены основные методы.
1. One-Hot Encoding (одноразовое кодирование)
Каждое уникальное слово представляется вектором, где только один элемент равен 1, а остальные — 0.
Пример:
Словарь: ["мама", "мыла", "раму"]
Текст: "мыла"
One-hot: [0, 1, 0]
Недостатки:
-
Векторы разреженные и высокоразмерные.
-
Нет информации о семантике или расстоянии между словами.
Используется редко, в основном в учебных примерах.
2. Bag-of-Words (BOW)
Векторизация текста на основе частот слов. Каждое слово соответствует позиции в векторе, а значение — количество вхождений в документ.
Пример:
Документы:
-
"кошка сидит на ковре"
-
"собака лежит на ковре"
Словарь: [кошка, собака, сидит, лежит, на, ковре]
Вектор для 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 | Нет | Да | Низкая | Средняя | Частично |
--- | --- | --- | --- | --- | --- |
Перевод текста в числа — важнейший этап, который влияет на эффективность модели. Выбор метода зависит от задачи, объёма данных, требований к точности и доступных ресурсов.