根据与 LDA 主题/特征集群的相似性对文本进行分组
Posted
技术标签:
【中文标题】根据与 LDA 主题/特征集群的相似性对文本进行分组【英文标题】:Group texts based on their similarity to LDA topics/feature clusters 【发布时间】:2017-11-18 15:42:00 【问题描述】:我正在开发一个包含论坛主题内容(第一篇帖子 + 回复)的数据库。我想根据第一篇文章的主题对这些文档进行分组/聚类。
我计算了 LDA/LSI 主题并尝试了 K-means 聚类,但我找不到有关如何从聚类中获取相关文本文档的文档。我只获取每个集群的主要功能,但我想要整个文档或每个集群中与之关联的一些 ID。
我还尝试了使用已知机器学习算法的分类器和推荐器,但它们的结果并不是真的有用。我也试过用word2vec和doc2vec计算相似度,结果也不是很精确。
总而言之,我想根据文本文档的相似特征/主题对文本文档进行分组,而不会丢失指向其内容的链接(如 ID)。我还想到了更高级的方法,但我希望它首先起作用。目标是将来自使用软件有相同问题的用户的帖子分组,并且这些问题的原因可能相同。
【问题讨论】:
【参考方案1】:您可以使用 Python 中的 lda 库来创建文档的 LDA 表示,如下所示:
import lda
model = lda.LDA(n_topics=20, n_iter=1500, random_state=1)
model.fit(X)
lda_representation = model.doc_topic_
假设 X 是您的文档矩阵,大小为 n_doc x n_vocab,并且您的 lda 表示大小为 n_doc x n_topics。
然后你将 lda_representations 与 k-means algorithm from sklearn 聚类:
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=10, random_state=0)
kmeans.fit(lda_representation)
clusters = kmeans.labels_
其中 clusters 的大小为 n_docs x 1,是您对每个文档的集群分配,例如 clusters[0] 是 0 之间的数字strong> 到 n_clusters - 1 它告诉你 document_0 属于集群 n。
【讨论】:
谢谢似乎是我正在寻找的,我要试试。但是我使用 gensim 来计算 LDA,但我应该能够使您的代码适应它 我成功了,但我有 len(clusters) = len(vocab)。所以我得到了每个术语所属的位置,而不是每个文档所属的位置(clusters[0] 是 term_0 的簇号而不是 document_0)。我做错什么了吗? 打印 lda_presentation.shape 以确保您将正确的表示提供给 kmeans。 lda_presentation.shape[0] 应该是文档的大小。以上是关于根据与 LDA 主题/特征集群的相似性对文本进行分组的主要内容,如果未能解决你的问题,请参考以下文章
机器学习入门-文本特征-使用LDA主题模型构造标签 1.LatentDirichletAllocation(LDA用于构建主题模型) 2.LDA.components(输出各个词向量的权重值)(代码