从gensim LDA模型中提取主题分布
Extracting Topic distribution from gensim LDA model
我在 python 中使用 gensim 包为一些文本文件创建了 LDA 模型。我想获得学习模型的主题分布。 gensim ldamodel class 中是否有任何方法或从模型中获取主题分布的解决方案?
例如,我使用 coherence 模型根据主题数在 1 到 5 之间找到具有最佳 cohrence 值的模型。在获得最佳模型后,我使用 get_document_topics 方法(感谢 kenhbs)获取用于创建模型的文档中的主题分布。
id2word = corpora.Dictionary(doc_terms)
bow = id2word.doc2bow(doc_terms)
max_coherence = -1
best_lda_model = None
for num_topics in range(1, 6):
lda_model = gensim.models.ldamodel.LdaModel(corpus=bow, num_topics=num_topics)
coherence_model = gensim.models.CoherenceModel(model=lda_model, texts=doc_terms,dictionary=id2word)
coherence_value = coherence_model.get_coherence()
if coherence_value > max_coherence:
max_coherence = coherence_value
best_lda_model = lda_model
最好的有 4 个主题
print(best_lda_model.num_topics)
4
但是当我使用 get_document_topics 时,我得到的文档分发值少于 4 个。
topic_ditrs = best_lda_model.get_document_topics(bow)
print(len(topic_ditrs))
3
我的问题是:对于具有 4 个主题(使用连贯性模型)的文档的最佳 LDA 模型,为什么同一文档的 get_document_topics returns 个主题较少?为什么有些主题的分布很小(小于 1-e8)?
从the documentation开始,您可以使用两种方法。
如果您的目标是获取特定主题的主要术语,请使用 get_topic_terms
:
from gensim.model.ldamodel import LdaModel
K = 10
lda = LdaModel(some_corpus, num_topics=K)
lda.get_topic_terms(5, topn=10)
# Or for all topics
for i in range(K):
lda.get_topic_terms(i, topn=10)
您还可以打印整个底层 np.ndarray
(在标准 LDA 论文中称为 beta 或 phi,尺寸为 (K, V) 或 (V, K))。
phi = lda.get_topics()
编辑:
来自 link 我包含在原始答案中:如果您正在寻找文档的主题分布,请使用
res = lda.get_document_topics(bow)
从文档中可以看出,生成的对象包含以下三个列表:
list of (int, float) – Topic distribution for the whole document. Each element in the list is a pair of a topic’s id, and the probability that was assigned to it.
list of (int, list of (int, float), optional – Most probable topics per word. Each element in the list is a pair of a word’s id, and a list of topics sorted by their relevance to this word. Only returned if per_word_topics was set to True.
list of (int, list of float), optional – Phi relevance values, multipled by the feature length, for each word-topic combination. Each element in the list is a pair of a word’s id and a list of the phi values between this word and each topic. Only returned if per_word_topics was set to True.
现在,
tops, probs = zip(*res[0])
probs
将包含 K(对你来说是 4)个概率。有些可能为零,但它们总和应该为 1
您可以使用 minimum_probability 参数并将其设置为非常小的值,例如 0.000001。
topic_vector = [ x[1] for x in ldamodel.get_document_topics(new_doc_bow , minimum_probability= 0.0, per_word_topics=False)]
只需输入,
pd.DataFrame(lda_model.get_document_topics(doc_term_matrix))
我在 python 中使用 gensim 包为一些文本文件创建了 LDA 模型。我想获得学习模型的主题分布。 gensim ldamodel class 中是否有任何方法或从模型中获取主题分布的解决方案? 例如,我使用 coherence 模型根据主题数在 1 到 5 之间找到具有最佳 cohrence 值的模型。在获得最佳模型后,我使用 get_document_topics 方法(感谢 kenhbs)获取用于创建模型的文档中的主题分布。
id2word = corpora.Dictionary(doc_terms)
bow = id2word.doc2bow(doc_terms)
max_coherence = -1
best_lda_model = None
for num_topics in range(1, 6):
lda_model = gensim.models.ldamodel.LdaModel(corpus=bow, num_topics=num_topics)
coherence_model = gensim.models.CoherenceModel(model=lda_model, texts=doc_terms,dictionary=id2word)
coherence_value = coherence_model.get_coherence()
if coherence_value > max_coherence:
max_coherence = coherence_value
best_lda_model = lda_model
最好的有 4 个主题
print(best_lda_model.num_topics)
4
但是当我使用 get_document_topics 时,我得到的文档分发值少于 4 个。
topic_ditrs = best_lda_model.get_document_topics(bow)
print(len(topic_ditrs))
3
我的问题是:对于具有 4 个主题(使用连贯性模型)的文档的最佳 LDA 模型,为什么同一文档的 get_document_topics returns 个主题较少?为什么有些主题的分布很小(小于 1-e8)?
从the documentation开始,您可以使用两种方法。
如果您的目标是获取特定主题的主要术语,请使用 get_topic_terms
:
from gensim.model.ldamodel import LdaModel
K = 10
lda = LdaModel(some_corpus, num_topics=K)
lda.get_topic_terms(5, topn=10)
# Or for all topics
for i in range(K):
lda.get_topic_terms(i, topn=10)
您还可以打印整个底层 np.ndarray
(在标准 LDA 论文中称为 beta 或 phi,尺寸为 (K, V) 或 (V, K))。
phi = lda.get_topics()
编辑: 来自 link 我包含在原始答案中:如果您正在寻找文档的主题分布,请使用
res = lda.get_document_topics(bow)
从文档中可以看出,生成的对象包含以下三个列表:
list of (int, float) – Topic distribution for the whole document. Each element in the list is a pair of a topic’s id, and the probability that was assigned to it.
list of (int, list of (int, float), optional – Most probable topics per word. Each element in the list is a pair of a word’s id, and a list of topics sorted by their relevance to this word. Only returned if per_word_topics was set to True.
list of (int, list of float), optional – Phi relevance values, multipled by the feature length, for each word-topic combination. Each element in the list is a pair of a word’s id and a list of the phi values between this word and each topic. Only returned if per_word_topics was set to True.
现在,
tops, probs = zip(*res[0])
probs
将包含 K(对你来说是 4)个概率。有些可能为零,但它们总和应该为 1
您可以使用 minimum_probability 参数并将其设置为非常小的值,例如 0.000001。
topic_vector = [ x[1] for x in ldamodel.get_document_topics(new_doc_bow , minimum_probability= 0.0, per_word_topics=False)]
只需输入,
pd.DataFrame(lda_model.get_document_topics(doc_term_matrix))