我正在跟随“英语维基百科”的gensim教程,网址为https://radimrehurek.com/gensim/wiki.html#latent-dirichlet-allocation
在这里它解释说,在训练过程中使用了tf-idf(至少对于LSA来说是这样的,但对于LDA则不太清楚)。
我本来期望将tf-idf转换器应用于新文档,但在教程的结尾处,它建议仅简单地输入一个词袋。
doc_lda = lda[doc_bow]
LDA需要仅使用词袋向量吗?
我正在跟随“英语维基百科”的gensim教程,网址为https://radimrehurek.com/gensim/wiki.html#latent-dirichlet-allocation
在这里它解释说,在训练过程中使用了tf-idf(至少对于LSA来说是这样的,但对于LDA则不太清楚)。
我本来期望将tf-idf转换器应用于新文档,但在教程的结尾处,它建议仅简单地输入一个词袋。
doc_lda = lda[doc_bow]
LDA需要仅使用词袋向量吗?
简而言之:是的,LDA只需要一个词袋向量。
实际上,在gensim教程的维基百科示例中,Radim Rehurek使用预处理步骤生成的TF-IDF语料库。
mm = gensim.corpora.MmCorpus('wiki_en_tfidf.mm')
我相信原因只是这个矩阵是稀疏的且易于处理(并且由于预处理步骤已经存在)。
LDA不一定需要在TF-IDF语料库上进行训练。如果您使用gensim教程中显示的语料库,该模型可以正常工作:语料库和向量空间:
from gensim import corpora, models
texts = [['human', 'interface', 'computer'],
['survey', 'user', 'computer', 'system', 'response', 'time'],
['eps', 'user', 'interface', 'system'],
['system', 'human', 'system', 'eps'],
['user', 'response', 'time'],
['trees'],
['graph', 'trees'],
['graph', 'minors', 'trees'],
['graph', 'minors', 'survey']]
dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]
lda = models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=10, update_every=1, chunksize =10000, passes=1)
请注意,texts
是一个词袋向量。正如你正确指出的那样,这是LDA模型的核心。TF-IDF在其中根本没有任何作用。
事实上,Blei(开发LDA的人)在2003年的论文《潜在狄利克雷分配》中指出,LDA解决了TF-IDF模型的缺点,并摒弃了这种方法。LSA则完全是代数模型,通常(但不一定)使用TF-IDF矩阵,而LDA是一种概率模型,试图估计文档中主题和主题中单词的概率分布。TF-IDF的加权对此并不必要。
不是要反驳Jérôme的回答,tf-idf在潜在狄利克雷分配中有一定程度的应用。正如可以在论文中读到的Blei和Lafferty的主题模型(例如第6页和第12页)中所述,tf-idf得分对于LDA非常有用。它可以用于可视化主题或选择词汇表。 “使用整个词汇表通常计算成本很高。通过TFIDF选择前V个单词是剪枝词汇表的有效方法”。
也就是说,LDA并不需要tf-idf来推断主题,但它可能会有用,并且可以提高您的结果。