Klastrowanie dokumentów

Analiza skupień w Pythonie

Shaumik Daityari

Business Analyst

Klastrowanie dokumentów: koncepcje

  1. Wyczyścić dane przed przetwarzaniem
  2. Określić wagę terminów w dokumencie (macierz TF-IDF)
  3. Klastrować macierz TF-IDF
  4. Znaleźć najważniejsze terminy i dokumenty w każdym klastrze
Analiza skupień w Pythonie

Czyszczenie i tokenizacja danych

  • Podział tekstu na tokeny i czyszczenie danych
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']
Analiza skupień w Pythonie

Macierz dokument-termin i macierze rzadkie

  • Tworzona jest macierz dokument-termin
  • Większość elementów macierzy to zera

Źródło

  • Tworzona jest rzadka macierz

Źródło

Analiza skupień w Pythonie

TF-IDF (Term Frequency - Inverse Document Frequency)

  • Miara ważona: ocena znaczenia słowa w dokumencie w zbiorze
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)
Analiza skupień w Pythonie

Klastrowanie z rzadką macierzą

  • kmeans() w SciPy nie obsługuje rzadkich macierzy
  • Użyć .todense() do konwersji na macierz
cluster_centers, distortion = kmeans(tfidf_matrix.todense(), num_clusters)
Analiza skupień w Pythonie

Najważniejsze terminy w klastrach

  • Centra klastrów: listy o rozmiarze równym liczbie terminów
  • Każda wartość w centrum klastra to jego waga
  • Utworzyć słownik i wyświetlić najważniejsze terminy
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']
Analiza skupień w Pythonie

Dodatkowe uwagi

  • Praca z hiperłączami, emotikonami itp.
  • Normalizacja słów (run, ran, running -> run)
  • .todense() może nie działać przy dużych zbiorach danych
Analiza skupień w Pythonie

Czas na ćwiczenia!

Analiza skupień w Pythonie

Preparing Video For Download...