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