Python

Colab) Wordcloud 한글이 보이지 않을 때, 워드클라우드 만들기, 주피터 노트북, R프로그램 KoNLP 설치 실패. 워드 클라우드 저장하는 코드

summerorange 2022. 4. 25. 01:23
반응형

텍스트 분석을 할 때 시각화를 하기 위해서 워드 클라우드를 만들곤 한다. 그런데 JupyterNotebook에서 KoNLP를 실행하려고 하거나 또는 R 프로그램에서 워드클라우드 만들려고 KoNLP 설치하다가 실패하는 경우가 있다. KoNLP 설치하려다가 경로 설정과 자바 다시 설치하고, 운영체제 건들이다가 이래저래 고생하는 경우가 있다. 이거 내 이야기. 난 그랬다 호호. 몇 번 컴퓨터와 싸우고 빌고 서로 많이 힘들어하다가... 다시 화해하고 어떻게든 문제를 해결하려고 하고. 설치 과정이 상당히 험난했다.  

워드 클라우드 한글 깨지는 문제

워드 클라우드 자체를 만들수 없는 경우, 만들었는데 한글이 깨지는 경우가 있다. KoNLP 해결하는 방법은 예전에 포스팅을 했었는데 사실 파일 설치하고 하는 과정에서 많은 에러가 있어서 이전에는 로컬 컴퓨터에서 다 설치하고 진행했었지만. 바쁠 때는 다른 방법으로 한다.

방법은... 코랩을 쓴다. 핫ㅋㅋㅋ 코랩 쓰는 게 정말 빠르다. 덤으로 체력과 에너지를 아낄 수 있다.

Colab에는 자동적으로 워드클라우드 기능이 설치 되어 있어서 pip install wordcloud 하지 않아도 된다. 또 KoNLP 설치 할 때 특히 R 프로그램에서는.... 후... 한국어 자연어 처리를 간단하게 할 수 있는 오픈소스 라이브러리이고 업데이트가 그렇게 자주되진 않는다. 이런 거 감안해서 프로그램 쓰다보니 설치 과정이 상당히 까다롭다고 느껴졌다.

코랩에서는 pip install konlp 한 문장 쳐서, 로컬 컴퓨터에서 작업할 때 수없이 많은 경로 설정과 에러를 수정하는 번거로운 과정을 거치지 않아도 된다. 물론 해당 파일에만 적용되고 다른 파일로 넘어가면 다시 쳐줘야 하지만 그래도 간편하다고 생각한다.

온갖 환경 변수와 설정에 시달리는 대신 코랩 쓰세요...

 

Colab에서 WordCloud 및 KoNLP 사용하기


 

1. KoNLP 설치

!pip install konlpy

2. font 설치해준다.

위에 워드클라우드가 깨지는 건 코랩에서는 한글 폰드 경로를 설정해주지 않아서이다.

!apt-get update -qq

한글 폰트로 나눔 폰트를 설치해주었다. 그 외 폰트를 지정해주어도 상관없다. 하단 코드는 자유롭게.

!apt-get install fonts-nanum* -qq

그리고 현재 폰트 리스트는 다음과 같이 확인한다.

import matplotlib.font_manager as fm
sys_font = fm.findSystemFonts()

[f for f in sys_font if 'Nanum' in f]

그래프에 폰트 설정 경로나 이름 등을 하단과 같이 지정해주어도 된다. 그런데 이 부분은 굳이 돌릴 필요는 없긴 하다. 워드 클라우드 만들 때 사실 잘 안씀.

import matplotlib.font_manager as fm
import matplotlib.pyplot as plt

path = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf'
font_name = fm.FontProperties(fname=path, size=10).get_name()
print(font_name)
plt.rc('font', family=font_name)
fm._rebuild()

3. 텍스트 전처리.

관련한 텍스트 파일이 있어서 해당 파일을 불러들여서 읽고, 불필요한 문자들을 없애고, 관련해서 품사를 달아주고 명사(Noun)만 추출한다. 

from konlpy.tag import Okt
import re
# 텍스트 파일 열기
with open('textAnalysis.txt', 'r', encoding='utf-8') as f:
  content = f.read()
# 불필요한 부분을 없애주었다. 파이썬 정규 표현식
p = re.compile("[\Wa-zA-Z0-9_]+")
content = re.sub(p, "", content)
# konlp에서 단어를 token하는 방법 중 하나가 okt이다. 여기에선 객체로 만들어 주었다
okt = Okt()
morphs = okt.pos(content)
# 명사만 리스트 형태로 추출
words = [word for word, pos in morphs if pos =="Noun"]
print(words)

엄... 텍스트 전처리를 심플하게 하고 있는데... 어근, 어간 추출, 텍스트 정제와 정규화 과정. stem=True 이런 부분도 있는데 전부 생략되고 정말 간단 버전으로 워드 클라우드를 진행하고 있음! 전처리 과정 토큰화 과정, 정제, 정규화 과정, 어간 추출, 인코딩 과정, 분리하는 과정... 전부 넣으면 너무 방대해진다. 자연어 관련해서 벡터 차원 공간도 나오는데 여기서 부턴 더 심화되고 복잡해진다. 

4. 텍스트 전처리2. 불용어 제거

from collections import Counter
#다음과 같은 불용어를 빼고자 했다.
stopwords = ['제가', '저는', '스스로', '나', '혼자']
result = [x for x in words if x not in stopwords and len(x) > 1]
print(result)

c = Counter(result)
print(c.most_common(10))

이렇게 하면 불용어로를 제거하고 가장 많이 언급된 10개의 단어를 볼 수 있다. 혹은 판다스 array 값으로 지정해서 value_counts()해서 봐도 깔끔하게 볼 수 있다. 추가로 KoNLP는 불용어 사전을 제공해주지 않는다!

해당 불용어와 관련해서는 한국어 불용어 리스트를 참고해서 작성하면 좋다. 일단은 간단하게... 제가, 저는, 스스로, 나 등의 문구를 빼고자 했다.

5. 워드 클라우드 만들기

from wordcloud.wordcloud import FONT_PATH
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from os import path

FONT_PATH = "/usr/share/fonts/truetype/nanum/NanumGothic.ttf"  

text = " ".join(result)
wordcloud = WordCloud(
    max_font_size=100, 
    max_words=55, 
    background_color= 'gray', 
    relative_scaling=.5, 
    width = 500,
    height = 300,
    font_path=FONT_PATH).generate(text)

plt.figure()
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()

이렇게 넣으면 워드 클라우드가 한국어로 나온다. 저기 파라미터 값은 임의로 저정해서 만들면 된다.

해당 파일을 저장하기 위해서는

wordcloud.to_file("fileName.png")

로 하면 현재 경로에 저장된다. 또는 절대 경로 설정해서 원하는 곳에 해당 파일을 저장한다.

이렇게 colab으로 환경 설정 건들이지 않고 워드 클라우드를 간편하게 만들 수 있음! 

반응형