Какие знаешь методы оценки сходства векторов в NLP?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Методы оценки сходства векторов в 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) для быстрого поиска похожих векторов в больших наборах данных.