我使用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
答案 0 :(得分:1)
我以前使用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)
但是由于某些原因,如果您获得的主题数量不相等,则可以为其余主题假定零概率值,并在计算相似度时将其包括在向量中。
P.s .:如果您可以提供输入文档的样本,则可以更轻松地重现输出并对其进行调查。
答案 1 :(得分:0)
因此,正如https://formidable.com/open-source/victory/gallery/brush-zoom/在评论中以及panktijk中所说,解决方案是将minimum_probability
从默认值0.01
转换为0.0
。 / p>