Как использовать DBSCAN для кластеризации SEO-запросов

Привлечение пациентов через сайт клиники примерно в 4 раза дешевле обычной рекламы. 
Запрет о рекламе медицинских услуг повысил актуальность интернет-продвижения медицинских услуг. Ищите пациентов в интернете, не боясь попасть под законодательные запреты.

Алгоритм DBSCAN (Density-Based Spatial Clustering of Applications with Noise) – это метод кластеризации, который используется для объединения точек в группы, основываясь на плотности их расположения. В отличие от методов, таких как k-means, DBSCAN не требует заранее задавать количество кластеров и хорошо справляется с шумом и выбросами. Давайте рассмотрим, как использовать DBSCAN для кластеризации списка SEO-запросов.

Шаг 1. Подготовка данных для кластеризации методом DBSCAN

  1. Сбор и очистка данных: Прежде всего, соберите список SEO-запросов. Например:
    • "купить ноутбук", "цена ноутбука", "лучшие ноутбуки", "ремонт ноутбуков", "где купить ноутбук"
    Удалите дубликаты, приведите все запросы к одному формату (например, в нижний регистр).

Шаг 2. Преобразование текстовых данных в числовой формат

Поскольку DBSCAN работает с числовыми данными, нам нужно преобразовать текстовые запросы в числовые векторы. Для этого можно использовать методы векторизации, такие как TF-IDF (Term Frequency-Inverse Document Frequency).


from sklearn.feature_extraction.text import TfidfVectorizer

queries = ["купить ноутбук", "цена ноутбука", "лучшие ноутбуки", "ремонт ноутбуков", "где купить ноутбук"]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(queries)

Шаг 3. Применение алгоритма DBSCAN

Для работы с алгоритмом DBSCAN используются два основных параметра: eps (радиус) и min_samples (минимальное количество точек для кластера).


from sklearn.cluster import DBSCAN

eps = 0.5
min_samples = 2
dbscan = DBSCAN(eps=eps, min_samples=min_samples)
clusters = dbscan.fit_predict(X)

Шаг 4. Анализ результатов

После выполнения кластеризации вы можете просмотреть, какие запросы попали в какие кластеры.


for query, cluster in zip(queries, clusters):
    print(f"Запрос: {query}, Кластер: {cluster}")

Шаг 5. Оптимизация параметров

Для поиска оптимальных значений eps и min_samples используйте график расстояний до ближайшего соседа (k-nearest neighbors). Это помогает визуально определить «колено» на графике и выбрать оптимальное значение для eps.


import numpy as np
from sklearn.neighbors import NearestNeighbors
import matplotlib.pyplot as plt

neighbors = NearestNeighbors(n_neighbors=2)
neighbors_fit = neighbors.fit(X)
distances, indices = neighbors_fit.kneighbors(X)

distances = np.sort(distances, axis=0)
distances = distances[:, 1]
plt.plot(distances)
plt.show()

Выбор правильных значений для параметров eps и min_samples

Правильный выбор этих параметров зависит от особенностей ваших данных и цели кластеризации. Давайте подробнее разберем, как выбирать эти значения и на что ориентироваться.

Параметр eps

  • Минимальное значение. Минимум зависит от шкалы данных. В нормализованных данных, где все значения находятся в диапазоне от 0 до 1, минимальные значения могут быть очень маленькими, например, 0.1 или 0.01.
  • Максимальное значение. Максимум также зависит от данных. Если значение слишком велико, все точки могут оказаться в одном кластере.
  • Среднее значение. Часто выбираются экспериментально, начиная с 0.5 для нормализованных данных и корректируются по результатам.
  • Построение графика k-nearest neighbors (kNN) для оценки. Вы можете построить график расстояний до ближайшего k-соседа (где k = min_samples), чтобы визуально определить «колено» на графике.

Пример кода для выбора eps с использованием kNN


import numpy as np
from sklearn.neighbors import NearestNeighbors
import matplotlib.pyplot as plt

# Векторизация запросов (как ранее)
queries = ["купить ноутбук", "цена ноутбука", "лучшие ноутбуки", "ремонт ноутбуков", "где купить ноутбук"]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(queries)

# Поиск ближайших соседей
neighbors = NearestNeighbors(n_neighbors=2)
neighbors_fit = neighbors.fit(X)
distances, indices = neighbors_fit.kneighbors(X)

# Сортировка расстояний и построение графика
distances = np.sort(distances, axis=0)
distances = distances[:,1]
plt.plot(distances)
plt.xlabel('Точки данных')
plt.ylabel('Расстояние до ближайшего соседа')
plt.title('График расстояний до ближайшего соседа')
plt.show()

Параметр min_samples

  • Минимальное значение начинается с 2 или 3. Если значение слишком мало, алгоритм будет слишком чувствителен к шуму.
  • Максимальное значение не должно превышать общее количество точек в наборе данных. В больших наборах данных значения от 5 до 10 являются хорошей отправной точкой.
  • Чем плотнее данные, тем большее значение min_samples можно использовать.

Пример кода для применения DBSCAN с параметрами


from sklearn.cluster import DBSCAN
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer

# Векторизация запросов
queries = ["купить ноутбук", "цена ноутбука", "лучшие ноутбуки", "ремонт ноутбуков", "где купить ноутбук"]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(queries)

# Выбор параметров
eps = 0.5
min_samples = 2

# Применение DBSCAN
dbscan = DBSCAN(eps=eps, min_samples=min_samples)
clusters = dbscan.fit_predict(X)

# Вывод результатов
for query, cluster in zip(queries, clusters):
    print(f"Запрос: {query}, Кластер: {cluster}")

Выводы

  • Используйте kNN-график для выбора eps.
  • Экспериментируйте с min_samples, начиная с малого значения и постепенно увеличивая.
  • Анализируйте результаты и корректируйте параметры по мере необходимости.

Пример использования Universal Sentence Encoder

Для более сложной векторизации текстов, можно использовать Universal Sentence Encoder (USE).

Установка необходимых библиотек

pip install tensorflow tensorflow_hub sklearn

Затем импортируйте библиотеки в коде:


import tensorflow_hub as hub
import numpy as np
from sklearn.cluster import DBSCAN

Загрузка модели Universal Sentence Encoder


embed = hub.load("https://tfhub.dev/google/universal-sentence-encoder/4")

Преобразование запросов в эмбеддинги


queries = ["купить ноутбук", "цена ноутбука", "лучшие ноутбуки", "ремонт ноутбуков", "где купить ноутбук"]

# Преобразование запросов в эмбеддинги
embeddings = embed(queries)

# Преобразование тензора в массив numpy
embeddings_np = np.array(embeddings)

Настройка и применение DBSCAN


eps = 0.5  # радиус для окрестности точки
min_samples = 2  # минимальное количество точек для образования кластера

# Применение DBSCAN к эмбеддингам
dbscan = DBSCAN(eps=eps, min_samples=min_samples, metric='cosine')
clusters = dbscan.fit_predict(embeddings_np)

Вывод результатов


for query, cluster in zip(queries, clusters):
    print(f"Запрос: {query}, Кластер: {cluster}")

Теперь у вас есть пошаговая инструкция по применению алгоритма DBSCAN для кластеризации SEO-запросов. Правильная настройка параметров eps и min_samples, а также выбор метода векторизации играют ключевую роль в получении качественных результатов.


Читайте также
Яндекс.Метрика