Найти в Дзене

Как я оптимизировал инструменты для анализа семантики: технические детали, кейсы и выводы из стрима

Оглавление

Всем привет! С вами на связи автор надстройки !SEMTools для Excel Дмитрий Тумайкин.

Вчера (20 марта 2024) я провел стрим, где подробно разобрал обновления своих инструментов для работы с CSV-файлами и кластеризации семантики. Если вы пропустили — вот запись:

В этой статье — структурированный пересказ с акцентом на технические нюансы, примеры и выводы. Поехали!

Часть 1: Инструмент для обработки CSV — как я сократил объем данных в 3 раза

Проблема стандартных выгрузок

Исходные CSV-файлы из Букварикса содержат избыточность: каждый запрос повторяется 9-15 раз (по числу доменов в выдаче). Например, для Москвы размер файла достигал 90 ГБ в UTF-8.
Формат вывода одной ключевой фразы до оптимизации:
"купить пуф", 1500, 300, 10000, hof.ru
"купить пуф", 1500, 300, 10000, ozon.ru
... и так 10 раз.

Что было сделано:

  1. Объединение доменов в одну ячейку.
    Теперь все домены из топ-10 выводятся через пробел в одной ячейке. Это сократило объем файлов в
    4–5 раз.
    Новый формат:
    "купить пуф", 1500, 300, 10000, hoff.ru ozon.ru wildberries.ru ....
  2. Конвертация в Windows-1251.
    Кодировка Windows-1251 занимает на
    30–40% меньше места для кириллицы.
  3. Файлы сжаты в 7z и выложены в telegram-канале (МСК и СПб).
    После двух первых этапов, файл для Москвы уменьшился с ~95 ГБ до ~20 ГБ, СПб с ~65 до ~10 ГБ
    В сжатом формате файлы весят всего 3,5 и 2 GB, архивы выложены у меня в telegram-канале
    @semtools

Часть 2: Кластеризация — новый алгоритм и вложенные запросы

Новый алгоритм: транзитивность и веса

  1. Весовые коэффициенты для позиций:

По умолчанию рекомендованы значения
1-я позиция → 120 баллов,
1-2 → 60 за каждое совпадение, итого 120
1-3 → 40 за каждое совпадение, итого 120
1-4 → 30 за каждое совпадение, итого 120
1-5 → 26 за каждое совпадение, итого 120
1-10 - 40 за каждое совпадение, итого 400
Итоговый максимум - 1000 (целиком совпадают первые 5 включая позиции, остальные 6-10 совпадают без учета позиций
Пороговое значение - для доменов рекомендуется 700, для URL достаточно 500

  1. Транзитивность.
    Если запросы
    A и B находятся в одном кластере, а B и C — тоже, то A и C автоматически объединяются, даже если их схожесть между собой не превышает указанный порог.
    Старый алгоритм создал бы два кластера: A-B и B-C. Новый объединяет A-B-C в один.

Вложенные запросы для нескольких родителей

Раньше инструмент искал вложенные запросы только по вхождению слов (например, если родитель — «пуф», система находила все фразы, содержащие это слово). Теперь добавлены два новых режима:

  1. Совпадение с фразой-родителем — запрос должен содержать все слова родителя в любом порядке.
  2. Совпадение с несколькими родителями — запрос должен соответствовать хотя бы одному родителю из списка (т.е. содержать все его слова).

Пример 1: Один родитель

  • Родитель: «купить пуф Москва».
  • Вложенные запросы:
    «пуф Москва купить» ✔️ (все слова есть, порядок не важен),
    «Москва недорого купить пуф» ✔️,
    «пуф Москва недорого» ❌ (нет слова «купить»),
    «купить пуф недорого» ❌ (нет слова «Москва»).

Пример 2: Несколько родителей

  • Родитель 1: «купить пуф»,
  • Родитель 2: «Москва мебель».

Вложенные запросы будут включать:

  • Все фразы, где есть оба слова из родителя 1 («купить» + «пуф»):
    «пуф купить»,
    «купить недорогой пуф».
  • Все фразы, где есть оба слова из родителя 2 («Москва» + «мебель»):
    «мебель для кухни Москва»,
    «Москва недорогая мебель».
  • Не войдут:
    «пуф Москва» ❌ (нет «купить» или «мебель»),
    «купить мебель» ❌ (нет «пуф» или «Москва»).

Почему это удобнее?

  • Точность. Исключаются фразы с частичным совпадением (например, «спуфинг» больше не попадает в выборку, т.к. сравниваются слова целиком.
  • Гибкость. Можно одновременно искать запросы из разных категорий. Например:
    Родитель 1: «угловой стол»,
    Родитель 2: «офисный стол».
    Система найдет все фразы, содержащие либо «угловой» + «стол», либо «офисный» + «стол».
  • Экономия времени. Не нужно вручную прописывать все варианты перестановок и чистить семантику от слов из другой тематики.

Итог

Теперь инструмент работает как «умный фильтр»:

  • Вы задаете список родительских фраз,
  • Система находит все запросы, которые полностью соответствуют хотя бы одному родителю (все слова из фразы-родителя есть, порядок не важен).

Часть 3: Борьба с мусором и дубликатами

Фильтрация нерелевантных запросов

На стриме я столкнулся с проблемой: запросы вроде «спуфинг» (от англ. spoofing) попадали в кластеры из-за частичного совпадения с «пуф». Т.к. изначально думал, что сочетание букв редкое и в других тематиках особо не встречается.

Решение:

  1. Извлек все нужные словоформы слов, и удалил строки, где ничего не извлеклось. Это позволило быстро почистить таблицу уже после выгрузки, не усложняя запрос к CSV.
  2. Анализ доменов. Если в топе доминируют информационные сайты (wikipedia.org, bolshoyvopros.com, yandex.ru это yandex.ru/q/), запрос исключается.
  3. Ручное удаление уже после кластеризации. Нерелевантные запросы попадают в свои кластеры, их их можно удалить все разом уже после.

Часть 4: Кейс — анализ конкурентов на примере тематики по пуфам

  1. Выгрузка данных.
    Извлек все запросы, где в топ-10 есть сайт DreamBag.ru. или puff.ru
  2. Составил список доменов и отранжировал по убыванию суммарной точной частотности
  3. Обнаружил несколько других прямых конкурентов
  4. Фильтрация.
    Удалил информационные фразы («как выбрать», «отзывы») и некоммерческие домены.
  5. Кластеризация.
    Обнаружил новые ключевые слова, вообще не содержащие "пуф". Таковых оказалось очень много.

Часть 5: Сложности и нерешенные проблемы

  1. Большие кластеры.
    Из-за доминирования маркетплейсов в топе, несхожие запросы объединяются в гигантские группы (800+ фраз).
    Временное решение: Ручная постобработка (повторная разбивка больших кластеров с повторной кластеризацией и более высоким порогом
  2. Дубликаты.
    Запросы «пуф купить» и «купить пуф» считаются разными.
    Возможный фикс: Нормализация (удаление предлогов, сортировка слов).
  3. Скорость обработки.
    Анализ 2000 строк занимает 12 секунд. Но сложность алгоритма квадратичная - с двукратным увеличением количества строк, время растет четырехкратно. 20.000 строк (в 10 раз больше) - уже 1200 секунд (в 100 раз больше времени, в минутах 20 минут).
    Планы: Научиться использовать многопоточность (несколько ядер процессора).
  4. Отсутствие полных URL в выдаче Букварикса (снижает качество кластеризации).

Часть 6: Планы на будущее

  1. Парсинг XML-выдачи.
    Интеграция с прямыми выгрузками из поисковиков для работы с урлами (например, /category/pufy вместо общего домена).
  2. Автоматическая постобработка.
    Автоматическая разбивка слишком больших кластеров и повторная кластеризация с повышенным порогом схожести.
  3. Поддержка многогопоточности (задействование более 1 ядра)

Практическое применение инструментов

  • Для SEO. Кластеры помогают группировать запросы под одну посадочную страницу. Это минимизирует внутреннюю конкуренцию страниц и повышает релевантность и полноту контента (если использовать все или большую часть фраз и слов-синонимов в кластере). Привел пример с угловыми столами, они же Г-образные.
  • Для анализа конкурентов. Выгрузка запросов, по которым конкурент находится в топ-10, позволяет находить «окна» в их семантике.
  • Для контекстной рекламы. Группы запросов по интенту будут иметь более высокий CTR за счет релевантности объявлений.

Где следить за обновлениями?

Если хотите первыми узнавать о новых функциях !SEMTools, участвовать в стримах в реальном времени и смотреть разборы кейсов:

  • Telegram: t.me/semtools — анонсы, шаблоны, обсуждения.
  • VK Video: https://live.vkvideo.ru/semtools — записи прошедших стримов и инструкции по работе с семантикой в Excel.

Спасибо за внимание! Если есть вопросы или идеи — пишите в комментариях или в Telegram. До встречи в эфире! 😊