理解并应用k-means聚类进行主题建模

时间:2018-06-12 23:33:21

标签: python scikit-learn k-means topic-modeling centroid

我在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 个答案:

答案 0 :(得分:0)

当单词转换为向量时,我们会谈论单词的接近程度,因为它们的相似程度。因此,例如,您可以使用余弦相似性来确定两个单词彼此之间的接近程度。 "狗"的矢量和小狗"将是相似的,所以你可以说这两个词是彼此接近的。 换句话说,亲密度也由上下文词确定。因此,根据句子,单词对(the,cat)可以很接近。这就是word2vec或类似算法如何工作来创建单词向量。

答案 1 :(得分:0)

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

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

在这里完成的方式有效并且有效但我觉得很难理解自己,我认为它不是特别直观,因为很难理解为什么,如果cluster_centers_是合作的对于质心的纵坐标,那么具有最高坐标数的特征是顶部单词。我有点得到它但不完全(如果有人想解释这是如何工作那将是伟大的!)。

我使用不同的方法来查找群集的顶级术语,我发现它更直观。我刚刚在250个文档的语料库中测试了您使用我自己发布的方法,并且顶部的单词完全相同。我的方法的价值在于,只要您可以提供集群分配列表(任何集群算法应该提供),它就可以对文档进行集群,这意味着您不依赖于{{1}的存在}属性。我认为,这也更直观。

cluster_centers_

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) 属性为您提供每个文档的群集分配列表。在这个例子中,我想找到集群1的顶部单词,所以我分配model.labels_,该函数过滤target=1数组,只保留分配给集群1的行。然后汇总文档行中的所有分数明智的,所以它有一个单行,每个单词都有一列。然后使用X将该行按最高值排序为最低值,将值替换为单词的原始索引位置。最后,它使用列表推导从最高分获取索引号到argsort,然后通过在n_top_words中查找这些索引来构建单词列表。