文档聚类

Python 中的聚类分析

Shaumik Daityari

Business Analyst

文档聚类:概念

  1. 预处理数据
  2. 计算文档中术语的重要性(TF-IDF 矩阵)
  3. 对 TF-IDF 矩阵聚类
  4. 找出各簇的高频术语与文档
Python 中的聚类分析

清洗并分词

  • 将文本切分为更小的 token,并清洗数据以便处理
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 中的聚类分析

文档-词项矩阵与稀疏矩阵

  • 构建文档-词项矩阵
  • 矩阵中多数元素为 0

来源

  • 生成稀疏矩阵

来源

Python 中的聚类分析

TF-IDF(词频-逆文档频率)

  • 一种加权度量:评估词在语料中文档中的重要性
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 中的聚类分析

用稀疏矩阵聚类

  • SciPy 的 kmeans() 不支持稀疏矩阵
  • 使用 .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...