如何实现潜在狄利克雷分配以在主题中给出二元组/三元组而不是一元组

Posted

技术标签:

【中文标题】如何实现潜在狄利克雷分配以在主题中给出二元组/三元组而不是一元组【英文标题】:How to implement Latent Dirichlet Allocation to give bigrams/trigrams in topics instead of unigrams 【发布时间】:2017-10-19 00:51:19 【问题描述】:

我使用 gensim LDAModel 提取客户评论的主题如下:

dictionary = corpora.Dictionary(clean_reviews)
dictionary.filter_extremes(keep_n=11000) #change filters
dictionary.compactify()
dictionary_path = "dictionary.dict"
corpora.Dictionary.save(dictionary, dictionary_path)

# convert tokenized documents to vectors

corpus = [dictionary.doc2bow(doc) for doc in clean_reviews]
vocab = lda.datasets.load_reuters_vocab()  

# Training lda using number of topics set = 10 (which can be changed)

lda = gensim.models.LdaModel(corpus, id2word = dictionary,
                        num_topics = 20,
                        passes = 20,
                        random_state=1,
                        alpha = "auto")

这会返回以下主题中的一元组:

topic1 -delivery,parcel,location

topic2 -app, login, access

但我正在寻找 ngram。我遇到了 sklearn 的 LatentDirichletAllocation,它使用 Tfidf 矢量化器,如下所示:

vectorizer = TfidfVectorizer(analyzer='word', ngram_range=[2,5], stop_words='english', min_df=2)    
X = vectorizer.fit_transform(new_review_list)
clf = decomposition.LatentDirichletAllocation(n_topics=20, random_state=3, doc_topic_prior = .1).fit(X)

我们可以在向量化器中指定 ngram 的范围。是否也可以在 gensim LDA 模型中这样做。

抱歉,我对所有这些模型都很陌生,所以对它们了解不多。

【问题讨论】:

请回答这个问题?! 几年前gensim群里也有类似的问题,groups.google.com/forum/#!topic/gensim/_rlFCl9-BF4 嗨,你找到方法了吗? 【参考方案1】:

我知道这是一个旧线程,但我想我会分享我为获得主题中的 k-gram 所做的事情。我想在我的词汇表中包含二元组、三元组和四元组。为此,我在运行 LDA 模型之前使用了 gensim 的 Phrases 类。 这是一个非常好的资源。

https://www.machinelearningplus.com/nlp/topic-modeling-gensim-python/#15visualizethetopicskeywords

我做过类似的事情。希望这会有所帮助

【讨论】:

以上是关于如何实现潜在狄利克雷分配以在主题中给出二元组/三元组而不是一元组的主要内容,如果未能解决你的问题,请参考以下文章

主题建模 - 将具有前 2 个主题的文档分配为类别标签 - sklearn 潜在狄利克雷分配

Latent Dirichlet Allocation(隐狄利克雷分配模型)——论文翻译与分析

Gensim 的潜在狄利克雷分配实现

使用 PyMC 实现潜在狄利克雷分配 (LDA)

Sklearn 潜在狄利克雷分配如何真正起作用?

潜在狄利克雷分配(LDA,Latent Dirichlet Allocation)模型