如何打印lda主题模型和每个主题的文字云

Raj*_*Raj 6 python word-cloud topic-modeling

from nltk.tokenize import RegexpTokenizer
from stop_words import get_stop_words
from gensim import corpora, models
import gensim
import os
from os import path
from time import sleep
import matplotlib.pyplot as plt
import random
from wordcloud import WordCloud, STOPWORDS
tokenizer = RegexpTokenizer(r'\w+')
en_stop = set(get_stop_words('en'))
with open(os.path.join('c:\users\kaila\jobdescription.txt')) as f:
    Reader = f.read()

Reader = Reader.replace("will", " ")
Reader = Reader.replace("please", " ")


texts = unicode(Reader, errors='replace')
tdm = []

raw = texts.lower()
tokens = tokenizer.tokenize(raw)
stopped_tokens = [i for i in tokens if not i in en_stop]
tdm.append(stopped_tokens)

dictionary = corpora.Dictionary(tdm)
corpus = [dictionary.doc2bow(i) for i in tdm]
sleep(3)
ldamodel = gensim.models.ldamodel.LdaModel(corpus, num_topics=8, id2word = dictionary)
topics = ldamodel.print_topics(num_topics=8, num_words=200)
for i in topics:
    print(i)
    wordcloud = WordCloud().generate(i)
    plt.imshow(wordcloud)
    plt.axis("off")
    plt.show()
Run Code Online (Sandbox Code Playgroud)

问题在于云.我无法为8个主题中的每一个获得单词云.我想要一个输出,为8个主题提供8个字云.如果有人可以帮我解决这个问题,那就太好了.

kat*_*ras 4

假设您已经训练了 gensim lda 模型,您可以使用以下代码简单地创建词云

# lda is assumed to be the variable holding the LdaModel object
import matplotlib.pyplot as plt
for t in range(lda.num_topics):
    plt.figure()
    plt.imshow(WordCloud().fit_words(lda.show_topic(t, 200)))
    plt.axis("off")
    plt.title("Topic #" + str(t))
    plt.show()
Run Code Online (Sandbox Code Playgroud)

我将突出显示您的代码中的一些错误,以便您可以更好地遵循我上面所写的内容。

WordCloud().generate(something)期望某些内容是原始文本。它将对其进行标记、小写并删除停用词,然后计算词云。您需要字大小来匹配它们在主题中的概率(我假设)。

lda.print_topics(8, 200)返回主题的文本表示,因为prob1*"token1" + prob2*"token2" + ...您需要以lda.show_topic(topic, num_words)元组的形式获取具有相应概率的单词。然后你需要WordCloud().fit_words()生成词云。

以下代码是具有上述可视化效果的代码。我还想指出,您从单个文档中推断主题,这是非常不常见的,而且可能不是您想要的。

from nltk.tokenize import RegexpTokenizer
from stop_words import get_stop_words
from gensim import corpora, models
import gensim
import os
from os import path
from time import sleep
import matplotlib.pyplot as plt
import random
from wordcloud import WordCloud, STOPWORDS
tokenizer = RegexpTokenizer(r'\w+')
en_stop = set(get_stop_words('en'))
with open(os.path.join('c:\users\kaila\jobdescription.txt')) as f:
    Reader = f.read()

Reader = Reader.replace("will", " ")
Reader = Reader.replace("please", " ")


texts = unicode(Reader, errors='replace')
tdm = []

raw = texts.lower()
tokens = tokenizer.tokenize(raw)
stopped_tokens = [i for i in tokens if not i in en_stop]
tdm.append(stopped_tokens)

dictionary = corpora.Dictionary(tdm)
corpus = [dictionary.doc2bow(i) for i in tdm]
ldamodel = gensim.models.ldamodel.LdaModel(corpus, num_topics=8, id2word = dictionary)
for t in range(ldamodel.num_topics):
    plt.figure()
    plt.imshow(WordCloud().fit_words(ldamodel.show_topic(t, 200)))
    plt.axis("off")
    plt.title("Topic #" + str(t))
    plt.show()
Run Code Online (Sandbox Code Playgroud)

尽管从不同的库中您可以看到主题可视化以及结果的相应代码(免责声明:我是该库的作者之一)。

  • 感谢您的回答。但是,在最新版本的 wordcloud 中,“fit_words”采用字典,而“lda.show_topic”返回元组列表。我必须使用“plt.imshow(WordCloud().fit_words(dict(lda.show_topic(t, 200))))”行才能使其正常工作。 (10认同)