如何使用 gensim 的 LDA 从查询中进行文本检索?

How to use gensim's LDA to conduct text-retrievals from queries?

我试图了解如何将 LDA 用于文本检索,我目前正在使用 gensim 的 LdaModel 模型来实现 LDA,此处:https://radimrehurek.com/gensim/models/ldamodel.html

我已经设法确定了 k 个主题及其最常用的词,并且我知道 LDA 是关于主题的概率分布以及文档中这些主题中词的分布方式,所以这很有意义。

就是说,我不明白如何使用 LdaModel 检索与搜索查询的字符串输入相关的文档,例如 "negative effects of birth control"。我尝试推断搜索查询的主题分布,并使用 gensim 的 similarities.MatrixSimilarity 计算余弦相似度,找到搜索查询的主题分布与语料库的主题分布之间的相似性,如下所示:

lda = LdaModel(corpus, num_topics=10) index = similarities.MatrixSimilarity(lda[corpus]) query = lda[query_bow] sims = index[query]

但是性能不是很好。我认为找到搜索查询的主题分布意义不大,因为搜索查询中通常只有 1 个主题。但我不知道我还能如何在 gensim 的 LdaModel 上实现它。任何建议将不胜感激,我是主题建模的新手,也许我遗漏了一些对我来说非常明显的东西?谢谢!

我认为您的文本查询长度太小and/or您的主题数量与查询长度的比率对于您想要实现的目标来说太小了。

如果您想使用 LDA 查找与给定查询相似的主题,在大多数情况下,您确实需要每个查询有多个主题才能呈现特定文档而不是整个文档部分。

您上面的 LDA 模型只有 10 个主题,因此您在给定句子中找到多个主题的机会非常低。因此,我已经建议测试在 100 或 200 个主题上训练模型是否会使它变得更好一些。现在,您很有可能在一句话中涉及多个主题。

这里有一个(过于简单的)例子来说明为什么这会起作用:
使用 num_topics=10 您可能有以下主题:

topic_1: "pizza", "pie", "fork", dinner", "farm",...
topic_2: "pilot", "navy", "ocean", "air", "USA", ...
...

现在如果查询句子

"Tonight at dinner I will eat pizza with a fork"

您只会收到 topic_1 作为回复

但是,num_topics=200 您的主题可能是这样的

topic_1: "pizza", "margherita", "funghi",...
topic_2: "fork", "knife", "spoon",...
topic_3: "dinner", "date", "lunch", ...

所以同一句话现在涵盖topic_1topic_2topic_3

现在,如果增加那么多的主题数量会使输出良好,这在很大程度上取决于您的语料库。对于像英语维基百科这样大的内容,200 个主题就可以了。对于较小的语料库,这还不清楚。

即使有更多主题,我相信您的查询文本仍然可能太短。