Дистрибутивная семантика

Материал из MachineLearning.

Версия от 05:31, 17 июля 2026; Aleksandr Iakovlev (Обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск
Статья написана с использованием LLM GPT-5.6 Sol xhigh и проверено участником Aleksandr Iakovlev 09:31, 17 июля 2026 (MSD)


Содержание

Дистрибути́вная сема́нтика (англ. distributional semantics) — направление вычислительной лингвистики и машинного обучения, в котором значения языковых единиц моделируются по статистике их употребления в больших корпусах текстов. Слово, словосочетание или документ представляется вектором, а сходство значений связывается со сходством распределений по контекстам. Типичными реализациями служат матрицы совместной встречаемости, латентно-семантический анализ, предсказательные модели Word2vec и GloVe, а также контекстные представления языковых моделей.[1]

Дистрибутивная семантика — не отдельный алгоритм и не синоним эмбеддинга. Это семейство гипотез и способов извлекать семантическую информацию из употребления языка; эмбеддинг является одной из форм представления, а Word2vec — конкретным методом его обучения.

История и дистрибутивная гипотеза

Лингвистическая основа направления сложилась до появления современных компьютеров. Зеллиг Харрис в статье «Distributional Structure» (1954) определял распределение языкового элемента через совокупность окружений, в которых он встречается, и рассматривал структуру языка как систему ограничений на совместную встречаемость элементов.[1] Джон Руперт Фёрс сформулировал ставший широко известным принцип: «You shall know a word by the company it keeps!» («Слово познаётся по компании, в которой оно встречается»). В исходном тексте эта фраза относится к привычным коллокациям как к одному из уровней описания значения, а не утверждает, что значение исчерпывается соседними словами.[1]

В современной краткой формулировке дистрибутивная гипотеза утверждает, что языковые единицы со сходными распределениями по контекстам обычно имеют сходные семантические свойства. Это эмпирическая гипотеза, а не логическое тождество. Её конкретный смысл зависит от того, что считается единицей и контекстом: соседние слова, документы, синтаксические зависимости, шаблоны отношений или состояния нейронной модели.[1]

В информационном поиске матрицы «термин–документ» привели к латентно-семантическому анализу (LSA) на основе сингулярного разложения.[1] В корпусной лингвистике словесные ассоциации стали взвешивать взаимной информацией.[1] Позднее предсказательное обучение сделало плотные векторы массовым инструментом, сохранив контекст как источник обучающего сигнала.

Формальная постановка

Единицы и контексты

Пусть дан корпус D, множество целевых единиц W=\{w_1,\ldots,w_n\} и множество контекстных признаков C=\{c_1,\ldots,c_m\}. Для слова контекстом может быть:

  • симметричное окно из k токенов слева и справа;
  • только левая или правая часть окна;
  • документ, предложение или абзац;
  • слово, связанное заданным синтаксическим отношением;
  • лексико-синтаксический шаблон, связывающий пару сущностей.

Широкие окна чаще отражают тематическую связанность, а узкие окна и синтаксические признаки — функциональное сходство. На результат также влияют токенизация, регистр, лемматизация, границы предложений и порог частоты.

Матрица совместной встречаемости

Базовое представление задаётся матрицей X\in\mathbb{R}^{n\times m}, где

X_{ij}=n_D(w_i,c_j),

где n_D(w_i,c_j) — число появлений пары (w_i,c_j) в корпусе D.

Строка X_{i:} является разреженным вектором единицы w_i. Сырые частоты сильно зависят от общеязыковой частотности, поэтому их обычно преобразуют. Обозначим

N=\sum_{i,j}X_{ij},\quad p(w_i,c_j)=\frac{X_{ij}}{N},\quad p(w_i)=\frac{\sum_jX_{ij}}{N},\quad p(c_j)=\frac{\sum_iX_{ij}}{N}.

Поточечная взаимная информация (PMI) сравнивает наблюдаемую совместную вероятность с вероятностью при независимости:

{\rm PMI}(w,c)=\log\frac{p(w,c)}{p(w)p(c)}.

Положительная PMI отбрасывает отрицательные значения:

{\rm PPMI}(w,c)=\max({\rm PMI}(w,c),0).

PPMI усиливает характерные сочетания, но может переоценивать очень редкие пары; поэтому применяют пороги частоты, сглаживание распределения контекстов и сдвинутые варианты PMI.[1][1]

Сходство и понижение размерности

Наиболее распространённая мера близости двух ненулевых векторов — косинус:

\cos(\mathbf{x},\mathbf{y})=\frac{\mathbf{x}^{\mathsf T}\mathbf{y}}{\|\mathbf{x}\|_2\|\mathbf{y}\|_2}.

Косинус не зависит от общей длины вектора и удобен при различиях в частоте, хотя не устраняет все частотные и геометрические искажения.

Для получения плотных векторов матрицу M (например, TF–IDF или PPMI) можно аппроксимировать усечённым сингулярным разложением:

M\approx U_k\Sigma_kV_k^{\mathsf T},\qquad k\ll\min(n,m).

Строки U_k\Sigma_k^\alpha, где обычно 0\leq\alpha\leq1, служат низкоразмерными представлениями. В LSA исходной является матрица «термин–документ»; в лексических моделях чаще факторизуется матрица «слово–контекст». Метод главных компонент и другие методы факторизации решают родственные задачи сжатия, но различаются предположениями и предварительным взвешиванием.

Count-based и predictive-подходы

Счётные (англ. count-based) модели явно строят, взвешивают и при необходимости факторизуют матрицу частот. Сюда относятся word–context spaces, LSA и модели на синтаксических контекстах. Их признаки интерпретируемы, но разреженная матрица может быть дорогой в хранении и разложении.

Предсказательные (англ. predictive) модели обучают параметры на вспомогательной задаче предсказания. В Word2vec архитектура CBOW предсказывает центральное слово по окружению, а Skip-gram — слова окружения по центральному слову.[1] Для Skip-gram с отрицательным сэмплированием (SGNS) типичный вклад пары (w,c) в целевую функцию имеет вид

\log\sigma(\mathbf{v}_w^{\mathsf T}\mathbf{u}_c)+\sum_{r=1}^{q}\mathbb{E}_{c_r\sim P_n}\log\sigma(-\mathbf{v}_w^{\mathsf T}\mathbf{u}_{c_r}),

где q — число отрицательных примеров, P_n — шумовое распределение, \sigma — логистическая функция. GloVe, напротив, оптимизирует взвешенную ошибку приближения логарифмов глобальных счётчиков совместной встречаемости.[1] FastText расширяет Skip-gram суммой векторов символьных n-грамм и тем самым лучше обрабатывает морфологию и слова вне обучающего словаря.[1]

Различие между «подсчётом» и «предсказанием» не абсолютно. Систематическое сравнение показало сильные результаты предсказательных векторов на ряде лексико-семантических задач,[1] а последующий анализ установил, что SGNS неявно факторизует матрицу «слово–контекст» со значениями, близкими к сдвинутой PMI:

\mathbf{v}_w^{\mathsf T}\mathbf{u}_c\approx{\rm PMI}(w,c)-\log q.

Качество поэтому зависит и от корпуса, контекста, взвешивания, размерности и критерия оценки.

Композиционность

Векторы отдельных слов ещё не задают значение фразы или предложения. Простейшие композиционные функции складывают или усредняют векторы:

\mathbf{s}=\sum_{i=1}^{r}\alpha_i\mathbf{v}_{w_i},

либо используют покомпонентное умножение. Такие операции могут отражать общую тему, но слабо учитывают порядок слов, отрицание, область действия операторов и синтаксические роли. Взвешивание TF–IDF или SIF уменьшает влияние частых слов, а синтаксически чувствительные модели назначают разным частям речи матрицы, тензоры или функции. Эксперименты с аддитивной и мультипликативной композицией показали, что подходящая операция зависит от конструкции и задачи.[1]

Нейронные энкодеры и трансформеры реализуют нелинейную композицию: представление токена пересчитывается с учётом других позиций. Так дистрибутивный принцип расширяется от фиксированных векторов слов к функциям над целыми контекстами.

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

Статическая модель сопоставляет типу слова один вектор. Для многозначного слова он усредняет разные употребления: например, контексты финансового учреждения и берега реки смешиваются. Один из ранних способов решения — кластеризовать контексты слова и хранить несколько прототипов, выбирая нужный по текущему окружению.[1]

Контекстные эмбеддинги сопоставляют вектор не словарному типу, а конкретному вхождению:

\mathbf{h}_i=f_\theta(t_1,\ldots,t_L,i).

ELMo получает такие векторы из внутренних состояний двунаправленной языковой модели и прямо нацелено на вариативность употреблений и полисемию.[1] BERT обучает глубокие двунаправленные представления по задаче восстановления замаскированных токенов; одинаковая словоформа в разных предложениях поэтому получает разные состояния.[1] Статический вектор удобен как компактная словарная запись, а контекстный — когда важно конкретное употребление. Эти представления не взаимоисключающие: статический вектор можно получить усреднением контекстных состояний, а входной слой контекстной модели сам содержит обучаемые эмбеддинги токенов и позиций.

Ограничения

Дистрибутивная близость не тождественна ни синонимии, ни полной близости значений. Антонимы могут встречаться в одинаковых грамматических позициях; тематически связанные слова вроде «врач» и «больница» оказываются близкими без взаимозаменяемости. Результат зависит от жанра, времени, домена и языка корпуса. Редкие слова получают шумные оценки, а новые слова отсутствуют в словаре, если модель не использует подсловные признаки.

Текстовые распределения отражают социальные закономерности и стереотипы исходных данных. Исследования статических эмбеддингов показали, что в их геометрии могут воспроизводиться гендерные ассоциации корпуса; использование таких представлений в прикладной системе требует отдельного аудита данных, метрик и последствий.[1]

Совместная встречаемость описывает отношения внутри языка, но сама по себе не даёт сенсомоторного опыта и привязки символов к объектам мира. Поэтому дистрибутивные модели полезны как эмпирические представления употребления, но не являются исчерпывающей теорией значения.[1]

Оценка качества

Методы оценки делятся на несколько групп.

  • Внутренние тесты сравнивают косинусные близости с человеческими оценками сходства или связанности, проверяют ближайших соседей, кластеризацию, категоризацию и векторные аналогии. Набор SimLex-999 специально отделяет собственно сходство от простой ассоциации.[1]
  • Внешняя оценка измеряет вклад представлений в целевую задачу: поиск, классификацию, извлечение сущностей и отношений, анализ тональности, машинный перевод или ответы на вопросы. Она ближе к применению, но смешивает качество представления с архитектурой, объёмом обучения и настройкой всей системы.
  • Диагностическая оценка проверяет отдельные свойства — морфологию, синтаксис, значения в контексте, устойчивость к частотным сдвигам, доменам и социальным группам.

Одна метрика не даёт универсального рейтинга: небольшие списки слов чувствительны к составу и субъективности разметки, а внутренний результат не гарантирует улучшения прикладной задачи.[1] Сравнение должно фиксировать корпус, предобработку, словарь, размерность и гиперпараметры.

Применения

Дистрибутивные модели применяются для поиска связанных терминов, расширения запросов, построения тезаурусов, кластеризации, разрешения неоднозначности, извлечения отношений и измерения семантического сдвига. В семантическом поиске запросы и документы сравниваются в общем пространстве; в классификации векторы служат признаками, а в лексикографии характерные контексты дополняют ручной анализ. Turney и Pantel группируют приложения по матрицам «термин–документ», «слово–контекст» и «пара–шаблон».[1]

Воспроизводимый пример

Пример без внешних библиотек строит симметричные контексты радиуса 2, вычисляет PPMI и косинус. Игрушечные пары «кот/кошка» и «собака/пёс» имеют одинаковые окружения.

from collections import Counter, defaultdict
from math import log, sqrt
 
corpus = [
    "кот ест рыбу", "кошка ест рыбу",
    "кот пьёт молоко", "кошка пьёт молоко",
    "собака грызёт кость", "пёс грызёт кость",
    "собака охраняет дом", "пёс охраняет дом",
]
window = 2
pairs, words, contexts = Counter(), Counter(), Counter()
 
for sentence in corpus:
    tokens = sentence.split()
    for i, word in enumerate(tokens):
        left, right = max(0, i-window), min(len(tokens), i+window+1)
        for j in range(left, right):
            if i == j:
                continue
            context = tokens[j]
            pairs[word, context] += 1
            words[word] += 1
            contexts[context] += 1
 
N = sum(pairs.values())
ppmi = defaultdict(dict)
for (word, context), n in pairs.items():
    pmi = log((n/N) / ((words[word]/N) * (contexts[context]/N)))
    ppmi[word][context] = max(pmi, 0.0)
 
def cosine(a, b):
    keys = set(ppmi[a]) | set(ppmi[b])
    dot = sum(ppmi[a].get(k, 0) * ppmi[b].get(k, 0) for k in keys)
    na = sqrt(sum(x*x for x in ppmi[a].values()))
    nb = sqrt(sum(x*x for x in ppmi[b].values()))
    return dot / (na * nb)
 
for a, b in [("кот", "кошка"), ("собака", "пёс"), ("кот", "собака")]:
    print(a, b, f"{cosine(a, b):.3f}")

Результат:

кот кошка 1.000
собака пёс 1.000
кот собака 0.000

Пример демонстрирует механизм, но не доказывает синонимию: в реальном корпусе вывод зависит от размера и состава данных, предобработки, определения контекста и сглаживания редких событий.

См. также

Литература