如何仅在gensim中访问主题词

时间:2017-10-03 01:58:25

标签: python nlp gensim lda topic-modeling

我使用Gensim构建了LDA模型,我只想获得主题词我怎么才能得到主题的单词只有概率而没有IDs.words只有

我在gensim中尝试了print_topics()和show_topics()函数,但我无法得到干净的文字!

这是我使用的代码

<Page.BottomAppBar>
    <CommandBar 
        Background="{StaticResource CitiKioskBackgroundBrush}"
        IsOpen="True"
        IsSticky="True"
        Name="appBarName"
        Visibility="Collapsed"
        >
        <CommandBar.PrimaryCommands>
            <AppBarButton Name="SettingAppBarButton"
                      Icon="Setting"
                      Label="Settings" 
                      Foreground="White" Click="SettingAppBarButton_Click"/>
        </CommandBar.PrimaryCommands>
    </CommandBar>
</Page.BottomAppBar>

我尝试了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*مصر

如果我有主题ID,我该如何访问其单词和其他信息

先谢谢

4 个答案:

答案 0 :(得分:4)

我认为下面的代码片段应该为您提供一个包含每个主题(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))

答案 1 :(得分:1)

另一个答案是给出一个字符串,该字符串的权重与每个单词相关。但是,如果您想让一个主题中的每个单词分别进行进一步的工作。然后,您可以尝试一下。这里的主题号是字典的键,值是一个字符串,其中包含该主题中所有单词的空格键

x=ldamodel.show_topics()

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

答案 2 :(得分:0)

假设您的模型名为 it "removes a record from the database" do expect { person.destroy }.to change { Person.count }.by(-1) expect { person.reload }.to raise_error(ActiveRecord::RecordNotFound) end

ldamodel

我们得到(对于 2 个主题):

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']

答案 3 :(得分:0)

您可以在 gensim 中使用 get_topic_terms() 代替 print_topics() 和 show_topics() 函数。

假设您有以下 2 个变量:id2wordlda_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 和它们在 2 个主题中的每一个的分数。

然后,以下将是需要的:

[ [(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)]]