Методы представления текста

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

В этой статье систематически рассматриваются часто используемые методы представления текста в NLP — от традиционных методов до современных методов глубокого обучения, что помогает читателям полностью понять эту ключевую концепцию.


Традиционное представление текста

Модель мешка слов

Модель мешка слов — один из простейших методов представления текста; она рассматривает текст как неупорядоченный набор слов.

Базовые понятия

  • Игнорирует порядок слов и грамматику, учитывает только наличие слов
  • Создайте словарь и подсчитайте вхождения каждого слова в документе
  • Итоговое представление — многомерный разреженный вектор

Пример кода

Пример

from sklearn.feature_extraction.text import CountVectorizer

корпус = [
    'Это первый документ.',
    'Этот документ — второй документ.',
    'И это третий.',
    'Это первый документ?'
]

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

Реализация кода

Пример

from sklearn.feature_extraction.text import TfidfVectorizer

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-грамма): комбинация трёх последовательных слов

Пример кода

Пример

bigram_vectorizer = CountVectorizer(ngram_range=(2, 2))
X_bigram = bigram_vectorizer.fit_transform(corpus)
print(bigram_vectorizer.get_feature_names_out())

Плюсы и минусы

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

  • Захватывает информацию о локальном порядке слов
  • Может представлять фразы и устойчивые словосочетания

❌ Недостатки:

  • Проблема взрыва размерности более серьёзна
  • По-прежнему не может обрабатывать дальние зависимости

Векторное представление слов

Принципы и реализация Word2Vec

Word2Vec — это метод векторного представления слов на основе нейронных сетей, предложенный Google в 2013 году.

Две архитектуры модели

  1. CBOW(Continuous Bag of Words): предсказывает текущее слово по контексту
  2. Skip-gram: предсказать контекст по текущему слову

Реализация кода

Пример

from gensim.models import Word2Vec

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)
  • Особенно подходит для языков с богатой морфологией

Пример кода

Пример

from gensim.models import FastText

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)

Распространённые варианты

  1. RoBERTa: оптимизированная стратегия обучения
  2. DistilBERT: облегчённая версия BERT
  3. ALBERT: совместное использование параметров уменьшает размер модели

Пример кода

Пример

from transformers import BertTokenizer, BertModel

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 в основном использует парадигму предобучения + дообучения:

  1. Этап предобучения: обучение универсальных языковых представлений на крупномасштабных корпусах
  2. Этап дообучения: корректировка параметров модели на данных конкретной задачи

Сравнение моделей

Модель Время выпуска Основные возможности
Word2Vec 2013 Статические векторы слов
GloVe 2014 Глобальная статистика + локальное окно
ELMo 2018 Двунаправленная LSTM, контекстно-зависимая
BERT 2018 Transformer, двунаправленный контекст
GPT-3 2020 Однонаправленный трансформер, высокая способность к генерации

Представления на уровне документа

Doc2Vec

Doc2Vec — это расширение Word2Vec, которое может напрямую изучать векторные представления документов.

Две модели

  1. PV-DM(распределённая память): аналогично CBOW, добавляет ID документа
  2. PV-DBOW(распределённый мешок слов): аналогично Skip-gram

Пример кода

Пример

from gensim.models import Doc2Vec
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"])

Векторы предложений и векторы документов

Общие методы

  1. Усреднение: взять среднее векторов слов
  2. SIF: сглаженное взвешенное среднее с обратной частотой
  3. BERT-векторы предложений: используйте токен [CLS] или усредните все векторы слов

Пример кода (с использованием Sentence-BERT)

Пример

from sentence_transformers import SentenceTransformer

model = SentenceTransformer('all-MiniLM-L6-v2')
sentences = ["This is an example sentence", "Each sentence is converted"]
embeddings = model.encode(sentences)

Тематическая модель (LDA)

Латентное размещение Дирихле (LDA) — это метод тематического моделирования без учителя.

Основные принципы

  • Представляет документ как смесь нескольких тем
  • Каждая тема — это распределение вероятностей по словам
  • Обучается с помощью вариационного вывода или сэмплирования Гиббса

Пример кода

Пример

from sklearn.decomposition import LatentDirichletAllocation
from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
lda = LatentDirichletAllocation(n_components=2)
lda.fit(X)

Сценарии применения

  • Кластеризация документов
  • Рекомендация контента
  • Суммаризация текста

Итог

Развитие методов представления текста прошло путь от простой статистики до глубокого обучения:

  1. Традиционные методы: Простые и эффективные, подходят для небольших наборов данных
  2. Векторы слов: Улавливают семантические связи, низкая размерность
  3. Модели с учётом контекста: Динамическое представление, лучшая производительность, но высокие вычислительные затраты
  4. Представление документа: расширяется от уровня слов до уровня документа

При выборе методов представления текста учитывайте:

  • Требования задачи (нужно ли семантическое понимание)
  • Масштаб данных
  • Вычислительные ресурсы
  • Языковые особенности

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

Другие расширения