부리부리부리

[Python] pyLDAvis & gensim_models 오류 본문

언어/Python

[Python] pyLDAvis & gensim_models 오류

부리부리부리부리 2022. 1. 21. 16:43

ValidationError: * Not all rows (distributions) in topic_term_dists sum to 1.

ValidationError: *Not all rows (distributions) in topic_term_dists sum to 1.

 이 오류 같은 경우는

>> pyLDAvis.show(ldamodel, corpus, dictionary)

ldamodel에 corpus를 Input으로 넣었을 때,

 

이런 식으로 나오는데, 여기서 행의 총합이 1이 안될 경우 생기는 오류이다.

나같은 경우에는 데이터 전처리 때 null data를 지우지 않아서 생긴 오류이다.

(즉, 형태소 분석 및 말뭉치 변환 작업을 했을때 LENGTH가 0이 된 놈을 쳐내주지 않아서 생긴 ERROR)

 

해결하고 나서 들뜬 마음에 다시 돌렸다.

import gensim
from gensim import corpora
import pyLDAvis
import pyLDAvis.gensim_models as gensimvis

"""
	dataset : 형태소 분석을 완료한 단어 집합 
    NUM_TOPICS : LDA model 학습 시 정해야 하는 TOPIC의 개수
    
 """

def LDA(dataset,NUM_TOPICS):

    dictionary = corpora.Dictionary(dataset)
    dictionary.filter_extremes(no_below=10, no_above=0.5)
    corpus = [dictionary.doc2bow(text) for text in dataset]

   
    ldamodel = gensim.models.ldamodel.LdaModel(corpus, num_topics = NUM_TOPICS, id2word=dictionary,
                                               passes=50, random_state=2053)
    lda_visualization = gensimvis.prepare(ldamodel,corpus,dictionary)
    pyLDAvis.show(lda_visualization)

위 코드 실행 시 다음과 같은 오류가 뜬다. 

 '/LDAvis.css': ["text/css", open(urls.LDAVIS_CSS_URL, 'r').read()],
OSError: [Errno 22] Invalid argument: "https://cdn.jsdelivr.net/gh/bmabey/pyLDAvis@3.3.1/pyLDAvis/js/ldavis.v1.0.0.css"

 

근데 이 오류는 진짜 찾아보다가 못찾겠어서 다른 방법을 사용했다.

 pyLDAvis.save_html(lda_visualization, './pyldavis_html.html')

html을 저장해서 내가 직접 웹을 띄워서 확인했다. 

## test.py

import webbrowser
from flask import Flask, render_template
app = Flask(__name__)

@app.route("/")
def hello():
	return render_template('pyldavis_html.html')
webbrowser.open('http://127.0.0.1:5000')

if __name__ == "__main__":
		app.run()

^^^^^^^^ test.py ^^^^^^^

 

render_template( html ) 을 사용하려면 먼저 templates라는 폴더가 코드를 돌리는 pwd에 있어야한다. 

pwd는 다음과 같으므로 

저기서 templates 폴더를 새로 만들어준 뒤에 미리 만들어놓은 pyldavis_html.html 파일을 넣어준다.

그러고 나서 test.py를 실행시켜주면 ... 

 

짜잔~ ㅅㄱ링~