使用 Kmeans 和 TF-IDF 获取词簇

Posted

技术标签:

【中文标题】使用 Kmeans 和 TF-IDF 获取词簇【英文标题】:Get clusters of words using Kmeans and TF-IDF 【发布时间】:2021-04-21 14:01:39 【问题描述】:

我正在尝试对文本单词进行聚类。 假设我有一个文本列表

text=["WhatsApp extends 'confusing' update deadline",
"India begins world's biggest Covid vaccine drive",
"Nepali climbers make history with K2 winter summit"]

我在这个数据上实现了 TF-IDF

vec = TfidfVectorizer()
feat = vec .fit_transform(text)

之后,我应用了 Kmeans

kmeans = KMeans(n_clusters=num).fit(feat)

我很困惑的是我如何获得诸如

之类的词组
cluster 0  
WhatsApp, update,biggest   
cluster 1  
history,biggest ,world's   
etc.

【问题讨论】:

我猜你的字符串列表坏了。有一些 ' 和 , 缺失。你的代码的结果是什么? 【参考方案1】:

您可以使用TfidfVectorizer 类中的get_feature_names() 方法和KMeans 中的预测来检查每个聚类中的单词。

这是一个包含两个集群和您提供的三个句子的最小示例:

import numpy as np
from sklearn.cluster import KMeans
from sklearn.feature_extraction.text import TfidfVectorizer

text = ["WhatsApp extends 'confusing' update deadline",
        "India begins world's biggest Covid vaccine drive",
        "Nepali climbers make history with K2 winter summit"]

vec = TfidfVectorizer()
feat = vec.fit_transform(text)
kmeans = KMeans(2).fit(feat)
pred = kmeans.predict(feat)

for i in range(2):
    print(f"Cluster #i:")
    words = []
    for sentence in np.array(text)[pred==i]:
        words += [fn for fn in vec.get_feature_names() if fn in sentence]
    print(words)

结果:

Cluster #0:
['confusing', 'deadline', 'extends', 'update', 'begins', 'biggest', 'drive', 'vaccine', 'world']
Cluster #1:
['climbers', 'history', 'make', 'summit', 'winter', 'with']

【讨论】:

以上是关于使用 Kmeans 和 TF-IDF 获取词簇的主要内容,如果未能解决你的问题,请参考以下文章

我如何可视化用于 kmeans 聚类的 tf-idf 向量的数据点?

如何用 kmeans 计算 tfidf 矩阵中解释的方差?

使用 sklearn 获取单词的 tf-idf 权重

在不使用 Kmeans 导入的情况下获取 KMeans 轮廓平均分数

如何从 KMeans 集群中获取集群的名称?

使用 KMeans 时为每个质心获取超过 2 个坐标