【问题标题】:Get values from K-Means clusters using dataframe使用数据框从 K-Means 集群中获取值
【发布时间】:2019-02-03 13:02:17
【问题描述】:

我有这个数据框(text_df):

有 10 位不同的作者,共有 13834 行文本。

然后我创建了一个词袋并像这样使用了 TfidfVectorizer:

from sklearn.feature_extraction.text import TfidfVectorizer

tfidf_v = TfidfVectorizer(max_df=0.5,
                          max_features=13000,
                          min_df=5,
                          stop_words='english',
                          use_idf=True,
                          norm=u'l2',
                          smooth_idf=True
                          )

X = tfidf_v.fit_transform(corpus).toarray() # corpus --> bagofwords
y = text_df.iloc[:,1].values

X 的形状是 (13834,2701)

我决定为 KMeans 使用 7 个集群:

from sklearn.cluster import KMeans
km = KMeans(n_clusters=7,random_state=42)

我想提取每个集群中文本的作者,以查看作者是否一致地分组到同一个集群中。不确定解决此问题的最佳方法。谢谢!

更新:

尝试使用嵌套字典来可视化每个集群的作者计数,如下所示:

author_cluster = {}
for i in range(len(y_kmeans)):
    # check 20 random predictions
    j = np.random.randint(0, 13833, 1)[0]

    if y_kmeans[j] not in author_cluster:
        author_cluster[y_kmeans[j]] = {}

        if y[j] not in author_cluster[y_kmeans[j]]:
            author_cluster[y_kmeans[j]][y[j]] = 1 
        else:
            author_cluster[y_kmeans[j]][y[j]] += 1

输出:

每个集群应该有更多的计数,并且每个集群可能不止一位作者。我想使用所有预测来获得更准确的计数,而不是使用子集。但对替代解决方案持开放态度。

【问题讨论】:

  • 这可能是相关的:stackoverflow.com/a/29801076/8146556
  • 如果有 10 个不同的作者,为什么不是 10 个集群?另外,为什么要为此使用 KMeans?如果您有标记数据,为什么不构建分类器?
  • @Sam H. 这是家庭作业。稍后我将使用分类器,但前半部分需要使用聚类算法。我使用 7 个集群,因为我使用肘部方法来找到最佳集群数。
  • @rahlf23 这种方法有替代方案吗?

标签: python pandas nlp k-means


【解决方案1】:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans

tfidf_v = TfidfVectorizer(max_df=0.5,
                          max_features=13000,
                          min_df=5,
                          stop_words='english',
                          use_idf=True,
                          norm=u'l2',
                          smooth_idf=True
                          )

X = tfidf_v.fit_transform(corpus) # I removed .toarray() - not sure why it was there except maybe for print debugging?
y = text_df.iloc[:,1].values

km = KMeans(n_clusters=7,random_state=42)

model = km.fit(X)
result = model.predict(X)

for i in range(20):
    # check 20 random predictions
    container = np.random.randint(low=0, high=13833, size=1)
    j = container[0]
    print(f'Author {y[j]} wrote {X[j]} and was put in cluster {result[j]}') 

【讨论】:

  • j = np.random.randint(0,13833,1)[0] 完成了什么?
  • 我将该行分成两行,并试图使其更清晰。你能说出它现在在做什么吗?
  • 没问题!这足以让你到达那里吗?
  • 可以分享数据吗?
猜你喜欢
  • 2018-11-05
  • 1970-01-01
  • 2020-10-24
  • 2017-03-11
  • 2022-12-13
  • 2021-04-19
  • 2012-11-01
  • 2012-11-06
  • 2018-10-04
相关资源
最近更新 更多