Методы представления текста
Представление текста — это фундаментальная задача в обработке естественного языка (NLP), которая преобразует неструктурированные текстовые данные в числовые формы, которые компьютеры могут обрабатывать.
В этой статье систематически рассматриваются часто используемые методы представления текста в NLP — от традиционных методов до современных методов глубокого обучения, что помогает читателям полностью понять эту ключевую концепцию.
Традиционное представление текста
Модель мешка слов
Модель мешка слов — один из простейших методов представления текста; она рассматривает текст как неупорядоченный набор слов.
Базовые понятия
- Игнорирует порядок слов и грамматику, учитывает только наличие слов
- Создайте словарь и подсчитайте вхождения каждого слова в документе
- Итоговое представление — многомерный разреженный вектор
Пример кода
Пример
корпус = [
'Это первый документ.',
'Этот документ — второй документ.',
'И это третий.',
'Это первый документ?'
]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names_out())
print(X.toarray())
Анализ преимуществ и недостатков
✅ Преимущества:
- Простая реализация, высокая вычислительная эффективность
- Подходит для небольших наборов данных и простых задач
❌ Недостатки:
- Игнорирует порядок слов и семантическую информацию
- Проблема высокой размерности и разреженности
- Не может обрабатывать синонимы и многозначные слова
TF-IDF
TF-IDF (частота термина — обратная частота документа) — это улучшение модели мешка слов, которое учитывает важность слов во всём корпусе.
Формула расчёта
- TF (частота термина):
The number of times a word appears in a document / total number of words in the document - IDF (обратная частота документа):
log(文档总数 / 包含该词的文档数) - TF-IDF = TF × IDF
Реализация кода
Пример
tfidf_vectorizer = TfidfVectorizer()
X_tfidf = tfidf_vectorizer.fit_transform(corpus)
print(tfidf_vectorizer.get_feature_names_out())
print(X_tfidf.toarray())
Плюсы и минусы
✅ Преимущества:
- Снижает влияние частых слов и выделяет важные слова
- Лучшая производительность по сравнению с простой моделью мешка слов
❌ Недостатки:
- Всё ещё может улавливать семантические связи
- Проблема высокой размерности по-прежнему
N-граммная модель
N-граммная модель учитывает информацию о порядке слов и представляет текст через комбинации из n последовательных слов.
Распространённые типы
- Униграмма (1-грамма): одно слово
- Биграмма (2-грамма): комбинация двух последовательных слов
- Триграмма (3-грамма): комбинация трёх последовательных слов
Пример кода
Пример
X_bigram = bigram_vectorizer.fit_transform(corpus)
print(bigram_vectorizer.get_feature_names_out())
Плюсы и минусы
✅ Преимущества:
- Захватывает информацию о локальном порядке слов
- Может представлять фразы и устойчивые словосочетания
❌ Недостатки:
- Проблема взрыва размерности более серьёзна
- По-прежнему не может обрабатывать дальние зависимости
Векторное представление слов
Принципы и реализация Word2Vec
Word2Vec — это метод векторного представления слов на основе нейронных сетей, предложенный Google в 2013 году.
Две архитектуры модели
- CBOW(Continuous Bag of Words): предсказывает текущее слово по контексту
- Skip-gram: предсказать контекст по текущему слову
Реализация кода
Пример
sentences = [["cat", "say", "meow"], ["dog", "say", "woof"]]
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)
# Получить векторы слов
vector = model.wv['cat']
# Найти похожие слова
similar_words = model.wv.most_similar('cat')
Особенности
- Низкоразмерные плотные векторы (обычно 50-300 измерений)
- Могут улавливать семантические и синтаксические связи между словами
- Поддерживает векторные операции (например, король - мужчина + женщина ≈ королева)
Векторы слов GloVe
GloVe (Global Vectors for Word Representation) объединяет преимущества глобальной статистической информации и локальных контекстных окон.
Ключевая идея
- На основе матрицы совместной встречаемости слов
- Цель оптимизации — сделать скалярное произведение двух векторов слов равным логарифму числа их совместных встречаемостей
Сравнение с Word2Vec
| Характеристика | Word2Vec | GloVe |
|---|---|---|
| Метод обучения | Локальное окно | Глобальная статистика |
| Вычислительная эффективность | Относительно высокая | Относительно низкий |
| Производительность на небольших наборах данных | Лучше | Среднее |
| Производительность на больших наборах данных | ОК | Лучше |
FastText
FastText — это модель векторного представления слов, разработанная Facebook, для которой характерен учёт информации о подсловах.
Основные возможности
- Представляет слова как набор символьных n-грамм
- Может обрабатывать слова вне словаря (OOV)
- Особенно подходит для языков с богатой морфологией
Пример кода
Пример
model = FastText(sentences, vector_size=100, window=5, min_count=1, workers=4)
# Даже слова, отсутствующие в словаре, могут получить векторы
vector = model.wv['unseenword']
Контекстно-зависимые представления
Модель ELMo
ELMo (Embeddings from Language Models) — один из самых ранних методов контекстно-зависимого представления слов.
Основные возможности
- На основе двунаправленных языковых моделей LSTM
- Представление слова зависит от всего входного предложения
- Генерирует многослойные представления (может объединять семантику на разных уровнях)
Схема архитектуры

BERT и его варианты
BERT (Bidirectional Encoder Representations from Transformers) — это предобученная языковая модель, предложенная Google.
Ключевые инновации
- Архитектура Transformer
- Цель обучения Masked Language Model (MLM)
- Задача Next Sentence Prediction (NSP)
Распространённые варианты
- RoBERTa: оптимизированная стратегия обучения
- DistilBERT: облегчённая версия BERT
- ALBERT: совместное использование параметров уменьшает размер модели
Пример кода
Пример
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
inputs = tokenizer("Привет, моя собака милая", return_tensors="pt")
outputs = model(**inputs)
last_hidden_states = outputs.last_hidden_state
Обзор предобученных языковых моделей
Современная NLP в основном использует парадигму предобучения + дообучения:
- Этап предобучения: обучение универсальных языковых представлений на крупномасштабных корпусах
- Этап дообучения: корректировка параметров модели на данных конкретной задачи
Сравнение моделей
| Модель | Время выпуска | Основные возможности |
|---|---|---|
| Word2Vec | 2013 | Статические векторы слов |
| GloVe | 2014 | Глобальная статистика + локальное окно |
| ELMo | 2018 | Двунаправленная LSTM, контекстно-зависимая |
| BERT | 2018 | Transformer, двунаправленный контекст |
| GPT-3 | 2020 | Однонаправленный трансформер, высокая способность к генерации |
Представления на уровне документа
Doc2Vec
Doc2Vec — это расширение Word2Vec, которое может напрямую изучать векторные представления документов.
Две модели
- PV-DM(распределённая память): аналогично CBOW, добавляет ID документа
- PV-DBOW(распределённый мешок слов): аналогично Skip-gram
Пример кода
Пример
from gensim.models.doc2vec import TaggedDocument
documents = [TaggedDocument(doc, [i]) for i, doc in enumerate(corpus)]
model = Doc2Vec(documents, vector_size=100, window=5, min_count=1, workers=4)
vector = model.infer_vector(["new", "document", "text"])
Векторы предложений и векторы документов
Общие методы
- Усреднение: взять среднее векторов слов
- SIF: сглаженное взвешенное среднее с обратной частотой
- BERT-векторы предложений: используйте токен [CLS] или усредните все векторы слов
Пример кода (с использованием Sentence-BERT)
Пример
model = SentenceTransformer('all-MiniLM-L6-v2')
sentences = ["This is an example sentence", "Each sentence is converted"]
embeddings = model.encode(sentences)
Тематическая модель (LDA)
Латентное размещение Дирихле (LDA) — это метод тематического моделирования без учителя.
Основные принципы
- Представляет документ как смесь нескольких тем
- Каждая тема — это распределение вероятностей по словам
- Обучается с помощью вариационного вывода или сэмплирования Гиббса
Пример кода
Пример
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
lda = LatentDirichletAllocation(n_components=2)
lda.fit(X)
Сценарии применения
- Кластеризация документов
- Рекомендация контента
- Суммаризация текста
Итог
Развитие методов представления текста прошло путь от простой статистики до глубокого обучения:
- Традиционные методы: Простые и эффективные, подходят для небольших наборов данных
- Векторы слов: Улавливают семантические связи, низкая размерность
- Модели с учётом контекста: Динамическое представление, лучшая производительность, но высокие вычислительные затраты
- Представление документа: расширяется от уровня слов до уровня документа
При выборе методов представления текста учитывайте:
- Требования задачи (нужно ли семантическое понимание)
- Масштаб данных
- Вычислительные ресурсы
- Языковые особенности
С развитием больших языковых моделей методы представления текста всё ещё быстро развиваются, но понимание этих фундаментальных методов остаётся критически важным для освоения NLP.
Другие расширения