文本聚类和主题提取

Posted

技术标签:

【中文标题】文本聚类和主题提取【英文标题】:Text Clustering and topic extraction 【发布时间】:2013-05-25 18:07:01 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

差距统计 预测强度

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

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

【讨论】:

感谢您的回复!很高兴你提出了 TF-IDF 设置。我目前使用 0.05-0.95% 范围内的 1-3 ngram。我看到很多人使用非常低的 max_df,如您建议的 0.5。这不会丢弃太多相关的单词。我确实知道在 kmeans 中选择 k 的几种方法,您提到了其中的一些。我可能自己可以实现其中一个,但我更喜欢使用模块。与完整的高斯混合模型搜索相比,使用 kmeans 有什么优势吗,因为其中包含了 kmeans? 我凭经验发现丢弃过于频繁的文本特征(超过文档的 50%)以更好地用于文本聚类,因为聚类更加分离,因此更容易找到 k-means(更稳定解决方案)。另一方面,对于文本分类,max_df 的最佳点通常在 0.75 和 1 之间(通过与监督信号的交叉验证发现)。至于 GMM 与 KMeans,k-means 的训练速度更快。 好的,我会尝试使用 df 边界。我仍然非常喜欢 nmf 主题。我的线性代数技能非常有限,所以我很难理解文学。一些消息来源说 NMF 分解过程基本上是一种聚类算法。所以我想我还不如直接使用聚类算法?假设我设法获得了一些基于 BIC 选择的 GMM 的集群。我将如何为每个集群提取主题? NMF 可以解释为对具有正值特征的样本进行软分配的聚类算法(例如,将样本分配给几个集群/主题,而不是更多的可能性)。要提取 GMM 的主题,您可以自省 n_features 组件并根据矢量化器的词汇表对它们进行解释,如 NMF 和 K-Means 模型。【参考方案2】:

对于 LDA,我发现 this paper 给出了很好的解释。

【讨论】:

请注意,link-only answers are discouraged,SO 答案应该是寻找解决方案的终点(与另一个中途停留的参考相比,它往往会随着时间的推移变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。【参考方案3】:

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

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

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

【讨论】:

以上是关于文本聚类和主题提取的主要内容,如果未能解决你的问题,请参考以下文章

对比传统K-Means等聚类算法,LDA主题模型在文本聚类上有何优缺点

用R进行网站评论文本挖掘聚类

算法总结

案例| 用R进行网站评论文本挖掘聚类

[转]python进行中文文本聚类(切词以及Kmeans聚类)

词袋模型(bag of words)构建并使用主题模型(topic models)特征进行文本聚类分析(clustering analysis)实战