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

Ответ

В 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, так как оно фокусируется на смысловом направлении, а не на величине вектора.

Ответ 18+ 🔞

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

Вот основные метрики, которые у меня в работе постоянно:

1. Косинусное сходство (Cosine Similarity) Это, бля, святая святых для всяких Word2Vec, GloVe и особенно BERT. Смысл в чём: меряем не длину векторов, а угол между ними. Если они смотрят в одну сторону — косинус равен единице, идеально. Если в противоположные — минус один, полная противоположность. Диапазон от -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) Ну это классика, геометрия 7-го класса, ёб твою мать. Просто считаешь расстояние между двумя точками в пространстве. Чем меньше число — тем ближе векторы. Но тут есть подвох: если векторы длинные, то и расстояние большое будет, даже если они семантически близки. Чувствительная метрика, бля.

3. Манхэттенское расстояние (Manhattan Distance, L1) Представь, что ты едешь по улицам Манхэттена — нельзя наискосок, только по перпендикулярам. Вот эта метрика так и работает: складывает абсолютные разницы по всем координатам. К выбросам покрепче, чем евклидова, но тоже не панацея.

4. Скалярное произведение (Dot Product) Самое простое, что можно придумать: перемножил покоординатно и сложил. Чем больше — тем лучше. Но, сука, оно зависит и от угла, и от длины векторов. Внутри attention-слоёв трансформеров это вообще хлеб насущный, там без него нихуя.

5. Специализированные метрики для предложений/документов Тут уже начинается магия посерьёзнее.

  • WMD (Word Mover's Distance): Это когда ты считаешь, как дорого будет перевезти слова из одного документа в другой, с учётом смысла каждого слова. Точная, но, бля, жрёт ресурсов, как не в себя — овердохуища вычислений.
  • BERTScore: Умная штука. Берёт контекстуальные эмбеддинги от BERT, пытается выровнять слова из эталонного и полученного текста и по ним сходство считать. Не всегда быстро, но часто метко.

А на практике что? Если тебе нужно семантическое сходство текстов — поиск, кластеризация — то в 95% случаев бери косинусное сходство по эмбеддингам, которые выжал из Sentence-BERT или просто усреднил. Потому что оно забивает хуй на длину документа и смотрит именно на смысловое направление. А это, в большинстве задач, самое важное. Всё остальное — уже для специфичных случаев, когда эта простая метрика не канает.