Реализация кластеризации текстовых документов
Кластеризация текстов — группировка документов по смысловой близости без предварительных меток. Применяется для обнаружения тем в корпусе, сегментации клиентских обращений, организации архивов документов.
Пайплайн кластеризации
[Документы]
→ [Очистка, нормализация]
→ [Эмбеддинги (Sentence-BERT)]
→ [Снижение размерности (UMAP)]
→ [Кластеризация (HDBSCAN / K-Means)]
→ [Интерпретация кластеров (ключевые слова)]
→ [Визуализация]
Эмбеддинги для русского текста
Качество кластеризации полностью зависит от качества эмбеддингов:
-
cointegrated/rubert-tiny2— 312MB, 312ms/1000 текстов, хорошо для коротких текстов -
sbert-base-ru-mean-tokens— лучше для длинных документов -
text-embedding-3-small(OpenAI API) — наилучшее качество, платно
Алгоритмы кластеризации
K-Means: нужно знать количество кластеров заранее. Быстрый, хорошо масштабируется. Чувствителен к outliers.
HDBSCAN: не требует числа кластеров, автоматически определяет outliers (шум). Лучший выбор для поискового анализа:
import hdbscan
clusterer = hdbscan.HDBSCAN(min_cluster_size=10, metric='euclidean')
labels = clusterer.fit_predict(embeddings_umap)
BERTopic: end-to-end pipeline от текстов до топиков с названиями:
from bertopic import BERTopic
topic_model = BERTopic(language="russian", calculate_probabilities=True)
topics, probs = topic_model.fit_transform(documents)
topic_model.visualize_topics()
UMAP для снижения размерности
Перед кластеризацией: UMAP снижает 768-мерные эмбеддинги до 10–50 измерений. Это ускоряет кластеризацию и повышает её качество (проклятие размерности).
import umap
reducer = umap.UMAP(n_components=10, metric="cosine", random_state=42)
embeddings_reduced = reducer.fit_transform(embeddings)
Интерпретация кластеров
После кластеризации каждому кластеру нужно дать название. Методы:
- TF-IDF топ-слова: самые характерные слова кластера vs остальные
- LLM-интерпретация: передать 10 случайных документов кластера, попросить GPT сформулировать общую тему
- BERTopic встроенный: автоматически формирует c-TF-IDF представление
Оценка качества без меток
- Silhouette Score: [-1, 1], выше — лучше разделение. Цель: > 0.3
- Davies-Bouldin Index: ниже — лучше. Сравнение плотности кластеров
- Coherence: насколько топ-слова кластера семантически связны







