2016-10-27 6 views
3
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() 

문제는 cloud라는 단어와 관련이 있습니다. 나는 8 개의 화제의 각각을 위해 낱말 구름을 얻을 수 없다. 8 가지 주제에 대해 8 단어 구름을 제공하는 결과를 원합니다. 누구든지이 문제와 관련하여 도움을받을 수 있다면 큰 도움이 될 것입니다.각 토픽의 lda 토픽 모델과 단어 클라우드를 인쇄하는 방법

답변

1

당신은 단순히 다음 코드

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

당신은 더 나은 내가 위에 쓴 팔로우 할 수 있습니다 난 당신의 코드에 대한 몇 가지 실수를 강조 표시와 단어 구름을 만들 수 gensim LDA 모델을 훈련 한 가정.

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 (면책 조항 : 그 라이브러리의 저자 오전)를 참조 할 수 있지만.

+0

감사합니다. 그것은 확실히 내 문제를 해결했습니다. 죄송 합니다만 지금은 업 그레 이드 할 수 없다는 평판을 얻지 못했습니다. – Raj

+0

실제로 jobsdb 데이터를 스크랩하여 분석에 사용했습니다. 스크랩 된 데이터는 주제 모델링에 사용 된 하나의 파일 아래에 컴파일됩니다. – Raj

+1

이 답변을 주셔서 감사합니다. 그러나 최신 버전의 wordcloud에서'fit_words'는 ​​dict를 취하는 반면'lda.show_topic'는 튜플리스트를 반환합니다. 필자는'plt.imshow (WordCloud(). fit_words (dict (ld.show_topic (t, 200))))')라는 줄을 사용하여 작업을 시작해야했습니다. –

0

다음은 나를 위해 일한 : 첫째, LDA 모델을 만들고 Topic Clustering에서 논의 클러스터/주제를 정의 - lda_corpus = lda[corpus] 은 이제부터 문서를 식별하여 LDA 영장을 있는지 확인 minimum_probability은 0 다음입니다 결정 아래의 예는 두 주제를 가지고 있습니다. 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) 
관련 문제