Ответ
В NLP сходство векторных представлений слов, предложений или документов — базовая операция. Выбор метрики зависит от свойств эмбеддингов и задачи (поиск, кластеризация, классификация).
Основные метрики, которые я применяю:
1. Косинусное сходство (Cosine Similarity) Наиболее популярная метрика для эмбеддингов (Word2Vec, GloVe, BERT). Измеряет косинус угла между векторами, игнорируя их длину. Диапазон: [-1, 1], где 1 — идентичное направление.
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
def cos_sim(vec_a, vec_b):
"""Вычисляет косинусное сходство между двумя векторами."""
dot_product = np.dot(vec_a, vec_b)
norm_a = np.linalg.norm(vec_a)
norm_b = np.linalg.norm(vec_b)
return dot_product / (norm_a * norm_b)
# Или с помощью sklearn
sim_matrix = cosine_similarity([vec1], [vec2])[0][0]
2. Евклидово расстояние (Euclidean Distance) Геометрическое расстояние между точками в пространстве. Чем меньше значение, тем ближе векторы. Чувствительно к длине векторов.
def euclidean_distance(vec_a, vec_b):
return np.linalg.norm(vec_a - vec_b)
3. Манхэттенское расстояние (Manhattan Distance, L1) Сумма абсолютных разностей по координатам. Более устойчиво к выбросам, чем евклидово.
def manhattan_distance(vec_a, vec_b):
return np.sum(np.abs(vec_a - vec_b))
4. Скалярное произведение (Dot Product) Простая мера, пропорциональная косинусному сходству и длинам векторов. Часто используется внутри attention-механизмов трансформеров.
dot_score = np.dot(vec_a, vec_b)
5. Специализированные метрики для предложений/документов
- WMD (Word Mover's Distance): Учитывает семантическое расстояние между отдельными словами в документах, используя эмбеддинги слов. Вычислительно дорогая.
- BERTScore: Оценивает сходство на основе контекстуальных эмбеддингов BERT, выравнивая токены.
Практическое применение: Для семантического поиска и определения тематической близости текстов я почти всегда использую косинусное сходство над усредненными или [CLS]-эмбеддингами из моделей типа Sentence-BERT, так как оно фокусируется на смысловом направлении, а не на величине вектора.