是否可以为LDA语料库中的每个文档计算文档相似度?

问题描述 投票:1回答:1

我正在阅读有关LDA和文档相似性的笔记本:

https://www.kaggle.com/ktattan/lda-and-document-similarity

在此笔记本中,计算了少量文档的文档相似度,但是我想计算整个语料库的相似度。

而不是像在笔记本电脑中那样使用test_df:

new_bow = dictionary.doc2bow(test_df.iloc[random_article_index,7])
new_doc_distribution = np.array([tup[1] for tup in lda.get_document_topics(bow=new_bow)])

我想使用train_df:

new_bow= [id2word.doc2bow(doc) for doc in train_df['tokenized']]
new_doc_distribution = np.array([[tup[1] for tup in lst] for lst in model.get_document_topics(bow=new_bow)])

但是这是行不通的。我的假设是不可能的,因为用于创建numpy数组的列表(在这种情况下为tup [1])长度不相同。因此无法创建计算詹森散度所需的适当数组。

比我更有经验的人可以告诉我我正在尝试的事情是否可能吗?

python numpy gensim lda
1个回答
0
投票

首先,在Kaggle代码中用户定义的jensen_shannon函数似乎不起作用(在撰写本文时,因此我已将其替换为:

from scipy.spatial.distance import jensenshannon
import numpy as np
def jensen_shannon(query, matrix):
    return np.apply_along_axis(jensenshannon, 1, matrix, query)

接下来,我不确定您要使用id2word做什么,但这是lda模型的参数,因此无法单独调用;它只能按如下方式使用:

lda = ldamodel.LdaModel(corpus, id2word=dictionary)
bow = lda.id2word.doc2bow(doc)

但是,这段代码对于计算整个语料库的相似度不是必需的。您只需要在第一个代码段中将test_df替换为train_df

new_bow = dictionary.doc2bow(train_df.iloc[random_article_index,7])
new_doc_distribution = np.array([tup[1] for tup in lda.get_document_topics(bow=new_bow)])

这使您可以从培训集中分发一份文档的主题。然后,您可以将其插入most_sim_ids = get_most_similar_documents(new_doc_distribution,doc_topic_dist)以获取与此文档最相似的文档。

为了计算整个语料库的相似度,您只需通过遍历训练集中的所有文档来重复相同的操作。

© www.soinside.com 2019 - 2024. All rights reserved.