微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Python 中绘制文本数据的 KMeans 聚类

如何解决在 Python 中绘制文本数据的 KMeans 聚类

我有代码可以清理一些文本数据,使用 TfidfVectorizer 对其进行矢量化,并通过 KMeans 模型运行。一切正常,除了实际绘制集群。

我不完全理解 TfidVectorizer 的输出

例如:

vectorizer = TfidfVectorizer()

X = vectorizer.fit_transform(df['column 1'].values.astype('U'))

print(X)

(0,36021)  0.17081171474660714

(0,36020)  0.17081171474660714

(0,36011)  0.13668653157547714

有人可以帮助我了解如何实际绘制集群吗?我有点不知道该去哪里。或者是否有更好的向量化器可用于 KMeans?

另外,当我查看聚类中心时,我看到了奇怪的输出,它最终有几千列,如下所示......它是一个相对较小的数据集,大约有 3000 条文本记录

print(kmeans.cluster_centers_)

[[8.71020045e-05 8.71020045e-05 8.71020045e-05 ... 1.34902052e-05
  1.34902052e-05 1.34902052e-05]

以下是推荐的聚类示例代码

df = pd.read_csv('----------------.csv')

vectorizer = TfidfVectorizer()

X = vectorizer.fit_transform(df['column 1'].values.astype('U'))

true_k = 10
model = KMeans(n_clusters=true_k,init='k-means++',max_iter=100,n_init=1)

model.fit(X)

print('Top Terms Per Cluster:')
order_centroids = model.cluster_centers_.argsort()[:,::-1]
terms = vectorizer.get_feature_names()
for i in range(true_k):
    print('cluster %d' % i),for ind in order_centroids[i,:10]:
        print(' %s' % terms[ind]),print

print(model.cluster_centers_)
print(X)

解决方法

TfidfVectorizer 将数据的每一行转换为浮点数的稀疏向量,其中向量的维数等于由 TfidfVectorizer 确定的词汇表的大小(因此您得到的矩阵为n_docs x n_vocab)。通常词汇量将远大于文档的数量。 KMeans 在这个高维空间中计算聚类中心。如果要在 2d 或 3d 中可视化这些集群,则需要对 Tfidf 向量和 KMeans 中心使用某种形式的降维。由于 Tfidf 矩阵是稀疏的,因此拟合在 Tfidf 矩阵上的 TruncatedSVD 可能就是您想要的。

这是一个玩具示例:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
from sklearn.decomposition import TruncatedSVD

docs = [
    "aa bb cc dd ee ff","aa bb cc gg hh ii","dd ee ff gg hh ii",]

vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(docs)

km = KMeans(n_clusters=3,init='k-means++',max_iter=100,n_init=1)
km.fit(X)

tsvd = TruncatedSVD(n_components=2).fit(X)
projected_docs = tsvd.transform(X)
projected_centers = tsvd.transform(model.cluster_centers_)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。