聚类文本文档并获取重复的顶级术语

Clustering text documents and obtaining duplicate top terms

我发现 中的代码非常有用。 (我会对此添加评论 post 但我需要 50 点声望。)

我在上面的 post 中使用了相同的代码,但添加了一个我一直用来调试我自己的集群代码的测试文档。由于某种原因,1 个文档中的单词出现在两个集群中。

密码是:

更新:我在下面的文档中添加了 "Unique sentence"。

documents = ["I ran yesterday.", 
                "The sun was hot.", 
                "I ran yesterday in the hot and humid sun.", 
                "Yesterday the sun was hot.",
                "Yesterday I ran in the hot sun.",
                "Unique sentence." ]

vectorizer = TfidfVectorizer(stop_words='english')
X = vectorizer.fit_transform(documents)

#cluster 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 clusters    
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

我收到的输出是:

更新:我更新了下面的输出以反映上面的 "unique sentence"。

簇 0: 太阳 热的 昨天 运行 湿 独特 句子 集群 1: 独特 句子 昨天 太阳 运行 湿 热门

您会注意到 "humid" 在两个集群中都显示为顶部术语,即使它仅出现在上述文档的 1 行中。我希望一个独特的词,如 "humid" 在这种情况下,仅在其中一个集群中成为顶级术语。

谢谢!

不一定。您使用的代码创建了语料库词袋(不包括停用词)的向量 space(我忽略了 tf-idf 权重。)。查看您的文档,您的向量 space 大小为 5,单词数组如下(忽略顺序):

word_vec_space = [yesterday, ran, sun, hot, humid]

每个文档都分配了一个数字向量,表示它是否包含 'word_vec_space' 中的单词。

"I ran yesterday." -> [1,1,0,0,0]
"The sun was hot." -> [0,0,1,1,0]
...

执行 k 均值聚类时,您在向量中选择 k 个起点 -space 并允许这些点四处移动以优化聚类。您最终得到了两个包含 'humid' 的非零值的聚类质心。这是因为包含 'humid' 的一个句子也有 'sun''hot''yesterday'

TF*IDF 告诉您单词(在本例中为列)对特定文档(在本例中为行)的代表性。我所说的代表是指:一个词在一个文档中频繁出现,但在其他文档中不频繁出现。 TF*IDF 值越高,这个词就越能代表一个特定的文档。

现在让我们开始了解您实际使用的价值观。从 sklearn 的 kmeans 你使用 return 变量 cluster_centers。这将为您提供每个聚类的坐标,这是一个 TF*IDF 权重数组,每个单词一个。重要的是要注意,这些只是词频的某种抽象形式,不再与特定文档相关。接下来,numpy.argsort() 为您提供对数组进行排序的索引,从最低 TF*IDF 值的索引开始。所以在那之后你用 [:, ::-1] 反转它的顺序。现在你有了开头那个聚类中心最有代表性的词的索引。

现在,让我们多谈谈 k-means。 k-means 随机初始化它的 k-cluster 中心。然后将每个文档分配给一个中心,然后重新计算聚类中心。重复此操作,直到满足最小化文档与其最近中心之间的平方距离之和的优化标准。这对您意味着,由于随机初始化,每个簇维度很可能没有 TF*IDF 值 0。此外,一旦满足优化标准,k-means 就会停止。因此,一个中心的 TF*IDF 值仅意味着分配给其他聚类的文档的 TF*IDF 更接近该中心而不是其他聚类中心。

另外一点是,使用 order_centroids[i, :10],打印了每个集群的 10 个最有代表性的单词,但由于您只有 5 个总计单词,所有单词都将以不同的顺序打印。

希望对您有所帮助。顺便说一句,k-means 不能保证您找到全局最优值,并且可能会陷入局部最优值,这就是为什么它通常 运行 多次具有不同的随机起点。

为什么聚类会有不同的顶级术语?

考虑集群是否有效(通常它不会 - 请注意),您认为这些集群是好是坏:

  • 香蕉水果
  • 苹果果实
  • 苹果电脑
  • windows 计算机
  • window 百叶窗

如果我能得到这样的聚类,我会很高兴(事实上,我相信我看到了一个错误,因为这些结果太神了。文本聚类总是无法正常工作)。

对于文本集群,很多都是关于词的组合,而不仅仅是单个词。苹果水果和苹果电脑不一样