Python gensim LDA主题建模中用于查找相似文本的固定大小主题向量

Python gensim LDA主题建模中用于查找相似文本的固定大小主题向量,python,gensim,lda,topic-modeling,cosine-similarity,Python,Gensim,Lda,Topic Modeling,Cosine Similarity,我使用gensim LDA主题建模来查找每个文档的主题,并通过比较收到的主题向量来检查文档之间的相似性。 每个文档都有不同数量的匹配主题,因此向量的比较(通过余弦相似性)是不正确的,因为需要相同长度的向量 这是相关代码: lda_model_bow = models.LdaModel(corpus=bow_corpus, id2word=dictionary, num_topics=3, passes=1, random_state=47) #---------------Calculatin

我使用gensim LDA主题建模来查找每个文档的主题,并通过比较收到的主题向量来检查文档之间的相似性。 每个文档都有不同数量的匹配主题,因此向量的比较(通过余弦相似性)是不正确的,因为需要相同长度的向量

这是相关代码:

lda_model_bow = models.LdaModel(corpus=bow_corpus, id2word=dictionary, num_topics=3, passes=1, random_state=47)

#---------------Calculating and Viewing the topics----------------------------
vec_bows = [dictionary.doc2bow(filtered_text.split()) for filtered_text in filtered_texts]

vec_lda_topics=[lda_model_bow[vec_bow] for vec_bow in vec_bows]

for id,vec_lda_topic in enumerate(vec_lda_topics):
    print ('document ' ,id, 'topics: ', vec_lda_topic)
输出向量为:

document  0 topics:  [(1, 0.25697246), (2, 0.08026043), (3, 0.65391296)]
document  1 topics:  [(2, 0.93666667)]
document  2 topics:  [(2, 0.07910537), (3, 0.20132676)]
.....
如您所见,每个向量都有不同的长度,因此不可能在它们之间执行余弦相似性

我希望输出为:

document  0 topics:  [(1, 0.25697246), (2, 0.08026043), (3, 0.65391296)]
document  1 topics:  [(1, 0.0), (2, 0.93666667), (3, 0.0)]
document  2 topics:  [(1, 0.0), (2, 0.07910537), (3, 0.20132676)]
.....

有什么办法吗?tnx

我以前使用过
gensim
进行主题建模,我没有遇到过这个问题。理想情况下,如果您通过
num_topics=3
,则它返回每个文档概率最高的前3个主题。然后,您应该能够通过如下操作生成余弦相似性矩阵:

lda_model_bow = models.LdaModel(corpus=bow_corpus, id2word=dictionary, num_topics=3, passes=1, random_state=47)
vec_lda_topics = lda_model_bow[bow_corpus]
sim_matrix = similarities.MatrixSimilarity(vec_lda_topics)
但出于某种原因,如果你得到的主题数量不等,那么你可以假设剩余主题的概率值为零,并在计算相似度时将它们包含在向量中


附言:如果你能提供一份输入文档的样本,那么复制输出并查看它会更容易。

正如评论中所说的,还有,解决方案是根据gensim.ldamodel的文档将
最小_概率
从默认值
0.01
更改为
0.0

num_topics(int,可选)–从训练语料库中提取的请求潜在主题的数量。
如果是,这是我要将文本分成的主题总数,而不是前3个。您是否也检查了此参数:
最小概率(浮动,可选)
–概率低于此阈值的主题将被过滤掉?其默认值为
0.01
。你的一些主题可能因为低概率而被过滤掉。我刚找到这个解决方案,想在这里更新。这正是我一直在寻找的解决方案。非常感谢。