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个主题中的每一个获得单词云。我想要一个输出,为8个主题提供8个字云。 如果有人可以帮我解决这个问题,那就太好了。
答案 0 :(得分:2)
假设您已经培训过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()
我将突出显示您的代码中的一些错误,以便您可以更好地遵循我上面所写的内容。
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()
虽然从不同的图书馆你可以看到topic visualizations with corresponding code的结果(免责声明:我是该图书馆的作者)。
答案 1 :(得分:0)
以下对我有用:
首先,创建一个lda模型并定义集群/主题,如Topic Clustering中所述 - 确保minimum_probability为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]
获取每个群集的Word Cloud。您可以尽可能多地包含停用词。确保清除群集中的数据,如删除停用词,词干等。我正在跳过这些步骤,以便每个群集都有清理的文本/文档。
wordcloud = WordCloud(relative_scaling = 1.0, stopwords=("xxx", 'yyy').generate(' '. join(cluster1))
最后使用matplotlib绘制文字云
plt.imshow(wordcloud)