代码之家  ›  专栏  ›  技术社区  ›  Jane Sully

k-means聚类在主题建模中的理解与应用

  •  0
  • Jane Sully  · 技术社区  · 6 年前

    我有以下代码 https://pythonprogramminglanguage.com/kmeans-text-clustering/ 关于文档聚类。虽然我了解k-means算法的整体情况,但对于每个集群的顶级术语表示什么以及如何计算这些术语,我有点难以理解?它是群集中出现频率最高的单词吗?我读过的一篇博文说,最后输出的单词代表“最接近簇质心的前n个单词”(但实际单词“最接近”簇质心意味着什么)。我真的很想了解事情的细节和细微差别。谢谢您!

    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.cluster import KMeans
    from sklearn.metrics import adjusted_rand_score
    
    documents = ["This little kitty came to play when I was eating at a restaurant.",
                 "Merley has the best squooshy kitten belly.",
                 "Google Translate app is incredible.",
                 "If you open 100 tab in google you get a smiley face.",
                 "Best cat photo I've ever taken.",
                 "Climbing ninja cat.",
                 "Impressed with google map feedback.",
                 "Key promoter extension for Google Chrome."]
    
    vectorizer = TfidfVectorizer(stop_words='english')
    X = vectorizer.fit_transform(documents)
    
    true_k = 2
    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
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   user9937571    6 年前

    当单词被转换成向量时,我们讨论单词的相似性。例如,可以使用余弦相似度来确定两个单词之间的距离。“dog”和“puppy”的向量是相似的,所以可以说这两个词彼此很接近。 换句话说,亲密度也取决于语境词。所以,根据句子,单词对(the,cat)可以很接近。这就是word2vec或类似算法创建词向量的工作原理。

        2
  •  0
  •   James Allen-Robertson    6 年前

    本文中的“Top”与文本转换为数值数组的方式直接相关。通过使用TFIDF,您可以根据每个文档中单词的流行程度为每个单词分配一个分数,这与整个文档集中的流行程度相反。文档中得分高的词表示它比其他词更重要或更具代表性。

    因此,对于每个集群的这一代顶级术语来说,它们是在该集群的文档中平均最重要的词。

    这里的方法是有效的,但是我发现很难理解我自己,我不认为这是特别直观的,因为很难理解为什么,如果 cluster_centers_ 是质心的坐标,那么坐标数最高的特征是最上面的单词。我有点明白,但不完全明白(如果有人想解释这是如何工作的,那就太好了!).

    我使用另一种方法来找到一个更直观的集群的顶级术语。我刚刚在250个文档的语料库中测试了你自己发布的方法,上面的单词完全一样。我的方法的价值在于,它可以工作,但是只要您能够提供集群分配列表(任何集群算法都应该提供),就可以对文档进行集群,这意味着您不依赖于 集群中心_ 属性。我认为,这也更直观。

    import numpy as np
    
    def term_scorer(doc_term_matrix, feature_name_list, labels=None, target=None, n_top_words=10):
    
        if target is not None:
            filter_bool = np.array(labels) == target
            doc_term_matrix = doc_term_matrix[filter_bool]
        term_scores = np.sum(doc_term_matrix,axis=0)
        top_term_indices = np.argsort(term_scores)[::-1]
    
        return [feature_name_list[term_idx] for term_idx in top_term_indices[:n_top_words]]
    
    term_scorer(X, terms, labels=model.labels_, target=1, n_top_words=10)
    

    这个 model.labels_ 属性提供每个文档的群集分配列表。在这个例子中,我想找到集群1的最上面的单词,所以我分配 target=1 ,函数过滤 X 只保留分配给群集1的行的数组。然后,它对整个文档行的所有分数进行求和,这样它就有一个单独的行,每个单词有一个列。然后使用 argsort 若要按最高值将该行排序为最低值,请将这些值替换为单词的原始索引位置。最后,它使用列表理解从最高分到 n_top_words 然后通过在 feature_name_list .