Косинусная близость — это мера сходства между двумя векторами, которая вычисляется на основе косинуса угла между ними, или, что эквивалентно, скалярное произведение между их нормализациями. Она широко используется в различных областях – обработка естественного языка, информационный поиск и рекомендательные системы, для определения степени похожести текстов, документов или других объектов, представленных в векторном виде.
Фактический анализ доступных исходников кода свидетельствует о том, что Google использует скалярное произведение нормализованных векторов для вычисления сходства.
Если векторы нормализуются до единичной длины (величина = 1), скалярное произведение математически эквивалентно косинусному подобию.
Косинусное подобие = (A·B) / (|A|·|B|)
Когда |A| = |B| = 1 (нормализованные векторы), это упрощается до:
Косинусное подобие = A·B = скалярное произведение
Таким образом, код эффективно реализует косинусное подобие следующим образом:
Обеспечение нормализации всех векторов до единичной длины
Вычисление скалярного произведения между этими нормализованными векторами
Этот подход вычислительно более эффективен, чем вычисление полной формулы косинусного подобия, потому что исключает операцию деления с тем же результатом.
Представьте два вектора, исходящих из начала координат. Косинус угла между ними отражает, насколько эти векторы направлены в одну сторону. Значение косинусной близости находится в диапазоне от -1 до 1:
1означает полное совпадение векторов (угол между ними равен 0 градусов).
0означает, что векторы ортогональны, то есть никак не связаны между собой (угол между ними равен 90 градусов).
-1означает, что векторы направлены в противоположные стороны (угол между ними равен 180 градусов).
Формула для расчета косинусной близости
cos(θ) = (A • B) / (||A|| * ||B||)
где:
AиB— векторы, близость которых нужно вычислить.
•— скалярное произведение векторов.
||A||и||B||— длины (модули) векторов A и B соответственно.
Пример использования для сравнения текстов
Представим два предложения, которые мы хотим сравнить:
Предложение 1: “Я люблю читать книги.”
Предложение 2: “Чтение книг доставляет мне удовольствие.”
Каждое предложение можно преобразовать в вектор, используя, например, метод “Мешок слов (Bag of Words)”, где каждый элемент вектора соответствует слову, а его значение отражает частоту встречаемости этого слова в предложении. Затем, вычисляя косинус угла между векторами, можно определить степень смысловой близости предложений.
Косинусная близость — это мощный инструмент для определения сходства между объектами, представленными в векторном пространстве. Благодаря своей простоте и эффективности, она нашла широкое применение в различных областях, связанных с анализом данных и машинным обучением.
Зависимость качества анализа от выбранной модели векторизации
Зависимость критическая. Выбор модели векторизации влияет на результат косинусной близости сильнее, чем выбор самого метода (косинус vs евклид, например). В SEO это означает: одна модель покажет два запроса почти идентичными (порог >0.9), другая — едва связанными (<0.4). Без понимания, какая модель под капотом, любые выводы о семантической кластеризации будут случайными.
Модели на основе мешка слов (TF‑IDF, CountVectorizer)
Как считают близость: по пересечению общих слов.
Влияние на косинус: высокочастотные стоп-слова и общие термины доминируют. Синонимы («авто» и «машина») дадут 0.0, если их нет в словаре.
SEO-последствия: непригодны для синонимии, зато хорошо находят технические дубли (когда тексты почти одинаковы лексически).
Статические эмбеддинги (Word2Vec, FastText, GloVe) с усреднением токенов
Как считают: каждое слово → вектор, затем среднее арифметическое всех слов в тексте.
Потеря порядка слов полностью (инвертированный смысл не различить).
Размывание редких терминов общими словами. Если документ длинный, вектор «съезжает» в среднюю тему.
Проблема отрицаний («не дорогой» будет близок к «дорогой», потому что вектор «не» усредняется с остальными).
Пример. Запросы «дешевый ноутбук» и «дорогой ноутбук» получат почти одинаковые векторы (разница только в векторах «дешевый»/«дорогой», которые могут быть коллинеарны в некоторых моделях). Косинусная близость покажет 0.95 — ошибка интента.
Контекстуальные модели (BERT, SBERT, RuBERT, LaBSE)
Как считают: вектор предложения строится с учетом окружения каждого токена (self-attention). Порядок слов, отрицания, омонимия учитываются.
Плюсы для SEO:
Различают «собака укусила человека» и «человек укусил собаку».
Понимают «не дорогой» как антоним к «дорогой».
Минусы для косинуса:
Огромная размерность (768–1024). В такой размерности почти любые два случайных текста имеют косинус 0.3–0.5. Трудно найти четкий порог кластеризации.
Чувствительность к длине: короткий запрос и длинный документ сравниваются плохо — вектор документа усредняет множество контекстов, а запрос точечен.
Вычислительная сложность при массовом сравнении (O(n²) для всех пар страниц сайта).
«Гибридные» решения: Ada-002 и EmbeddingGemma
Модели вроде OpenAI text-embedding-ada-002 и Google EmbeddingGemma — мощные embedding-модели, построенные на архитектурах больших языковых моделей, но сфокусированные на создании плотных векторных представлений текста.
Их ключевые особенности в сравнении с контекстуальными моделями (BERT, SBERT):
Характеристика
Контекстуальные модели (BERT, SBERT)
«Гибридные» модели (Ada-002, EmbeddingGemma)
Размерность
Относительно невысокая (384–768)
Высокая (Ada-002: 1536, EmbeddingGemma: настраивается 128–768)
Хороший баланс скорости и качества для средних задач
Превосходное качество для тонкой семантической близости, особенно в больших масштабах
Главный минус для SEO
Могут «размывать» редкие, но важные сигналы в очень больших текстах
Высокая вычислительная сложность, проблема «концентрации» векторов (о ней ниже), как правило, проприетарные / платные
Особенности гибридных моделей векторизации
Преимущества
Высокое качество семантики. Обе модели показывают одни из лучших результатов в индустрии. EmbeddingGemma занимает первое место в бенчмарке MTEB (Massive Text Embedding Benchmark) среди моделей с размером до 500M параметров, превосходя многих конкурентов.
Многоязычность: огромный плюс для SEO на международных проектах. EmbeddingGemma поддерживает более 100 языков, а Ada-002 также отлично справляется с этой задачей.
Эффективность: EmbeddingGemma создавалась с прицелом на запуск на устройствах. Её можно запустить с потреблением менее 200 МБ оперативной памяти (в квантизованном виде), что делает её доступной для анализа на локальных машинах без постоянного доступа к API.
Недостатки
Несмотря на их мощь, есть несколько весомых недостатков. Их использование в SEO — это «тяжелая артиллерия» со своими правилами.
«Проклятие размерности» и концентрация векторов. Чем выше размерность вектора (например, 1536 у Ada-002), тем больше пространство, и все векторы стремятся быть почти ортогональными. Это приводит к парадоксу: случайные тексты могут иметь косинусную близость никогда не ниже 0.7. Это размывает границы между «слегка похож» и «очень похож», делая выбор универсального порога кластеризации практически невозможным без сложного ML-пайплайна.
Цена и доступность. Использование Ada-002 требует оплаты API OpenAI, а развертывание EmbeddingGemma, хоть и бесплатно, требует определенных инженерных ресурсов. Для базовых SEO-задач это может быть избыточно.
Проблема «переобученности». Эти модели могут быть настолько хороши в улавливании глобального контекста, что начнут находить семантические связи там, где SEO-специалисту нужно разделение (например, «займ» и «кредит» могут быть слишком близки, хотя это разные продукты для разных ЦА).
Как косинусная близость используется поисковыми системами
Поисковые системы используют косинусную близость, чтобы измерять смысловую схожесть между поисковым запросом и проиндексированными документами, а также между запросом и профилем пользователя. Это ключевой элемент для современного семантического поиска и персонализации выдачи. В основе работы современных поисковых систем лежит преобразование текстов (запросов, веб-страниц) в многомерные векторные представления — эмбеддинги. Косинусная близость — это просто метрика для сравнения таких векторов. В базовом виде этот процесс выглядит так:
Векторизация: система переводит поисковый запрос и все документы в векторное пространство.
Вычисление близости: для каждого документа считается косинусное расстояние между его вектором и вектором запроса.
Ранжирование: результаты сортируются в порядке убывания косинусной близости, и пользователь видит наиболее семантически подходящие страницы.
Самые известные модели Google, использующие эти принципы:
RankBrain (2015): Первая нейросеть Google, которая научилась связывать запросы с контекстом, обрабатывая 15% новых запросов.
BERT (2019): Позволил учитывать контекст и порядок слов, что особенно важно для длинных и сложных запросов.
MUM (2021): Мультимодальная модель, которая понимает не только текст, но и изображения, и может работать с запросами на разных языках.
Персонализация на базе косинусной близости профиля пользователя и документа в веб
Косинусная близость также лежит в основе персонализации — когда результаты поиска подстраиваются под конкретного пользователя. Главный архитектурный паттерн для этого — «двухбашенная модель» (two-tower model):
Башня пользователя (User Tower): анализирует поведение человека (историю запросов, клики, просмотры) и формирует динамичный вектор пользователя, который меняется с течением времени.
Башня документа (Document/Item Tower): анализирует содержимое веб-страниц и формирует их статичные векторные представления.
На этапе ранжирования поисковая система может комбинировать два показателя:
Релевантность запросу (Query Relevance): насколько страница близка к поисковому запросу.
Персонализация (Profile Relevance): насколько страница близка к векторному профилю пользователя.
Итоговая оценка формируется, например, простым сложением этих двух показателей. В более старых системах это называлось LCR (Latent Collaborative Retrieval), где запрос, профиль пользователя и документы приводились к общей размерности. Более современные реализации — это и есть «двухбашенные» модели, используемые в рекомендательных системах и поиске.
Профиль пользователя — это сложная конструкция. В патенте Google 2020 года (US10839029B2) описано создание многофакторного профиля, который включает:
Термины (Term-based): ключевые слова из поисковых запросов и посещенных страниц.
Категории (Category-based): тематические категории, к которым пользователь проявляет интерес.
Ссылки (Link-based): предпочитаемые пользователем домены и сайты.
Преимущества использования косинусной близости в поисковых системах
Учет семантической близости. Даже если документы не содержат точных слов из запроса, косинусная близость позволяет определить их релевантность на основе общих терминов и контекста.
Независимость от длины документа. Косинусная близость нормализует длину векторов, что позволяет сравнивать документы разной длины без искажений – например, можно сопоставить поисковый запрос и весь текст посадочной страницы на сайте.
Косинусная близость используется для оценки релевантности не только текстовых данных, но и соответствия контента профилю пользователя (персонализация результатов поиска), оценки тематичности, спамности и т.п.
Эффективность. Существуют алгоритмы, позволяющие быстро вычислять косинусную близость для больших наборов данных.
Таким образом, косинусная близость является важным инструментом в арсенале современных поисковых систем, помогая им понимать смысл запросов пользователей и находить наиболее релевантную информацию.
Диаграмма кластеризации контента, доступная в меню «Визуализации», представляет собой двухмерную визуализацию URL-адресов, полученных в результате сканирования, которые были построены и сгруппированы на основе данных эмбеддингов.
Недостатки метода
В SEO, где цена ошибки высока (трафик, ранжирование), у метода сравнения семантики текстов на косинусной близости векторов есть ряд серьезных недостатков. Рассмотрим основные.
Проблема «Банана и Обезьяны» (частотные и редкие слова)
В учебниках по обработке естественного языка (NLP) с 1970-х годов приводится классический пример, демонстрирующий сложность понимания языка компьютером. Он основан на двух фразах: «Мы отдали бананы обезьянам, потому что они были голодные» и «Мы отдали бананы обезьянам, потому что они были перезрелыми». Синтаксически эти фразы абсолютно одинаковы. Однако местоимение «они» в первом случае относится к обезьянам, а во втором — к бананам. Чтобы это понять, компьютеру нужны знания о мире (обезьяны могут быть голодными, а бананы — перезрелыми). Это и есть та самая проблема, которую в NLP называют проблемой бананов и обезьян.
Косинусная мера оценивает угол между векторами. Если оба текста содержат одно высокочастотное слово (например, «купить», «цена», «сайт»), они будут считаться похожими, даже если их смысл противоположен. В результате система ошибочно объявляет запросы похожими там, где они различны по смыслу. Это образное название эффекта, когда косинусная мера близости переоценивает сходство текстов из-за доминирования высокочастотных общих слов и недооценивает редкие, но семантически важные различия.
Пример. Запросы «Купить диван недорого» и «Продать диван дорого» будут иметь высокую косинусную близость из-за общих слов «диван» и общих бытовых глаголов, хотя это разные интенты (коммерческая vs транзакционная, но с разным вектором действия).
Игнорирование порядка слов (Bag of Words)
Стандартные эмбеддинги (Word2Vec, GloVe, среднее по токенам) или TF-IDF теряют синтаксис. Косинусная близость не видит разницы между прямым и инвертированным порядком слов.
Пример. «Собака укусила человека» и «Человек укусил собаку» могут дать почти идентичные векторы. Для поисковых систем это критично, для косинусной близости — нет.
Чувствительность к «шумовым» токенам
Стоп-слова (предлоги, союзы) и модальные глаголы раздувают вектор, но не несут смысла. Предобработка (лемматизация, стоп-листы) решает проблему лишь частично. В SEO-анализе это приводит к ложным кластерам, где страницы объединяются из-за шаблонных фраз («в нашем интернет-магазине», «официальный сайт»), а не из-за темы.
Проклятие размерности и редкие семантические поля
Чем выше размерность эмбеддинга (BERT, SBERT — 768 или 1024), тем больше векторы стремятся к ортогональности. На больших размерностях почти любые два случайных текста кажутся «умеренно похожими» (значения 0.3–0.5).
Последствие для SEO: вы не можете установить универсальный порог кластеризации. То, что работает для категории «мебель», провалится для категории «юридические документы», где термины почти уникальны.
Проблема мультиинтента (длинные тексты vs короткие запросы)
В SEO часто сравнивают короткий запрос пользователя (1-3 слова) и длинный документ (2000 слов). Косинусная близость в этом случае ненадежна:
Вектор документа усредняет все темы, размывая фокус.
Запрос «точечно» близок к одному абзацу, но из-за усреднения документ может оказаться ближе к другому запросу.
Несимметричность смыслов (False Symmetry)
Косинусная мера симметрична: A так же похож на B, как B на A. В SEO это не работает.
«Автомобиль» в многомерном пространстве смыслов близок к «Тесла».
«Тесла» НЕ похожа на «Автомобиль» в том же смысле (Тесла — это еще и ученый, и компания, и единица измерения).
Результат: Вы можете ошибочно склеить категорию «автомобили» с брендом «Тесла», потеряв различие между общим и частным, если будете использовать алгоритмическую кластеризацию без опоры на поисковую выдачу, только на эмбеддингах.
Игнорирование авторитетности и CTR-сигналов (чистая семантика)
Вероятно, это главный недостаток для SEO. Косинусная близость смотрит только на вектор текста. Она не знает, что страница с низкой семантической близостью к запросу может ранжироваться лучше, потому что на нее ведут 1000 ссылок или у нее высокий поведенческий фактор.
Ошибка SEO-специалиста: удаление или склейка страниц, которые кажутся семантически похожими, но обе приносят трафик из-за разных целевых аудиторий или гео.
Расплывчатость границ кластеров (нет «черных» и «белых»)
В отличие от ранжирования в выдаче, где есть TOP-10, у косинусной близости нет жесткого порога. Значение 0.68 может означать синонимию в одной нише и полную разницу — в другой. Это требует ручной настройки порогов для каждой тематической сетки, что убивает автоматизацию.
Текстово-семантический анализ с косинусной близостью на Python
Этот пример демонстрирует, как SEO-специалист может использовать косинусную близость для анализа текстовой семантики двух страниц сайта.
Шаг 1. Импорт необходимых библиотек:
import nltk
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
nltk.download('punkt')
nltk.download('stopwords')
Шаг 2. Получение текстового контента страниц:
# Здесь нужно заменить "url1" и "url2" на реальные адреса страниц сайта.
# Функция get_text_from_url не приведена, так как способ получения текста с сайта
# может варьироваться (парсинг, API и т.д.).
text1 = get_text_from_url("url1")
text2 = get_text_from_url("url2")
Шаг 3. Предобработка текста:
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
stop_words = set(stopwords.words('russian'))
def preprocess_text(text):
text = text.lower()
tokens = word_tokenize(text)
tokens = [word for word in tokens if word.isalnum() and word not in stop_words]
return " ".join(tokens)
processed_text1 = preprocess_text(text1)
processed_text2 = preprocess_text(text2)
Значение косинусной близости будет находиться в диапазоне от 0 до 1.
Ближе к 1:Высокая семантическая близость текстов на страницах. Это может свидетельствовать о дублировании контента или о том, что страницы охватывают очень схожие темы.
Ближе к 0:Низкая семантическая близость, что указывает на то, что страницы, вероятно, относятся к разным темам.
Косинусное подобие учитывает угол, но не длину векторов. И если мы используем вложения, где величина является полезным элементом представления текста, результаты оценки будут некорректны.
Работа с косинусной близостью векторных вложений в практике SEO
Большинство задач, связанных с вычислением косинусной близости векторов, можно решить с помощью привычного всем инструментария – Screaming Frog SEO Spider, работающим в связке с ИИ-моделями. Вы можете использовать как доступ по API, так и локальные модели, подключенные с помощью LM Studio и аналогичного инструментария.
Вы можете подключить модель вложений локально, с помощью LM Studio или Ollama
Список таких задач:
Выявление дублирующегося и похожего контента. Найдите точные и почти идентичные страницы, которые могут пересекаться по тематике, неоднократно освещать одну и ту же тему, вызывать каннибализацию или просто приводить к неэффективности сканирования и индексирования.
Выявление нерелевантного контента, не соответствующего теме: обнаружение страниц, отклоняющихся от общей тематики или направленности контента на сайте.
Визуализация кластеров контента: просматривайте закономерности и взаимосвязи в контенте вашего веб-сайта, где семантически схожий контент сгруппирован, а аномальные элементы изолированы.
Определение семантически близких страниц, которые стоило бы перелинковать для усиления тематического кластера.
Дополнительные шаги для SEO-специалиста
Визуализация матрицы косинусной близости для анализа большого количества страниц.
Кластеризация страниц на основе косинусной близости для определения групп схожих тем.
Анализ ключевых слов с наибольшим вкладом в косинусную близость.
Резюме
Косинусная близость – это всего лишь один из инструментов для анализа текстов. Важно интерпретировать результаты в контексте конкретного сайта и его целей.
Специализированные embedding-модели (BERT, SBERT) — это ваш надежный рабочий инструмент для повседневных задач. Они понятны, предсказуемы и дают хороший баланс между качеством и скоростью. «Гибридные» модели (Ada-002, EmbeddingGemma) — это мощный, но более сложный инструмент. Их стоит применять, когда:
Нужно извлечь максимально возможную семантическую близость.
Вы работаете со сложными, запутанными текстами (например, юридическими или медицинскими).
Вы готовы инвестировать время в настройку порогов близости и управление вычислительными затратами.