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

标签 gensim information-retrieval lda topic-modeling

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

我已经成功地识别了 k 个主题及其最常用的单词,并且我知道 LDA 是关于主题的概率分布以及单词如何在文档中的这些主题中分布的,所以这很有意义。

也就是说,我不明白如何使用 LdaModel 来检索与搜索查询的字符串输入相关的文档,例如“节育的负面影响”。我尝试推断搜索查询上的主题分布,并使用 gensim 的相似度查找搜索查询上的主题分布与语料库中的主题分布之间的相似性。MatrixSimilarity 来计算余弦相似度,如下所示:

lda = LdaModel(语料库, num_topics=10) 索引=相似度.MatrixSimilarity(lda[语料库]) 查询 = lda[query_bow] sims =索引[查询]

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

最佳答案

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

如果您想使用 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 个主题就足够了。对于较小的语料库,这一点尚不清楚。

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

关于gensim - 如何使用gensim的LDA从查询中进行文本检索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50033595/

相关文章:

python - Doc2Vec 模型 Python 3 兼容性

scikit-learn - 如何计算 sklearn LDA 模型的一致性分数?

python - 获取每个主题最可能出现的单词

python - 在 scikit 学习中从 LDA 获取主题词分布

text-processing - 术语聚类库?

R - LDA 主题模型输出数据

python - Gensim Word2Vec 'you must first build vocabulary before training the model'

python - 为什么不是所有的二元组都是在 gensim 的 `Phrases` 工具中创建的?

algorithm - 如何检测文本文档中的重复项并返回重复项的相似度?

r - R 中的 princomp 用于 PCA - 输出实例中的分数变量。