← Назад к вопросам

Какие знаешь методы оценки сходства векторов в NLP?

1.8 Middle🔥 71 комментариев
#NLP и обработка текста#Машинное обучение#Метрики и оценка моделей

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Методы оценки сходства векторов в NLP

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

1. Косинусное сходство (Cosine Similarity)

Это наиболее популярный метод в NLP. Измеряет угол между двумя векторами в многомерном пространстве:

from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

v1 = np.array([1, 2, 3])
v2 = np.array([4, 5, 6])

similarity = cosine_similarity([v1], [v2])[0][0]
print(f"Cosine similarity: {similarity:.4f}")  # 0.9746

Преимущества: инвариантен к масштабированию векторов, вычисляется за O(n), значение в диапазоне [-1, 1]. Недостатки: не учитывает абсолютные величины, может быть чувствителен к редким словам.

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

Меряет прямое расстояние между точками в пространстве:

from scipy.spatial.distance import euclidean

distance = euclidean(v1, v2)
print(f"Euclidean distance: {distance:.4f}")  # 8.6603

# Нормализация для получения сходства
similarity = 1 / (1 + distance)  # или exp(-distance)

Преимущества: интуитивен, учитывает абсолютные значения. Недостатки: зависит от масштаба, может быть неэффективен в высоких размерностях (curse of dimensionality).

3. Манхэттенское расстояние (Manhattan Distance)

Сумма абсолютных разностей координат:

from scipy.spatial.distance import cityblock

distance = cityblock(v1, v2)
print(f"Manhattan distance: {distance}")  # 9

Быстрее евклидова в высоких размерностях, но реже используется в NLP.

4. Скалярное произведение (Dot Product)

dot_product = np.dot(v1, v2)  # 32

Используется в нейросетях при вычислении attention механизма. Зависит от нормы векторов.

5. Расстояние Вассерштейна (Wasserstein Distance)

Для сравнения распределений слов в документах:

from scipy.stats import wasserstein_distance

distance = wasserstein_distance(v1, v2)

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

6. Расстояние Левенштейна (для текстов)

Для сравнения строк на уровне символов:

from difflib import SequenceMatcher

text1 = "hello"
text2 = "hallo"

similarity = SequenceMatcher(None, text1, text2).ratio()  # 0.8

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

Косинусное сходство — стандарт индустрии для векторов word embeddings (Word2Vec, GloVe, FastText). Хорошо работает для TF-IDF, BERT, и других.

Евклидово расстояние — используется в кластеризации (K-means), более чувствительно к различиям в величинах векторов.

Скалярное произведение — в attention механизмах трансформеров, требует нормализации для сравнимости.

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

В моей практике использую косинусное сходство как default для:

  • Поиска семантически похожих документов
  • Рекомендационных систем
  • Классификации текстов

Для специфических задач комбинирую несколько метрик: например, косинусное сходство + минимальное евклидово расстояние для фильтрации низкокачественных матчей.

В production я всегда кэширую уже вычисленные сходства и использую индексные структуры (FAISS, Annoy) для быстрого поиска похожих векторов в больших наборах данных.

Какие знаешь методы оценки сходства векторов в NLP? | PrepBro