Кластеризация документов

Кластерный анализ на Python

Shaumik Daityari

Business Analyst

Кластеризация документов: концепции

  1. Очистить данные перед обработкой
  2. Определить важность терминов в документе (матрица TF-IDF)
  3. Кластеризовать матрицу TF-IDF
  4. Найти ключевые термины и документы в каждом кластере
Кластерный анализ на Python

Очистка и токенизация данных

  • Разбиваем текст на токены и очищаем данные для обработки
from nltk.tokenize import word_tokenize
import re

def remove_noise(text, stop_words = []):
    tokens = word_tokenize(text)

cleaned_tokens = [] for token in tokens: token = re.sub('[^A-Za-z0-9]+', '', token)
if len(token) > 1 and token.lower() not in stop_words: # Get lowercase cleaned_tokens.append(token.lower()) return cleaned_tokens
remove_noise("It is lovely weather we are having. I hope the weather continues.")
['lovely', 'weather', 'hope', 'weather', 'continues']
Кластерный анализ на Python

Матрица «документ–термин» и разреженные матрицы

  • Формируется матрица «документ–термин»
  • Большинство элементов матрицы равны нулю

Source

  • Создаётся разреженная матрица

Source

Кластерный анализ на Python

TF-IDF (Term Frequency - Inverse Document Frequency)

  • Взвешенная мера: оценивает важность слова для документа в коллекции
from sklearn.feature_extraction.text import TfidfVectorizer

tfidf_vectorizer = TfidfVectorizer(max_df=0.8, max_features=50, min_df=0.2, tokenizer=remove_noise)
tfidf_matrix = tfidf_vectorizer.fit_transform(data)
Кластерный анализ на Python

Кластеризация с разреженной матрицей

  • kmeans() в SciPy не поддерживает разреженные матрицы
  • Используйте .todense() для преобразования в матрицу
cluster_centers, distortion = kmeans(tfidf_matrix.todense(), num_clusters)
Кластерный анализ на Python

Ключевые термины каждого кластера

  • Центры кластеров: списки размером, равным числу терминов
  • Каждое значение в центре кластера — это его важность
  • Создаём словарь и выводим ключевые термины
terms = tfidf_vectorizer.get_feature_names_out()

for i in range(num_clusters):
    center_terms = dict(zip(terms, list(cluster_centers[i])))

sorted_terms = sorted(center_terms, key=center_terms.get, reverse=True)
print(sorted_terms[:3])
['room', 'hotel', 'staff']

['bad', 'location', 'breakfast']
Кластерный анализ на Python

Дополнительные аспекты

  • Работа с гиперссылками, эмодзи и т. д.
  • Нормализация слов (run, ran, running → run)
  • .todense() может не работать с большими наборами данных
Кластерный анализ на Python

Далее: упражнения!

Кластерный анализ на Python

Preparing Video For Download...