如何在gensim中仅访问主题词

10
我用Gensim构建了LDA模型,现在只想获取主题词,不需要概率和ID。我尝试过gensim中的print_topics()和show_topics()函数,但是无法获得干净的单词。以下是我使用的代码:

我使用了以下代码:

dictionary = corpora.Dictionary(doc_clean)
doc_term_matrix = [dictionary.doc2bow(doc) for doc in doc_clean]
Lda = gensim.models.ldamodel.LdaModel
ldamodel = Lda(doc_term_matrix, num_topics=12, id2word = dictionary, passes = 100, alpha='auto', update_every=5)
x = ldamodel.print_topics(num_topics=12, num_words=5)
for i in x:
    print(i[1])
    #print('\n' + str(i))

0.045*تعرض + 0.045*الماضية + 0.045*السنوات + 0.045*وءسرته + 0.045*لءحمد
0.021*مصر + 0.021*الديمقراطية + 0.021*حرية + 0.021*باسم + 0.021*الحكومة
0.068*المواطنة + 0.068*الطاءفية + 0.068*وانهيارات + 0.068*رابطة + 0.005*طبول
0.033*عربية + 0.033*انكسارات + 0.033*رهابيين + 0.033*بحقوق + 0.033*ل
0.007*وحريات + 0.007*ممنهج + 0.007*قواءم + 0.007*الناس + 0.007*دراج
0.116*طبول + 0.116*الوطنية + 0.060*يكتب + 0.060*مصر + 0.005*عربية
0.064*قيم + 0.064*وهن + 0.064*عربيا + 0.064*والتعددية + 0.064*الديمقراطية
0.036*تضامنا + 0.036*الشخصية + 0.036*مع + 0.036*التفتيش + 0.036*الءخلاق
0.052*تضامنا + 0.052*كل + 0.052*محمد + 0.052*الخلوق + 0.052*مظلوم
0.034*بمواطنين + 0.034*رهابية + 0.034*لم + 0.034*عليهم + 0.034*يثبت
0.035*مع + 0.035*ومستشار + 0.035*يستعيدا + 0.035*ءرهقهما + 0.035*حريتهما
0.064*للقمع + 0.064*قريبة + 0.064*لا + 0.064*نهاية + 0.064*مصر

我尝试了show_topics,它给出了相同的输出

y = np.array(ldamodel.show_topics(num_topics=12, num_words=5))
for i in y[:,1]:
    #if i != '%d':
    #print([str(word) for word in i])
    print(i)
如果我有主题ID,我该如何访问其单词和其他信息。
提前致谢。
6个回答

7
我认为下面的代码片段应该给你一个元组列表,其中每个元组包含该主题(tp)及其相应词汇列表(wd)。
x=ldamodel.show_topics(num_topics=12, num_words=5,formatted=False)
topics_words = [(tp[0], [wd[0] for wd in tp[1]]) for tp in x]

#Below Code Prints Topics and Words
for topic,words in topics_words:
    print(str(topic)+ "::"+ str(words))
print()

#Below Code Prints Only Words 
for topic,words in topics_words:
    print(" ".join(words))

5
另一个答案提供了一个带有每个单词关联权重的字符串。但是,如果您想要将主题中的每个单词单独获取以进行进一步处理,则可以尝试此方法。在这里,主题号是字典的键,值是一个包含该主题中所有单词的单个字符串,以空格分隔。
x=ldamodel.show_topics()

twords={}
for topic,word in x:
    twords[topic]=re.sub('[^A-Za-z ]+', '', word)
print(twords)

2
假设您的模型名为ldamodel
my_dict = {'Topic_' + str(i): [token for token, score in ldamodel.show_topic(i, topn=10)] for i in range(0, ldamodel.num_topics)}

我们需要(针对两个主题):

print(my_dict)

{'Topic_0': ['excel',
  'data',
  'learn',
  'feedback',
  'coaching',
  'tips',
  'digital',
  'use',
  'team',
  'people'],
 'Topic_1': ['leadership',
  'decisions',
  'business',
  'agile',
  'people',
  'change',
  'global',
  'data',
  'team',
  'leaders']}

或者 my_dict['Topic_0'],我们得到:
['excel',
 'data',
 'learn',
 'feedback',
 'coaching',
 'tips',
 'digital',
 'use',
 'team',
 'people']

1
show_topic(<目标主题的id>, <你想要的相关词的数量>)会返回一个由(词语,概率)组成的列表。详情请参考gensim.models.ldamodel.LdaModel文档
使用operator模块中的itemgetter(<idx>)可以帮助你从可迭代对象(如上述元组)中取出第一个元素(如果是0,或者其他任意位置的idx)。
假设你的模型变量是lda_model,你想要从5个主题中获取10个词语(默认情况下show_topic中的topn=10参数):
from operator import itemgetter

for n in range(5):
    print(list(map(itemgetter(0), [*lda_model.show_topic(n)])))

我会用range进行迭代,但使用enumerate来获取主题编号是更好的做法。

0
你可以在 gensim 中使用 get_topic_terms(),而不是 print_topics() 和 show_topics() 函数。
假设您有以下两个变量:id2word 和 lda_model,它们的定义如下:
corpus_words = [['term1', 'term_2'], ['term3', 'term4']]
id2word = gensim.corpora.Dictionary(corpus_words)
corpus = [id2word.doc2bow(text) for text in corpus_words]
lda_model = gensim.models.LdaMulticore(corpus=corpus, id2word=id2word, num_topics=2)

通过调用 get_topic_terms() 方法:
[ lda_model.get_topic_terms(tid, topn=3)] for tid in range(2) ]

你得到了每个主题的3个单词ID和它们的分数。

接下来需要的是:

[ [(id2word[wid], s) for (wid, s) in lda_model.get_topic_terms(tid, topn=3)] for tid in range(2)]

[[('term1', 0.32463402), ('term_2', 0.3211307), ('term4', 0.18077125)], 
 [('term3', 0.3250474), ('term4', 0.31788236), ('term_2', 0.18025273)]]

0
在现代的gensim中,不需要解析或使用标记-id映射。简而言之就是:
list(w for w,_ in lda.show_topic(topicid=7,topn=10))

使用show_topc,它可以按topicid返回每个主题的前topn个单词。例如:
['change',
 'https',
 '#leadershipofchange',
 '#changemanagement',
 '#cx',
 'leadership',
 'management',
 'customer',
 'experience',
 '#customerexperience']

注意:已在 gensim==4.3 下测试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接