Кластеризация как база SEO: пересматриваем практику

Оптимизация сайта начинается с оценки и проработки его структуры. Это обязательное условие, без которого SEO не существует. Вы можете прорабатывать какие-то вторичные сигналы, пытающиеся доказать поисковой системе, что сайт стоит считать серьёзным источником информации, но неоптимизированная структура сайта надёжно обнулит все усилия.

Рассмотрим основные вопросы, методы и подходы к оптимизации структуры сайта.

Рутинная картинка с рутинным роботом выполняющим рутинную работу
Рутинная картинка с рутинным роботом выполняющим рутинную работу

Тематика, коллекция и документ

Современные поисковые алгоритмы основаны на нейросетях. Как работает нейросеть? – На вход она получает огромные массивы неструктурированной информации, «белый шум». Её задача – в соответствии с заданным алгоритмом обнаружить в этом шуме какие-то паттерны, последовательности, найти связанные объекты и установить характер этих связей, отсекая всё лишнее. Если говорить об информационном поиске, то крупнейшими объектами всей информационной структуры будут тематики.

И у Google, и у Яндекс есть собственные тематические классификаторы, объединяющие всю доступную информацию в достаточно строгий граф. Структура этого графа определяется существующими онтологиями (систематизированными базами знаний), семантическими связями, и в неменьшей мере – накопленными историческими и пользовательскими данными, уточняющими связи объектов этого графа.

Благодаря разбиению всей информации на тематики, поисковая система может быстро связать пользовательский запрос с конкретной тематикой и отфильтровать всё, что не имеет отношения к этому запросу.

Сайт в этом смысле рассматривается как коллекция документов, каждый из которых представляет собой какой-то узел веб-графа, соответствующий существующей в базе данных поисковой системы структуре. Если важный узел отсутствует – соответствие коллекции типовому графу снижается. Вы не можете претендовать на высокие позиции по запросу «русская литература 19 века», если в вашем графе знаний нет узла «Лев Толстой», а у узла «Лев Толстой» нет вспомогательной ноды «Война и мир». Та же схема работает и для коммерческой структуры: если у продавца нет «Корзины» и информации об оплате, сайт не может рассматриваться как интернет-магазин в нише b2c, максимум – это каталог b2b.

Важно понимать, что изначально классификации создавались вручную, и этим классификация отличается от кластеризации, которая представляет собой обучение без учителя: алгоритм просто определяет группировки по силе связей, векторной близости и т.п. Почему это важно? – Существующая классификация может не соответствовать результатам кластеризации, какой бы алгоритм ни использовался.

Сайт, отнесённый к определенному домену знаний, не будет рассматриваться как часть другого домена знаний. Это очень важный момент: в попытке привлечь больше трафика за счёт смежных тематик, некоторые оптимизаторы трансформируют сайт в нечто, не относящееся ни к чему, ослабляя позиции в уже присвоенной теме. Другой случай: формируются связи с темой, в которой сайт не имеет никакой авторитетности. Это также едва ли пойдёт на пользу продвижению.

Крайне важно при аудите сайта и разработке стратегий продвижения учесть, к какой категории относится сайт, определить требования поисковых систем к этой категории и оценить степень соответствия. Поскольку речь идёт об уровне классификации, отталкиваться можно от существующих официальных классификаторов, документации с рекомендациями к заданной нише, усредненным данным по топам выдачи. Именно на этом этапе используются сервисы-классификаторы, составление табличек с особенностями сайтов в топе, определяются самые весомые поисковые сущности в нише и т.п. Но это – лишь часть процесса. Вторая часть – это практики, основанные на кластеризации. К ним и перейдём.

Как кластерный анализ применяется поисковыми системами

Кластеризация применяется для решения множества задач, делающих поиск информации более быстрым, релевантным и удобным для пользователя.

Судя по выдаче, "ягуар" - это вовсе не о любимом напитке девочек-эмочек начала 2к
Судя по выдаче, "ягуар" - это вовсе не о любимом напитке девочек-эмочек начала 2к

Вот некоторые из ключевых областей применения кластерного анализа в поисковых системах:

  • Пользователь обратился к поиску с запросом «ягуар» – поисковик должен понять, идёт ли речь о животном, автомобиле, фильме с Жаном Рено или версии операционной системы macOS. Алгоритмы кластеризации позволяют сгруппировать найденные документы (веб-страницы) в тематические кластеры, чтобы пользователь мог быстрее сориентироваться в результатах и найти нужную информацию.

  • Анализируя группы похожих документов, алгоритмы могут выявлять скрытые связи между терминами и концептами. Это позволяет улучшить ранжирование результатов поиска и показывать пользователям более релевантные документы, даже если они не содержат точного совпадения с ключевыми словами запроса.

  • Алгоритмы кластеризации лежат в основе функций «Похожие документы» и «Рекомендации». После того как пользователь просмотрел какой-либо документ или страницу, система может предложить ему другие документы из того же кластера, предполагая, что они также могут быть ему интересны.

  • Обнаружение семантических дублей. В сети существует огромное количество дублирующегося контента. Если технические дубли легко выявляются по хэшам типа MD5, то дубли по смыслу так же просто выявляются средствами кластеризации.

  • Анализ поисковых запросов. Кластеризация поисковых запросов помогает выявить группы пользователей с похожими интересами. Эта информация может быть использована для персонализации результатов поиска, улучшения систем контекстной рекламы и даже для анализа трендов и предсказания популярности тем.


Кластеризация по топу выдачи

Традиционно в теории и практике SEO закрепилось представление о кластеризации, как группировке ключевых слов и поисковых запросов, где каждый кластер соответствует определенной странице сайта, которая и должна показываться в поиске по запросам группы. Как это выглядит на практике? – Вы выгружаете запросы из какой-то системы статистики, парсите по ним поисковую выдачу и обнаруживаете взаимосвязи. Обычно речь идёт либо о пересечении каких-то URL в топе по всем запросам, либо об объединении хотя бы одного запроса с любым другим. Первый алгоритм принято называть «жёстким» и применять к сайтам электронной коммерции. Второй – «мягкий», и его используют при работе с информационными запросами.

У кластеризации по топам выдачи есть существенные недостатки:

  • Не все сайты ранжируются по каким-то запросам «честно», и их присутствие в выдаче мешает делать правильные выводы. Речь идёт о сайтах с высоким хостовым бонусом («Авито», маркетплейсы, сервисы Яндекс), спектральной примеси (если запросы имеют общий неопределенный характер, то в выдаче присутствуют как коммерческие страницы, так и инфо-контент), а также страницы, подмешанные Яндексом для оценки (тот самый «многорукий бандит», помогающий Яндексу лучше разобраться с оценкой новой страницы). В этом случае проблема решается исключением нерелевантных ресурсов из анализа.
  • Кластеры, основанные на запросах из заданных ключевых слов, редко бывают полными и не будут содержать весь спектр запросов, по которым конкретная страница может и должна показываться в поисковой выдаче. Чаще всего проблема решается с помощью оценки синсетов (синонимов), запросов из видимости страниц конкурентов и т.п.

  • Выдача просто может быть некачественной и состоять из плохо оптимизированных сайтов, если речь идёт о низкоконкурентной нише, или тематике, в которой слишком мало исторических данных для поисковых систем. В этом случае большое значение получают ручные доработки с использованием самой простой логики.

В любом случае, на выходе мы получаем всего лишь список разрозненных кластеров поисковых запросов – не внятную структуру, не полноценные «мешки слов», не чёткий граф. В любом случае, семантическое ядро в таком виде уже можно внедрять в рамках сайта и получать положительную динамику, дополнив список поисковых кластеров хотя бы составленной вручную структурой, картой слов и списком соответствующих интентов.

Примерно так предпочитаем видеть структуру сайта мы
Примерно так предпочитаем видеть структуру сайта мы

Совершенно понятно, что такой подход, несмотря на всю его практичность, не имеет отношения к тем алгоритмам, которые используют сами поисковые системы: это мы, оптимизаторы, ищем таким образом возможные решения, чтобы воспроизвести их у себя с минимальным риском. Однако структурирование сайта по топам (на усредненных данных конкурентов) полностью исключает следующие моменты, которые должны быть учтены:

  • Поисковые системы структурируют доступную информацию не только по поисковым запросам и ключевым словам

  • Одна и та же страница может быть релевантна более чем одному поисковому кластеру

  • Страница, имеющая высокое соответствие медианным данным, свойственным посадочным страницам одного кластера, по своей семантической сути и структуре может реально относиться к каким-то другим кластерам с точки зрения поискового алгоритма

В этом случае оптимизатор начинает лихорадочно высчитывать число и характер вхождений ключевых слов, выравнивая статистику, подливать ссылки с какими-то анкорами, пытаться улучшить текстовую релевантность за счёт мифического “LSI”, изображать популярность страницы для пользователей с помощью ботов. Что ж, это тоже может сработать хотя бы на время. Но вне поля зрения остаются результаты кластеризации с помощью других алгоритмов, реально используемых поисковыми системами, и как минимум, вам стоит провести тесты с их использованием, прежде чем тратить бюджеты и ресурсы на доработки и переделки.

Ниже рассмотрим такие алгоритмы, но сначала разберем, зачем это вообще нужно.

Для чего может применяться кластерный анализ в SEO

Если в случае оценки структуры сайта от семантического ядра мы идём от частного – к общему, то в случае оценки кластеров сайта машиной – всё наоборот. Машина не понимает язык людей, у неё есть только статистические данные совместного использования слов. Робот-краулер скачивает HTML-контент вашего сайта, робот-индексатор переводит его на язык цифр, поисковые алгоритмы начинают анализировать и сопоставлять полученные данные. Результаты анализа в дальнейшем проверяются людьми-асессорами и пользователями, которые уже могут оценить выявленные связи с использованием обычного языка.

Что может сделать с этими данными SEO-специалист? В зависимости от используемых алгоритмов и моделей, таким образом можно решать следующие задачи:

  • Проверить структурирование сайта на базе семантических кластеров (которые обычно вовсе не семантические, а синтаксические и лексические). Пример: у вас есть страничка бренда, на которую выводятся все товары производителя вдобавок к информации об этом бренде (очень любят такие странички «АСПРО» в своих шаблонах). Оценка кластеров показывает, что странички брендов группируются вовсе не друг с другом, а с какой-нибудь товарной категорией и выступают как обычные семантические дубли. А значит, странички брендов надо переструктурировать: это не информация о производителе, это страничка-каннибал с ошибочно выбранной структурой.

  • Выявить узлы, в явном виде вываливающихся из графа (аналог «висячих узлов» в семантике). Пример: вы ожидаете, что благодаря внутренним ссылкам и частотности заданных ключей постранично получаете плотный семантический узел, охватывающий максимум тем в определенной сфере. По факту машина никаких взаимосвязей с точки зрения семантики не видит, ваша внутренняя перелинковка не работает, и нужно разбираться – что не так с контентом.

  • Определить проблемный контент. Мы привыкли оценивать контент на базе ключевых слов и их вхождений. Ранние поисковые алгоритмы уровня TF-IDF работали примерно также: если слово часто встречается на страничке, наверное, это важное для документа слово, и его стоит показать по соответствующему запросу. Семантические алгоритмы учитывают контекст, который может полностью обнулить «веса» какого-то частотного ключевика. Если страничка выпадает из целевого кластера или не может быть отнесена к какой-то группе вообще – есть смысл оценить её более пристально.

Это лишь часть задач, которые можно решать с помощью анализа машинной кластеризации. Экспериментируйте, и вы наверняка обнаружите и более интересные приложения таких данных.

Алгоритмы кластерного анализа

Что я всегда советую коллегам: попробуйте оценивать свои ресурсы не как набор текстов, картинок, ссылок и сниппетов. Попробуйте оценить свой сайт с точки зрения машины. Все средства для этого у вас уже в доступе.

  • Хотите понять, зачем нужно оптимизировать процессы сканирования и быстродействия? – Попробуйте спарсить свой сайт так, как делает поисковая система. Вы увидите, сколько системных ресурсов съест «тяжёлый» сайт, нарвётесь на пару блокировок со стороны сервера, выхватите кучу 500-х ошибок и у вас появится желание набить морду вебмастеру сайта.

  • Хотите понять, почему не работают ваши ссылки? – Попробуйте оценить связь донора с линкопомойки с вашим сайтом, ценность URL, где размещена ссылка и самой этой ссылки.

  • Хотите понять, что не так с контентом? – Не смотрите на ключевые слова в тайтлах, а вооружайтесь линейной алгеброй и дифференциальной математикой и начинайте работать с матрицами. Потому что поисковые системы понятия не имеют, что в действительности сказано на ваших страницах: они не умеют читать, как не умеют и LLM, только имитирующие речь и мышление. Всё, что у них по факту есть – это здоровенные массивы чисел с плавающей запятой и алгоритмы, способные вычислять связь между ними.

Алгоритмы, которые в реальности используют для кластеризации поисковые системы – коммерческая тайна, к тому же их формулы постоянно корректируются. Однако база, лежащая в основе коммерческих алгоритмов – не секрет, и ничто не мешает использовать её для анализа и выстраивания гипотез.

Поисковые системы используют множество способов кластеризации, каждый из которых обладает своими особенностями и применяется в зависимости от специфики задачи.

  • K-means основан на разделении данных на K кластеров, где каждый объект принадлежит к кластеру с ближайшим к нему центроидом. Алгоритм итеративный, и центроиды кластеров пересчитываются на каждом шаге. Неплохое решение, если вам нужно вместить коллекцию в уже готовую классификацию, но в практике SEO выглядит одним из самых непрактичных.

  • Иерархическая кластеризация строит иерархию кластеров, которая может быть представлена в виде дендограммы (дерева). Существует два основных подхода: агломеративный (объединительный) и дивизивный (разделяющий). Иерархическая кластеризация не требует задания числа кластеров, но может быть вычислительно затратной для больших наборов данных. Можно применять для структурирования той таблички с поисковыми запросами, что принято называть «семантическим ядром».

  • DBSCAN основан на плотности данных и хорошо подходит для кластеризации данных с произвольной формой кластеров. DBSCAN находит области высокой плотности данных, разделенные областями низкой плотности, и относит объекты в областях высокой плотности к одному кластеру. Чувствителен к параметрам настройки. Для SEO едва ли полезен по причине сложности настроек, тем более, когда можно использовать HDBSCAN (см. ниже).

  • LDA – генеративная вероятностная модель, используемая для тематического моделирования. LDA представляет документы как множества тем, а темы - как распределения слов. Алгоритм позволяет кластеризовать документы по темам и часто используется для анализа текстов и тематической классификации.

Помимо перечисленных, существуют и другие алгоритмы кластеризации, такие как Mean-Shift, OPTICS, Gaussian Mixture Models и т.п. Выбор конкретного алгоритма зависит от характера данных, требований к результатам и доступных ресурсов. В повседневных SEO-задачах я сейчас чаще использую KNN (K-Nearest Neighbors) и HDBSCAN. Рассмотрим их подробнее.

KNN для работы с поисковыми запросами

Алгоритм K-Nearest Neighbors (KNN) также может быть использован для кластеризации, хотя он чаще упоминается в контексте классификации. KNN —ленивый алгоритм, он не строит явную модель кластеров, а просто запоминает все данные и относит новые объекты к кластерам на основе их близости к уже имеющимся данным.

Для каждого объекта в наборе данных вычисляются расстояния до всех остальных объектов. Определяются соседи с наименьшим расстоянием для каждого объекта. Ближайшие объекты объединяются в кластеры.

KNN - очень простой алгоритм, который легко понять и реализовать. Он способен находить кластеры произвольной формы и не требует предварительного определения числа кластеров (хотя выбор значения K влияет на результат). Если вам нужно сгруппировать относительно небольшие наборы данных (например, список поисковых запросов), KNN может быть хорошим выбором.

Но есть у него и недостатки:

  • Для больших наборов данных вычисление расстояний между всеми объектами может быть очень затратным по времени и вычислительным ресурсам.
  • Чувствительность к выбросам. Выбросы могут искажать расстояния между объектами и приводить к неправильной кластеризации.
  • Выбор оптимального значения K может быть непростой задачей и часто требует экспериментов.

В любом случае, KNN показывает высокую эффективность в практике, и если вы планируете автоматизировать свою практику, вам стоит обязательно опробовать его в работе.

HDBSCAN для оценки готовых структур

HDBSCAN (Hierarchical Density-Based Spatial Clustering of Applications with Noise) можно рассматривать как более точную и гибкую версию упомянутого выше DBSCAN.

  • HDBSCAN не требует задания параметра радиуса (eps), что является одним из главных преимуществ перед DBSCAN. Вместо этого он анализирует плотность данных в разных масштабах и автоматически определяет оптимальные параметры для кластеризации. Это особенно важно для больших наборов данных, где ручной подбор параметров может быть сложным и затратным по времени.
  • Этот алгоритм может обнаруживать кластеры с разной плотностью в одном наборе данных, в то время как DBSCAN склонен к объединению кластеров с переменной плотностью в один большой кластер или разделению плотных кластеров на несколько частей. Это делает HDBSCAN более устойчивым к шуму и неоднородностям в данных, что часто встречается в реальных задачах поиска.
  • На выходе вы получаете иерархическую структуру кластеров, а это может быть полезно для анализа данных и интерпретации результатов. Например, можно исследовать кластеры на разных уровнях гранулярности или использовать иерархию для построения навигации по результатам поиска.

Рассмотрим практический пример кластеризации сайта средствами HDBSCAN и векторных вложений (эмбеддингов). Задача – выявить отклонения, ошибки кластеризации, проблемные моменты вообще.

Пример: кластеризация сайта на векторных вложениях с помощью HDBSCAN

Для подобного анализа вам понадобится выгрузка с векторным представлением страниц сайта. Эмбеддинги вы можете извлечь любым удобным способом и с помощью любой удобной для вас модели. Можно взять Screaming Frog SEO Spider, настроить извлечение эмбеддингов с помощью одной из доступных моделей (от Open AI, Vertex AI или Llama), либо задействовать Python и его библиотеки, а в качестве модели для извлечения вложений взять что-то с Hugging Face.

Вот такие примерно данные для кровотечения из глаз используются в дальнейшей работе
Вот такие примерно данные для кровотечения из глаз используются в дальнейшей работе

Парсинг может подразумевать как страницы целиком, так и исключительно заданные области (в первую очередь – зону основного контента, без сквозных блоков). Если речь идёт о техническом анализе коммерческого ресурса (интернет-магазина в первую очередь), то я предпочитаю использовать вложения страниц целиком, без разделения на зоны. Да, это шумная информация, но именно такой её получают и поисковые системы, вместе со всеми этими мегаменю и избытком ненужным ключевых слов на фоне малого объёма полезного уникального контента.

На вход у вас должна получиться табличка в формате csv и двумя колонками: URL и Embeddings. Обратите внимание: по идее, колонка с векторными вложениями должна содержать только числа с плавающей запятой, тогда как та же SFSS выгружает строковые данные. В скрипт, приводимый ниже, встроена конвертация строковых данных в формат float и фильтрация строковых данных, так что проблем быть не должно. Но если они есть – вы знаете, на что нужно обратить внимание в первую очередь.

Для запуска скрипта вам понадобится предварительно установить несколько библиотек, включая Streamlit (Евгений Молдовану, благодарю за подсказанное решение): благодаря ему вы получаете нормальный веб-интерфейс. Запускаете командную строку, указываете место скрипта на вашем компьютере, скрипт загружается – и у вас есть браузерное предложение, где вы сможете загружать и выгружать файлы, оценивать результаты (или любоваться на список полученных ошибок). Для запуска скрипта в Windows вам будет нужно запустить командную строку (Win + R, CMD), и в открывшейся командной строке ввести нечто типа «streamlit run F:\python_projects\embeddings_clustering\embeddings_clustering_2.py» (в зависимости от того, где у вас сохранен скрипт).

Что вы должны увидеть в браузере после запуска скрипта
Что вы должны увидеть в браузере после запуска скрипта

Примечание. Скрипт работает на Python 3.11, на других версиях работа не гарантирована.

import streamlit as st import pandas as pd import hdbscan import numpy as np import plotly.express as px st.title("Кластеризация векторных представлений страниц") uploaded_file = st.file_uploader("Загрузите CSV файл с эмбеддингами", type="csv") if uploaded_file is not None: try: df = pd.read_csv(uploaded_file, sep=";", encoding='utf-8') # --- Обработка данных --- # Замена пустых значений на '0' df['Embeddings'] = df['Embeddings'].fillna('0') # Удаление строк с пропущенными значениями df = df.dropna(subset=['Embeddings']) # Преобразование строк с эмбеддингами в списки чисел # с обработкой потенциальных ошибок def convert_to_float_list(x): try: return [float(i.strip()) for i in x.split(',') if i.strip() and i.strip() != '-'] except (ValueError, TypeError): print(f"Ошибка при обработке строки: {x}") # Добавьте вывод для отладки return [0] # Возвращаем список из нулей или другое значение по умолчанию df['Embeddings'] = df['Embeddings'].apply(convert_to_float_list) # --- Конец обработки данных --- embedding_length = len(df['Embeddings'][0]) df['Embeddings'] = df['Embeddings'].apply(lambda x: x[:embedding_length] + [0] * (embedding_length - len(x))) embeddings_array = np.array(df['Embeddings'].tolist()) clusterer = hdbscan.HDBSCAN(min_cluster_size=2, gen_min_span_tree=True) clusterer.fit(embeddings_array) df['Cluster'] = clusterer.labels_ st.subheader("Результаты кластеризации:") st.write(df) df['x'] = df['Embeddings'].apply(lambda x: x[0]) df['y'] = df['Embeddings'].apply(lambda x: x[1]) fig = px.scatter(df, x='x', y='y', color='Cluster', hover_data=['URL'], title="Визуализация кластеров") st.plotly_chart(fig) except Exception as e: st.error(f"Произошла ошибка: {e}") st.error("Пожалуйста, проверьте корректность данных в CSV файле.") else: st.info('Пожалуйста, загрузите CSV файл с эмбеддингами. ' 'Файл должен содержать колонки "URL" и "Embeddings". ' 'Колонка "Embeddings" должна содержать векторные представления страниц, разделенные запятыми.')

Вы выгружаете csv с результатами и видите колонки с URL, векторным вложением и присвоенной группой. Группа «-1» означает, что алгоритм не смог отнести вложение ни к одной группе (порог для создания задан в 2). Это – самые проблемные страницы, которым в дальнейшем надо уделить максимальное внимание: в несгруппированное могут попадать либо действительно негруппируемые страницы (например, «Главная»), либо с этими страничками что-то совсем не так.

Результаты кластеризации (их можно скачать): URL, эмбеддинг, присвоенная группа
Результаты кластеризации (их можно скачать): URL, эмбеддинг, присвоенная группа

Что дальше? Можно продолжить анализ средствами Python, а можно просто создать табличку в Excel. Мне пока комфортнее работать с результатами именно в Excel. Создаём таблицу, импортируем данные csv. Колонку с эмбеддингами можно отсюда удалить, если вы не планируете использовать эти данные в дальнейшем. У вас получится список URL и присвоенной каждому адресу группой. Не очень информативно, поэтому добавим колонки с тайтлами и H1, чтобы понимать, какую информацию содержит каждый адрес. Сделать это можно просто: выгружаем соответствующие данные из Screaming Frog, добавляем на новую вкладку своей таблички и используем функцию ВПР: Excel найдёт аналогичные URL на новой вкладке и импортирует соответствующие данные.

По итогам мы получаем табличку со следующими полями: URL, тайтл, H1, номер кластера. Теперь намного понятнее, что с чем объединяется, а что стоит особняком. Можно добавить колонку с метками и комментариями. Сортируем табличку по группам и получаем полную и достаточно адекватную картину по анализируемому сайту. Степень адекватности зависит от качества извлеченных векторов. Примечание: для выявления возможных проблем с кластеризацией по сайту рекомендую вывести и данные по объёму текстового контента страниц.

Представленный инструмент не имеет никакого отношения к алгоритмам, реально используемым поисковыми системами: это всего лишь имитация, основанная на классическом HDBSCAN и выбранной вами модели векторизации. Однако с его помощью вы вполне можете обнаружить аномалии и недочёты, которые едва ли сможете увидеть другими средствами. И не стесняйтесь экспериментировать: это всего лишь пример того, как можно использовать Python для решения ваших повседневных задач.

8
1
1
1
8 комментариев