如何使用gensim的LDA进行文本检索?

3
我正在尝试了解如何使用LDA进行文本检索,目前我正在使用gensim的LdaModel模型来实现LDA,链接在这里:https://radimrehurek.com/gensim/models/ldamodel.html
我已经成功地识别出了k个主题及其最常用的单词,并且我理解LDA是关于主题的概率分布以及单词在文档中如何分布在这些主题中的,所以这一点很有道理。
然而,我不知道如何使用LdaModel来检索与字符串搜索查询(例如“避孕的负面影响”)相关的文档。我已经尝试在搜索查询上推断主题分布,并使用gensim的similarities.MatrixSimilarity计算余弦相似度来查找搜索查询的主题分布和语料库中的主题分布之间的相似性: lda = LdaModel(corpus, num_topics=10) index = similarities.MatrixSimilarity(lda[corpus]) query = lda[query_bow] sims = index[query]
但表现并不好。我认为,找到搜索查询的主题分布并没有太多意义,因为通常只有一个主题在搜索查询中。但我不知道如何在gensim的LdaModel上实现其他方法。任何建议都将非常感激,我是主题建模的新手,也许我错过了一些对我来说显而易见的东西?谢谢!
1个回答

4
我认为您的文本查询长度太短,和/或每个查询主题数量与长度比例太小,这对于您想要实现的目标来说是不够的。
如果您想使用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个主题是可行的。对于较小的语料库,则不太清楚。

即使有更多的主题,我认为您的查询文本仍然可能过于简短。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接