我正在使用优秀的scikit-learn模块进行一些文本挖掘。我正在尝试对科学摘要进行聚类和分类。
我正在寻找一种方法来聚集我的tf-id表示集,而不必事先指定簇的数量。我无法找到一个可以做到这一点的好算法,并且仍能正确处理大型稀疏矩阵。我一直在研究使用scikit-learn的kmeans,但它无法确定最佳簇数(例如使用BIC)。我也尝试使用高斯混合模型(使用最佳BIC分数来选择模型),但它们非常慢。
在我对文档进行聚类之后,我希望能够查看每个聚类的主题,这意味着他们倾向于使用的词。在给定数据矩阵和集群标签的情况下,有没有办法提取这些信息?也许采用聚类的均值并使用tf-id-vectorizer对其进行逆变换?我之前曾尝试使用卡方和随机森林对特征重要性进行排名,但这并不是说哪个标签类使用了什么。
我尝试过使用NMF分解方法(仅使用scikit-learn网站的示例代码)进行主题检测。它工作得很好,很快就产生了非常有意义的话题。但是,我没有找到一种方法来使用它将每个数据点分配给一个集群,也没有自动确定“最佳”集群数。但这是我正在寻找的那种东西。
我还在某处读过,可以直接从合适的LDA模型中提取主题信息,但我不明白它是如何完成的。由于我已经将LDA实现为基线分类器和可视化工具,因此这可能是一个简单的解决方案。
如果我设法制作有意义的群集/主题,我将把它们与一些人造标签(不是基于主题的)进行比较,看看它们是如何对应的。但这是另一个主题的主题: - )
答案 0 :(得分:4)
您可以尝试使用低max_df
的TF-IDF,例如max_df=0.5
然后k-means(或MiniBatchKMeans
)。要找到K的良好价值,您可以尝试其中一种启发式方法:
此博客文章中提供了执行说明:http://blog.echen.me/2011/03/19/counting-clusters/
这些方法都没有在sklearn中实现。如果您发现它们对您的问题有用,我会非常感兴趣。如果是这样,讨论如何在scikit-learn中最好地贡献默认实现可能会很有趣。
答案 1 :(得分:2)
有两种方法可以解决这个问题:
聚类方法:使用NMF给出的转换后的特征集作为聚类算法的输入。例如,如果使用k-means算法,则可以将k设置为您拥有的主题数(即新功能/组件)。我认为paper会谈到这样的事情。
标记方法:这是我最近使用的方法。这允许您使用一个或多个主题标记帖子。使用NMF模型对象的transform()
功能获取n * n_topics
矩阵。然后,为每个主题设置阈值。就我的例子而言,“0.02”对我来说效果很好。如果相应值大于该阈值,则将主题分配给文档。请注意,这意味着虽然某些文档分配了多个主题,但某些文档不会分配任何主题。但是,我发现这种方法给出了非常有意义和有趣的结果。
答案 2 :(得分:0)
对于LDA,我发现this paper给出了非常好的解释。