7

我正在使用优秀的 scikit-learn 模块进行一些文本挖掘。我正在尝试对科学摘要进行聚类和分类。

我正在寻找一种方法来对我的一组 tf-id 表示进行聚类,而不必提前指定聚类的数量。我还没有找到一个可以做到这一点的好的算法,并且仍然可以很好地处理大型稀疏矩阵。我一直在研究简单地使用 scikit-learn 的 kmeans,但它没有办法确定最佳集群数量(例如使用 BIC)。我也尝试过使用高斯混合模型(使用最佳 BIC 分数来选择模型),但它们非常慢。

在对文档进行聚类后,我希望能够查看每个聚类的主题,即他们倾向于使用的词。给定数据矩阵和集群标签,有没有办法提取这些信息?也许取集群的平均值并使用 tf-id-vectorizer 对其进行逆变换?我之前曾尝试使用卡方和随机森林来对特征重要性进行排名,但这并没有说明哪个标签类使用什么。

我尝试使用 NMF 分解方法(仅使用 scikit-learns 网站上的示例代码)进行主题检测。它工作得很好,并且很快就产生了非常有意义的主题。但是,我没有找到一种方法来使用它将每个数据点分配给一个集群,也没有自动确定集群的“最佳”数量。但这是我正在寻找的东西。

我还在某处读到可以直接从拟合的 LDA 模型中提取主题信息,但我不明白它是如何完成的。由于我已经实现了 LDA 作为基线分类器和可视化工具,这可能是一个简单的解决方案。

如果我设法产生有意义的集群/主题,我会将它们与一些人造标签(不是基于主题)进行比较,看看它们是如何对应的。但这是另一个线程的主题:-)

4

3 回答 3

4

您可以尝试使用较低的 TF-IDF max_df,例如max_df=0.5,然后使用 k-means(或MiniBatchKMeans)。要为 K 找到一个好的值,您可以尝试以下启发式方法之一:

  • 差距统计
  • 预测强度

此博客文章中提供了执行描述:http ://blog.echen.me/2011/03/19/counting-clusters/

这些方法都没有在 sklearn 中实现。如果您发现其中任何一个对您的问题有用,我会非常感兴趣。如果是这样,讨论如何最好地在 scikit-learn 中贡献默认实现可能会很有趣。

于 2013-05-30T09:36:35.793 回答
2

有两种方法可以解决这个问题:

  • 聚类方法:使用 NMF 给出的变换特征集作为聚类算法的输入。例如,如果您使用 k-means 算法,您可以将 k 设置为您拥有的主题(即新功能/组件)的数量。我认为这篇论文谈到了类似的事情。

  • 标记方法:这是我最近使用的方法。这允许您使用一个或多个主题标记帖子。使用transform()NMF 模型对象的函数得到一个n * n_topics矩阵。然后,为每个主题设置一个阈值。对于我的示例,“0.02”对我来说效果很好。如果相应的值大于该阈值,则将主题分配给文档。请注意,这意味着虽然某些文档分配了多个主题,但有些文档不会分配任何主题。但是,我发现这种方法给出了非常有意义和有趣的结果。

于 2014-07-04T22:20:28.790 回答
0

对于 LDA,我发现这篇论文给出了很好的解释。

于 2014-01-30T09:50:21.807 回答