Ответ
В 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 или просто усреднил. Потому что оно забивает хуй на длину документа и смотрит именно на смысловое направление. А это, в большинстве задач, самое важное. Всё остальное — уже для специфичных случаев, когда эта простая метрика не канает.