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

Кластерний аналіз у 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...