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

2024-06-01 06:17:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: infromimportospltreplacereaderen
2条回答

假设您已经训练过gensim lda模型,那么您只需使用以下代码创建一个word cloud

# 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()

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

WordCloud().generate(something)希望一些是原始文本。它将标记它,将其小写并删除停止字,然后计算单词cloud。你需要词的大小来匹配它们在一个主题中的概率(我假设)。

lda.print_topics(8, 200)返回主题的文本表示,如prob1*"token1" + prob2*"token2" + ...中所示,您需要lda.show_topic(topic, num_words)以获得具有相应概率的单词作为元组。然后需要WordCloud().fit_words()来生成单词cloud。

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

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

尽管从另一个库中可以看到topic visualizations with corresponding code的结果(免责声明:我是该库的作者之一)。

以下对我有效: 首先,创建一个lda模型并定义集群/主题,如Topic Clustering中所述-确保最小概率为0。 接下来,使用lda_corpus = lda[corpus]确定LDA语料库 现在将属于每个主题的数据中的文档标识为一个列表,下面的示例有两个主题。df是我的原始数据,它有一个列文本

cluster1 = [j for i,j in zip(lda_corpus,df.texts) if i[0][1] > .2]
cluster2 = [j for i,j in zip(lda_corpus,df.texts) if i[1][1] > .2]

获取每个集群的单词Cloud。你可以包括尽可能多的停止语。确保清除集群中的数据,如删除停止字、词干等。我跳过这些步骤,以便每个集群都清除了文本/文档。

wordcloud = WordCloud(relative_scaling = 1.0, stopwords=("xxx", 'yyy').generate(' '. join(cluster1))

最后使用matplotlib绘制word cloud

plt.imshow(wordcloud)

相关问题 更多 >