使用从潜在Dirichlet分配派生的主题对文档进行聚类


9

我想将Latent Dirichlet Allocation用于项目,并且将gensim库与Python一起使用。找到主题之后,我想使用诸如k-means之类的算法对文档进行聚类(理想情况下,我想对重叠的聚类使用一个好的聚类,因此欢迎提出任何建议)。我设法得到了主题,但它们的形式为:

0.041 *部长+ 0.041 *按键+ 0.041 *瞬间+ 0.041 *有争议的+ 0.041 *总理

为了应用聚类算法并在错误的情况下纠正我,我相信我应该找到一种使用tfidf或word2vec将每个单词表示为数字的方法。

您是否对如何从列表中“剥离”文本信息有什么想法,然后再放回它们以进行适当的乘法?

例如,如果我看到“部长”一词的tfidf权重为0.042,以此类推,那么对于同一主题内的任何其他单词,我应该这样计算:

0.041 * 0.42 + ... + 0.041 * tfidf(Prime)并获得稍后将用于聚类结果的结果。

感谢您的时间。


1
如本教程中所述,您可以将文档表示为矢量。将这些向量聚类。
Emre 2014年

我认识队友,但我必须根据在我的收藏夹上使用LDA后创建的主题将它们聚类。每个主题都应表示为矢量,以便将每个文档与每个主题进行比较并找到每个文档的一个或多个对应主题。
Swan87

您不必将每个单词都表示为向量。通过将学习到的 LDA转换应用于语料库,可以得到整个文档的新表示形式。有关LSI的示例,请参见以下链接:radimrehurek.com/gensim/tut2.html关键部分是他们使用lsi [doc_bow]

Answers:


4

假设LDA生成了一个主题列表,并针对每个文档对每个主题进行了评分,则可以将文档及其评分表示为矢量:

Document | Prime | Minister | Controversial | TopicN | ...
   1       0.041    0.042      0.041          ...
   2       0.052    0.011      0.042          ...

要获取每个文档的分数,您可以运行该文档。通过训练有素的LDA模型 从gensim文档中:

>>> lda = LdaModel(corpus, num_topics=100)  # train model
>>> print(lda[doc_bow]) # get topic probability distribution for a document

然后,您可以在此矩阵上运行k均值,并且应该将相似的文档分组在一起。默认情况下,K均值是一种硬聚类算法,表示将每个文档分类为一个聚类。您可以使用软聚类机制为您提供文档适合聚类的概率得分,这称为模糊k均值https://gist.github.com/mblondel/1451300是一个Python技巧,显示了如何使用scikit learning做到这一点。

ps:我不能发布两个以上的链接


我尝试这样做的目的是“ n”个文档,而没有文档说主题是t。但是,对于说x个文档,所有t个主题prob不会仅显示某些(t-no)主题prob,其中1 <= no <t。当我在较小的文档尺寸上运行实验时,不会发生这种情况。是因为概率为0时根本不打印吗?
Manish Ranjan

0

作为对先前答案的补充,您最好不要仅对源自lda topic-doc分布的成分数据直接运行kmeans,而应使用某些成分数据转换将其投影到ilr或clr之类的欧几里德空间。

示例

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.