使用 Python 的 Scikit-Learn 库对文本数据进行聚类并绘图

Posted

技术标签:

【中文标题】使用 Python 的 Scikit-Learn 库对文本数据进行聚类并绘图【英文标题】:Clustering text data with Python's Scikit-Learn lib and plotting 【发布时间】:2019-12-25 16:12:14 【问题描述】:

我是聚类的新手,我正在学习文本聚类。 我找到了一种制作集群的方法,现在我试图找到一种方法来绘制它们。 这是我想绘制集群时遇到的错误:

ValueError: setting an array element with a sequence.

这是我的代码:

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

x = ['this is very good show' , 'i had a great time on my school trip', 'such a boring movie', 'Springbreak was amazing'
     'i love this product' , 'this is an amazing item', 'this food is delicious', 'I had a great time last night', 
     'this is my favourite restaurant' , 'i love this food, its so good', 'skiing is the best sport', 'what is this',
     'I love basketball, its very dynamic' , 'its a shame that you missed the trip', 'game last night was amazing',
     'such a nice song' , 'this is the best movie ever', 'hawaii is the best place for trip','how that happened',
     'I cant believe that you did that', 'Why are you doing that, I do not gete it', 'this is tasty']

cv = CountVectorizer(analyzer = 'word', max_features = 5000, lowercase=True, preprocessor=None, tokenizer=None, stop_words = 'english')  
x = cv.fit_transform(x)    

my_list = []

for i in range(1,8):

    kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 0)
    kmeans.fit(x)
    my_list.append(kmeans.inertia_)

plt.plot(range(1,8),my_list)
plt.show()


kmeans = KMeans(n_clusters = 5, init = 'k-means++', random_state = 0)
y_kmeans = kmeans.fit_predict(x)

plt.scatter(x[y_kmeans == 0,0], x[y_kmeans==0,1], s = 15, c= 'red', label = 'Cluster_1')
plt.scatter(x[y_kmeans == 1,0], x[y_kmeans==1,1], s = 15, c= 'blue', label = 'Cluster_2')
plt.scatter(x[y_kmeans == 2,0], x[y_kmeans==2,1], s = 15, c= 'green', label = 'Cluster_3')
plt.scatter(x[y_kmeans == 3,0], x[y_kmeans==3,1], s = 15, c= 'cyan', label = 'Cluster_4')
plt.scatter(x[y_kmeans == 4,0], x[y_kmeans==4,1], s = 15, c= 'magenta', label = 'Cluster_5')

plt.scatter(kmeans.cluster_centers_[:,0], kmeans.cluster_centers_[:,1], s = 100, c = 'black', label = 'Centroids')
plt.show()

我做错了什么,我想看看每个集群中分组了哪些句子,甚至可以这样绘制吗? 如何测试发现的集群的重要性?

【问题讨论】:

到你的第二点:***.com/questions/43784903/… 【参考方案1】:

最初你的观察是句子。在对它们应用 CountVectorizer 之后,您的观察结果现在是 62 维向量。你从 pyplot 得到一个值错误(我不清楚你想绘制什么,因为你的向量是这么高的维度)。

据我所知,您的模型将对代词(“this”、“that”等)过于敏感。许多模型删除了这些和其他stop words

【讨论】:

感谢您对停用词的回答。我想知道是否有可能绘制这样的图来表示图表上的句子/单词集群 你的向量 y_kmeans 有你每个句子的簇号。您可以使用它来查看每个集群中正在重新组合哪些句子 那怎么看? 所以如果我添加stop_words = 'english',它会自动删除没有“价值”/“意义”的词吗?我想从我的集群中绘制句子组

以上是关于使用 Python 的 Scikit-Learn 库对文本数据进行聚类并绘图的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python (scikit-learn) 计算 FactorAnalysis 分数?

将 PMML 模型导入 Python (Scikit-learn)

python机器学习——使用scikit-learn训练感知机模型

在 scikit-learn 中使用 python 生成器 [关闭]

python中使用scikit-learn的决策树算法运行错误

python 使用scikit-learn框架来分类