Dokumentklustring

Klusteranalys i Python

Shaumik Daityari

Business Analyst

Dokumentklustring: begrepp

  1. Rensa data innan bearbetning
  2. Bestäm termernas vikt i ett dokument (i TF-IDF-matris)
  3. Klustra TF-IDF-matrisen
  4. Hitta de viktigaste termerna och dokumenten i varje kluster
Klusteranalys i Python

Rensa och tokenisera data

  • Dela upp text i mindre delar (tokens) och rensa data inför bearbetning
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']
Klusteranalys i Python

Dokument-term-matris och glesa matriser

  • Dokument-term-matris skapas
  • De flesta elementen i matrisen är nollor

Källa

  • En gles matris skapas

Källa

Klusteranalys i Python

TF-IDF (Term Frequency - Inverse Document Frequency)

  • Ett viktat mått: mäter hur viktig ett ord är för ett dokument i en samling
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)
Klusteranalys i Python

Klustring med gles matris

  • kmeans() i SciPy stöder inte glesa matriser
  • Använd .todense() för att konvertera till en matris
cluster_centers, distortion = kmeans(tfidf_matrix.todense(), num_clusters)
Klusteranalys i Python

Vanligaste termer per kluster

  • Klustercenter: listor med storlek lika med antalet termer
  • Varje värde i klustercentret anger termens vikt
  • Skapa en ordbok och skriv ut de viktigaste termerna
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']
Klusteranalys i Python

Fler överväganden

  • Hantera hyperlänkar, emojis m.m.
  • Normalisera ord (run, ran, running -> run)
  • .todense() fungerar inte alltid med stora datamängder
Klusteranalys i Python

Nu kör vi en övning!

Klusteranalys i Python

Preparing Video For Download...