gensim 的 get_document_topics 方法返回的概率加起来不为一
probabilities returned by gensim's get_document_topics method doesn't add up to one
有时所有主题的 return 概率都很好,但有时只有几个主题的 return 概率加起来不等于一个,似乎取决于文档。一般return几个话题,概率加起来差不多80%,那么return就是最相关的话题吗?有没有办法强制它达到 return 所有概率?
也许我遗漏了什么,但我找不到该方法参数的任何文档。
我正在研究 LDA 主题建模并遇到了这个 post。我确实创建了两个主题,比如 topic1 和 topic2。
每个主题的前10个词如下:0.009*"would" + 0.008*"experi" + 0.008*"need" + 0.007*"like" + 0.007*"code" + 0.007*"work" + 0.006*"think" + 0.006*"make" + 0.006*"one" + 0.006*"get
0.027*"ierr" + 0.018*"line" + 0.014*"0.0e+00" + 0.010*"error" + 0.009*"defin" + 0.009*"norm" + 0.006*"call" + 0.005*"type" + 0.005*"de" + 0.005*"warn
最终,我拿了1份文件来确定最接近的主题。
for d in doc:
bow = dictionary.doc2bow(d.split())
t = lda.get_document_topics(bow)
输出为[(0, 0.88935698141006414), (1, 0.1106430185899358)]
.
要回答您的第一个问题,文档的概率总和为 1.0,这就是 get_document_topics 所做的。该文档明确指出,它 returns 给定文档 bow 的主题分布,作为 (topic_id, topic_probability) 2 元组的列表。
此外,我尝试get_term_topics关键字“ierr”
t = lda.get_term_topics("ierr", minimum_probability=0.000001)
结果是[(1, 0.027292299843400435)]
无非就是每个话题的贡献这个词,有道理
因此,您可以根据使用 get_document_topics 获得的主题分布来标记文档,并且可以根据 get_term_topics 给出的贡献来确定单词的重要性。
希望对您有所帮助。
我遇到了同样的问题,通过在调用 gensim.models.ldamodel.LdaModel
对象的 get_document_topics
方法时包含参数 minimum_probability=0
解决了这个问题。
topic_assignments = lda.get_document_topics(corpus,minimum_probability=0)
默认情况下,gensim 不会输出低于 0.01 的概率,因此对于任何文档,如果有任何主题分配的概率低于此阈值,则主题概率之和为该文件加起来不等于一个。
这是一个例子:
from gensim.test.utils import common_texts
from gensim.corpora.dictionary import Dictionary
from gensim.models.ldamodel import LdaModel
# Create a corpus from a list of texts
common_dictionary = Dictionary(common_texts)
common_corpus = [common_dictionary.doc2bow(text) for text in common_texts]
# Train the model on the corpus.
lda = LdaModel(common_corpus, num_topics=100)
# Try values of minimum_probability argument of None (default) and 0
for minimum_probability in (None, 0):
# Get topic probabilites for each document
topic_assignments = lda.get_document_topics(common_corpus,minimum_probability=minimum_probability)
probabilities = [ [entry[1] for entry in doc] for doc in topic_assignments ]
# Print output
print(f"Calculating topic probabilities with minimum_probability argument = {str(minimum_probability)}")
print(f"Sum of probabilites:")
for i, P in enumerate(probabilities):
sum_P = sum(P)
print(f"\tdoc {i} = {sum_P}")
输出为:
Calculating topic probabilities with minimum_probability argument = None
Sum of probabilities:
doc 0 = 0.6733324527740479
doc 1 = 0.8585712909698486
doc 2 = 0.7549994885921478
doc 3 = 0.8019999265670776
doc 4 = 0.7524996995925903
doc 5 = 0
doc 6 = 0
doc 7 = 0
doc 8 = 0.5049992203712463
Calculating topic probabilities with minimum_probability argument = 0
Sum of probabilites:
doc 0 = 1.0000000400468707
doc 1 = 1.0000000337604433
doc 2 = 1.0000000079162419
doc 3 = 1.0000000284053385
doc 4 = 0.9999999937135726
doc 5 = 0.9999999776482582
doc 6 = 0.9999999776482582
doc 7 = 0.9999999776482582
doc 8 = 0.9999999930150807
此默认行为在文档中没有明确说明。 get_document_topics
方法的 minimum_probability
的默认值为 None
,但是这不会将概率设置为零。相反,minimum_probability
的值设置为 gensim.models.ldamodel.LdaModel
对象的 minimum_probability
的值,默认情况下为 0.01,如您在 source code:
def __init__(self, corpus=None, num_topics=100, id2word=None,
distributed=False, chunksize=2000, passes=1, update_every=1,
alpha='symmetric', eta=None, decay=0.5, offset=1.0, eval_every=10,
iterations=50, gamma_threshold=0.001, minimum_probability=0.01,
random_state=None, ns_conf=None, minimum_phi_value=0.01,
per_word_topics=False, callbacks=None, dtype=np.float32):
有时所有主题的 return 概率都很好,但有时只有几个主题的 return 概率加起来不等于一个,似乎取决于文档。一般return几个话题,概率加起来差不多80%,那么return就是最相关的话题吗?有没有办法强制它达到 return 所有概率?
也许我遗漏了什么,但我找不到该方法参数的任何文档。
我正在研究 LDA 主题建模并遇到了这个 post。我确实创建了两个主题,比如 topic1 和 topic2。
每个主题的前10个词如下:0.009*"would" + 0.008*"experi" + 0.008*"need" + 0.007*"like" + 0.007*"code" + 0.007*"work" + 0.006*"think" + 0.006*"make" + 0.006*"one" + 0.006*"get
0.027*"ierr" + 0.018*"line" + 0.014*"0.0e+00" + 0.010*"error" + 0.009*"defin" + 0.009*"norm" + 0.006*"call" + 0.005*"type" + 0.005*"de" + 0.005*"warn
最终,我拿了1份文件来确定最接近的主题。
for d in doc:
bow = dictionary.doc2bow(d.split())
t = lda.get_document_topics(bow)
输出为[(0, 0.88935698141006414), (1, 0.1106430185899358)]
.
要回答您的第一个问题,文档的概率总和为 1.0,这就是 get_document_topics 所做的。该文档明确指出,它 returns 给定文档 bow 的主题分布,作为 (topic_id, topic_probability) 2 元组的列表。
此外,我尝试get_term_topics关键字“ierr”
t = lda.get_term_topics("ierr", minimum_probability=0.000001)
结果是[(1, 0.027292299843400435)]
无非就是每个话题的贡献这个词,有道理
因此,您可以根据使用 get_document_topics 获得的主题分布来标记文档,并且可以根据 get_term_topics 给出的贡献来确定单词的重要性。
希望对您有所帮助。
我遇到了同样的问题,通过在调用 gensim.models.ldamodel.LdaModel
对象的 get_document_topics
方法时包含参数 minimum_probability=0
解决了这个问题。
topic_assignments = lda.get_document_topics(corpus,minimum_probability=0)
默认情况下,gensim 不会输出低于 0.01 的概率,因此对于任何文档,如果有任何主题分配的概率低于此阈值,则主题概率之和为该文件加起来不等于一个。
这是一个例子:
from gensim.test.utils import common_texts
from gensim.corpora.dictionary import Dictionary
from gensim.models.ldamodel import LdaModel
# Create a corpus from a list of texts
common_dictionary = Dictionary(common_texts)
common_corpus = [common_dictionary.doc2bow(text) for text in common_texts]
# Train the model on the corpus.
lda = LdaModel(common_corpus, num_topics=100)
# Try values of minimum_probability argument of None (default) and 0
for minimum_probability in (None, 0):
# Get topic probabilites for each document
topic_assignments = lda.get_document_topics(common_corpus,minimum_probability=minimum_probability)
probabilities = [ [entry[1] for entry in doc] for doc in topic_assignments ]
# Print output
print(f"Calculating topic probabilities with minimum_probability argument = {str(minimum_probability)}")
print(f"Sum of probabilites:")
for i, P in enumerate(probabilities):
sum_P = sum(P)
print(f"\tdoc {i} = {sum_P}")
输出为:
Calculating topic probabilities with minimum_probability argument = None
Sum of probabilities:
doc 0 = 0.6733324527740479
doc 1 = 0.8585712909698486
doc 2 = 0.7549994885921478
doc 3 = 0.8019999265670776
doc 4 = 0.7524996995925903
doc 5 = 0
doc 6 = 0
doc 7 = 0
doc 8 = 0.5049992203712463
Calculating topic probabilities with minimum_probability argument = 0
Sum of probabilites:
doc 0 = 1.0000000400468707
doc 1 = 1.0000000337604433
doc 2 = 1.0000000079162419
doc 3 = 1.0000000284053385
doc 4 = 0.9999999937135726
doc 5 = 0.9999999776482582
doc 6 = 0.9999999776482582
doc 7 = 0.9999999776482582
doc 8 = 0.9999999930150807
此默认行为在文档中没有明确说明。 get_document_topics
方法的 minimum_probability
的默认值为 None
,但是这不会将概率设置为零。相反,minimum_probability
的值设置为 gensim.models.ldamodel.LdaModel
对象的 minimum_probability
的值,默认情况下为 0.01,如您在 source code:
def __init__(self, corpus=None, num_topics=100, id2word=None,
distributed=False, chunksize=2000, passes=1, update_every=1,
alpha='symmetric', eta=None, decay=0.5, offset=1.0, eval_every=10,
iterations=50, gamma_threshold=0.001, minimum_probability=0.01,
random_state=None, ns_conf=None, minimum_phi_value=0.01,
per_word_topics=False, callbacks=None, dtype=np.float32):