Python Kmean聚类聚类中的顶级术语

Python Kmean聚类聚类中的顶级术语,python,scikit-learn,cluster-analysis,k-means,Python,Scikit Learn,Cluster Analysis,K Means,我正在为集群文档使用python Kmean集群算法。我已经创建了一个术语文档矩阵 from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.cluster import KMeans vectorizer = TfidfVectorizer(tokenizer=tokenize, encoding='latin-1', stop_word

我正在为集群文档使用python Kmean集群算法。我已经创建了一个术语文档矩阵

   from sklearn.feature_extraction.text import TfidfVectorizer
   from sklearn.cluster import KMeans
   vectorizer = TfidfVectorizer(tokenizer=tokenize, encoding='latin-1',
                          stop_words='english')
    X = vectorizer.fit_transform(token_dict.values())
然后,我使用以下代码应用Kmean集群

 km = KMeans(n_clusters=true_k, init='k-means++', max_iter=100, n_init=1)
 y=km.fit(X)
我的下一个任务是查看每个集群中的顶级术语,在googole上搜索表明,许多人使用km.cluster_centers_uu.argsort()[:,:-1]使用以下代码查找集群中的顶级术语:

 print("Top terms per cluster:")
 order_centroids = km.cluster_centers_.argsort()[:, ::-1]
 terms = vectorizer.get_feature_names()
 for i in range(true_k):
     print("Cluster %d:" % i, end='')
     for ind in order_centroids[i, :10]:
         print(' %s' % terms[ind], end='')
         print()
现在我的问题是,据我所知,km.cluster_centers返回簇中心的坐标,例如,如果有100个特征和三个簇,它将返回一个由3行和100列组成的矩阵,代表每个簇的质心。我想了解的是,在上面的代码中如何使用它来确定集群中的顶级术语。 谢谢,任何意见都将不胜感激
纳迪姆

关于星团中心的形状和意义,你是正确的。因为您使用的是Tf Idf矢量器,所以您的“特征”是给定文档中的单词(每个文档都是它自己的向量)。因此,当您对文档向量进行聚类时,形心的每个“特征”都表示该单词与它的相关性。“单词”(在词汇表中)=“特征”(在向量空间中)=“列”(在质心矩阵中)

get\u feature\u names
调用获取列索引到它所表示的单词的映射(从文档中可以看出……如果这不符合预期,只需反转
词汇表
矩阵即可获得相同的结果)

然后,
.argsort()[:,::-1]
行将每个质心转换为其中最“相关”(高度值)的列的排序(降序)列表,从而转换为最相关的单词(因为单词=列)


剩下的代码只是打印,我相信这不需要任何解释。所有的代码实际上都是按照最有价值的特征/单词的降序排列每个质心,然后将这些列映射回它们的原始单词并打印出来。

游戏开始有点晚了,但我有同样的问题,但找不到满意的答案

以下是我所做的:

from sklearn.cluster import MiniBatchKMeans
from sklearn.feature_extraction.text import TfidfVectorizer

# documents you are clustering
docs = ['first document', 'second', 'thrid doc', 'etc.']

# init vectorizer
tfidf = TfidfVectorizer()

# fit vectorizer
tfidf.fit(docs)

# create vecs for your sents
vecs = tfidf.transform(docs)

# fit your kmeans cluster to vecs
# don't owrry about the hyperparameters
clusters = MiniBatchKMeans(
    n_clusters=16, 
    init_size=1024, 
    batch_size=2048, 
    random_state=20
).fit_predict(vecs)

# get dict of {keyword id: keyword name}
labels = tfidf.get_feature_names()

def get_cluster_keywords(vecs, clusters, docs, labels, top_n=10):
    # init a dict where we will count term occurence
    cluster_keyword_ids = {cluster_id: {} for cluster_id in set(clusters)}
    
    # loop through the vector, cluster and content of each doc
    for vec, i, sent in zip(vecs, clusters, docs):
        
        # inspect non zero elements of rows of sparse matrix
        for j in vec.nonzero()[1]:
            
            # check we have seen this keword in this cluster before
            if j not in cluster_keywords[i]:
                cluster_keyword_ids[i][j] = 0
            
            # add a count
            cluster_keyword_ids[i][j] += 1

    # cluster_keyword_ids contains ids
    # we need to map back to keywords
    # do this with the labels param
    return {
        cluster_id: [
            labels[keyword_id] # map from kw id to keyword
            
            # sort through our keyword_id_counts
            # only return the top n per cluster
            for keyword_id, count in sorted(
                keyword_id_counts.items(),
                key=lambda _id, count: count, # sort from highest count to lowest
                reverse=True
            )[:top_n]
        ] for cluster_id, keyword_id_counts in cluster_keyword_ids.items()
    }

我确信我可以查找它,但是
tfidfvectorier
KMeans
来自哪个库?如果你把这个目标对准该软件包中的专家,你可能会得到更好的响应。具体来说,这些信息可以放在标签中,也可以放在问题本身和正文中。我现在提到了我使用过的库,它们来自sklearn.feature_extraction.text import tfidfvectorier from sklearn.cluster import kmeansscnard,感谢您的解释,但是,我仍然有点困惑。我关心的是,一个集群将有“n”个文档,每个文档由一个由“M”项组成的特征向量表示。然而,集群的质心有一个由“M”特征组成的向量,那么集群中的“n”文档中的术语呢。上述代码中的顶部项是通过反转质心提取的。当我们将其反转时,质心中出现的术语将被突出显示,而不是文档中的所有其他术语…….在K-means中,质心是集群中文档的平均值,在Tf-Idf中,所有值都是非负的,因此集群中每个文档中的每个词都将以其质心表示。因此,质心中重要的术语是该集群中所有文档中最重要的术语。没有一个词会被遗漏,但很多都会变得无关紧要。文档向量中最高的Tf Idf值是对该文档最重要的单词;同样地,质心中那些值最高的词是那些对整个集群最重要的词。这有帮助吗?顺便问一下,如果你对仅仅基于文档中单词的存在对文档进行聚类感兴趣,你考虑过研究LDA和主题建模吗?谢谢,这真是一个很好的解释,澄清了我的困惑。是的,我对LDA建模感兴趣。你有任何关于python的链接吗。也许是为了视觉化?