Анализ семантической близости

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

1. Ранние статистические методы (1950–1970-е)

Косинусное сходство

  • Происхождение: Основано на теории векторных пространств (работы Германа Грассмана, XIX век).
  • Первое применение в NLP: В 1950-х для информационного поиска (Gerard Salton, Vector Space Model).
  • Пример: В 1960-х косинусная мера использовалась для сравнения документов в системе SMART (Cornell University).

Евклидово расстояние

  • Происхождение: Известно со времён Древней Греции (Евклид, «Начала»).
  • В статистике: Применялось Карлом Пирсоном (1900-е) для анализа корреляций.
  • В NLP: В 1970-х для кластеризации текстов (например, в алгоритме k-ближайших соседей).

Манхэттенское расстояние

  • Происхождение: Введено Германом Минковским (конец XIX века) как частный случай *L1-метрики*.
  • Применение: Использовалось в экономике и биологии до NLP (например, для анализа ДНК-последовательностей).

2. Эра матричных методов (1980–2000-е)

С появлением мощных компьютеров стали популярны матричные разложения:

SVD (Singular Value Decomposition)

  • 1988Latent Semantic Analysis (LSA) — применение SVD к матрице «термин-документ» для поиска скрытых тем.
  • Пример: Системы автоматического реферирования текстов.

Корреляция Пирсона

  • Использовалась в биоинформатике и психометрии, затем адаптирована для NLP.

3. Векторные представления слов (2000–2010-е)

Word2Vec (2013, Mikolov et al.)

  • Ввел косинусную близость как стандарт для сравнения эмбеддингов.
  • Пример: king – man + woman ≈ queen стал классикой.

GloVe (2014, Stanford)

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

FastText (2015, Facebook)

  • Учитывал морфологию слов, но сохранил косинусную метрику для близости.

4. Современные контекстные методы (2018–2024)

BERT и трансформеры

  • 2018: BERT использует косинусное сходство для сравнения контекстных эмбеддингов.
  • 2020-е: Метрики адаптируются под многомерные пространства (например, Poincaré Embeddings для иерархических данных).

Новые метрики

  • Wasserstein Distance: Для сравнения распределений (популярно в генеративных моделях).
  • ArcFace: В компьютерном зрении, затем перенесён в NLP для тонкой настройки эмбеддингов.

Эволюция в одной таблице

ПериодМетодыПрименение в NLP
1950–1970-еКосинусное, ЕвклидовоПоиск документов, кластеризация
1980–2000-еSVD, LSAТематическое моделирование
2000–2010-еWord2Vec, GloVeВекторные представления слов
2010–2024BERT, трансформерыКонтекстные эмбеддинги

Пример исторической преемственности:

  • В 1960-х косинусная мера сравнивала документы вручную.
  • В 2020-х та же метрика работает в ChatGPT для поиска семантически близких фраз.

Близость векторов = близость смысла

Если векторы слов a⃗a и b⃗b близки в векторном пространстве (например, косинусное сходство cos⁡(θ)≈1cos(θ)≈1), то слова семантически похожи.

Пример (Word2Vec/GloVe):

  • Вектор(«король») — вектор(«мужчина») + вектор(«женщина») ≈ вектор(«королева»)
  • Вектор(«Париж») — вектор(«Франция») + вектор(«Германия») ≈ вектор(«Берлин»)

Методы измерения близости

Чтобы компьютер понимал, что «кот» и «кошка» — близкие слова, а «кот» и «велосипед» — нет, используют методы измерения близости векторов. Разберём 3 главных способа с примерами.


1. Косинусное сходство

  • Игнорирует длину векторов, учитывает только направление.
    → Это важно, потому что частые слова (например, «и», «в») имеют длинные векторы, но не несут смысловой нагрузки.
  • Устойчиво к масштабированию.
    → Даже если векторы растянуты или сжаты, угол между ними остаётся прежним.

Пример:
Допустим, у нас есть векторы:

  • «кот» = [1, 2]
  • «кошка» = [2, 4] (удвоенный «кот»)
  • «велосипед» = [-1, 1]

Косинусное сходство:

  • sim(«кот», «кошка») = 1 (идеальное совпадение, хотя длины векторов разные).
  • sim(«кот», «велосипед») ≈ 0 (перпендикулярные направления).

Как работает:
Сравнивает угол между векторами. Чем меньше угол, тем ближе слова.

Пример:
Допустим, у нас есть 2D-векторы:

  • «кот» = [1.2, 0.8]
  • «кошка» = [1.3, 0.7]
  • «велосипед» = [-0.5, 0.2]

Считаем для «кот» и «кошка»:

Результат:

  • «кот» и «кошка» → 0.99 (почти идентичны).
  • «кот» и «велосипед» → -0.21 (противоположны по смыслу).

Когда использовать:
— Для поиска синонимов.
— В рекомендательных системах (например, Netflix определяет похожие фильмы).


2. Евклидово расстояние

Евклидово расстояние чувствительно к длине векторов, но его тоже можно применять, если:

  • Векторы нормализованы (длины приведены к 1). Тогда оно эквивалентно косинусному сходству.
  • Задача требует учёта частоты слов. Например, для сравнения документов по количеству ключевых терминов.

Пример:
Те же векторы после нормализации:

  • «кот» = [0.45, 0.89]
  • «кошка» = [0.45, 0.89]
  • «велосипед» = [-0.71, 0.71]

Евклидово расстояние:

  • d(«кот», «кошка») = 0 (идентичные векторы).
  • d(«кот», «велосипед») ≈ 1.4 (далеко).

Минус:
Без нормализации «кот» и «кошка» будут считаться разными, если один вектор длиннее другого.

Как работает:
Считает прямое расстояние между точками в пространстве. Чем меньше число, тем ближе слова.

Пример:
Те же векторы:

  • «кот» = [1.2, 0.8]
  • «кошка» = [1.3, 0.7]

Считаем:

Результат:

  • «кот» и «кошка» → 0.14 (очень близко).
  • «кот» и «велосипед» → 1.86 (далеко).

Когда использовать:
— Для кластеризации (например, группировка новостей по темам).
— В гео-приложениях (поиск ближайших кафе на карте).


3. Манхэттенское расстояние

Применяется редко, но может быть полезно:

  • Если данные разреженные (много нулей в векторах).
  • Для категориальных признаков (например, бинарные вектора «есть слово/нет слова»).

Пример:
Векторы для бинарного случая (1 = слово есть, 0 = нет):

  • Текст 1: «кот ест» → [1, 1, 0]
  • Текст 2: «кошка ест» → [1, 1, 0]
  • Текст 3: «велосипед» → [0, 0, 1]

Манхэттенское расстояние:

  • d(Текст 1, Текст 2) = 0 (одинаковые).
  • d(Текст 1, Текст 3) = 3 (максимальное отличие).

Как работает:
Считает сумму разниц по каждой координате (как движение по улицам Нью-Йорка).


Сравнение методов

МетодПлюсы для текстовМинусы для текстовКогда использовать?
Косинусное сходствоНе зависит от длины векторовЧувствителен к шуму в данныхПоиск синонимов, кластеризация
Евклидово расстояниеИнтуитивно понятноТребует нормализации векторовСравнение документов по частотам
МанхэттенскоеРаботает с разреженными даннымиНе учитывает семантику направленийБинарные признаки (например, спам-фильтр)

Какой метод выбрать?

  • Косинусное сходство — лучший выбор для большинства NLP-задач (поиск синонимов, тематическое моделирование).
  • Евклидово расстояние — подходит, если важно учитывать интенсивность признаков (например, частоту слов).
  • Манхэттенское — для специфических случаев (бинарные вектора, данные с выбросами).

Важно: Если векторы предварительно нормализованы (например, в BERT), косинусное и евклидово расстояние дадут одинаковый результат!

Примеры семантических связей

Тип близостиПримеры словПрименение
Синонимы«счастье» ≈ «радость»Поиск замены слов в тексте
Тематические«кофе» ≈ «чай» ≈ «напиток»Кластеризация документов
Контекстные«доктор» ≈ «врач» ≈ «медицина»Улучшение поисковых запросов
Функциональные«купить» ≈ «продать» ≈ «магазин»Анализ тональности отзывов

Визуализация (2D-пример)

Допустим, после уменьшения размерности (t-SNE/PCA) получаем:

[кот]____[собака]  
   \     /  
    [ест]  
     |  
   [рыбу]  

Интерпретация:

  • «Кот» и «собака» близки (домашние животные).
  • «Ест» связан с обоими.
  • «Рыбу» ближе к «кот», чем к «собака» (логично!).

Ограничения

  • Многозначность: Статические эмбеддинги (Word2Vec) не различают значения слова «ключ» (дверной vs музыкальный).
    Решение: BERT/ELMo (контекстные эмбеддинги).
  • Редкие слова: Для них векторы могут быть неточными.
    Решение: дообучение на доменных данных.
  • Культурные различия: «Футбол» в США (soccer) vs Европа (football).

Практическое применение

  • Поисковые системы: Расширение запросов синонимами.
  • Чат-боты: Понимание intent (например, «хочу купить» ≈ «ищу продавца»).
  • Модерация контента: Автоматическое обнаружение токсичных слов.

Прокрутить вверх