Реалізація кластеризації текстових документів
Кластеризація текстів—групування документів за смисловою близістю без попередніх міток. Застосування: виявлення тем у корпусі, сегментація клієнтських звернень, організація архівів документів.
Pipeline кластеризації
[Документи]
→ [Очистка, нормалізація]
→ [Embedding (Sentence-BERT)]
→ [Зниження розмірності (UMAP)]
→ [Кластеризація (HDBSCAN / K-Means)]
→ [Інтерпретація кластерів (ключові слова)]
→ [Візуалізація]
Embedding для російськомовного тексту
Якість кластеризації повністю залежить від якості embedding:
-
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-мірні embedding до 10–50 вимірів. Прискорює кластеризацію, підвищує якість (прокляття розмірності).
import umap
reducer = umap.UMAP(n_components=10, metric="cosine", random_state=42)
embeddings_reduced = reducer.fit_transform(embeddings)
Інтерпретація кластерів
Після кластеризації кожному кластеру потрібно дати назву. Методи:
- TF-IDF top-слова: найхарактерніші слова кластера проти решти
- LLM-інтерпретація: передати 10 випадкових документів кластера, попросити GPT сформулювати спільну тему
- BERTopic вбудований: автоматично формує c-TF-IDF представлення
Оцінка якості без міток
- Silhouette Score: [-1, 1], більше—краще розділення. Ціль: > 0.3
- Davies-Bouldin Index: менше—краще. Порівняння щільності кластерів
- Coherence: як семантично пов'язані top-слова кластера







