본문 바로가기
머신러닝/NLP(자연어처리, Natural language processing)

자연어 처리 - 워드클라우드

by 미생22 2024. 5. 28.
728x90

1. 이상한 나라의 앨리스 txt의 워드클라우드

from wordcloud import WordCloud, STOPWORDS
import numpy as np
from PIL import Image

text = open('./NLP/06_alice.txt').read()
print(text)

 

pinkwink github에서 txt파일을 받아서 open, read시켜줍니다.

 

alice_mask = np.array(Image.open('./NLP/06_alice_mask.png'))
alice_mask

 

워드클라우드의 마스크로 쓸 이미지를 가져옵니다.

이렇게 이미지를 open한 뒤 np.array()로 감싸는 것은 원래 이미지가 pixel인데 숫자로 나타내는 겁니다.

 

이제 stopwords를 가져와보겠습니다. stopwords는 wordcloud나 자연어처리에서 크게 영향을 주지 않는다고 판단되는 단어입니다.

 

stopwords = set(STOPWORDS)
stopwords

 

그리고 이상한나라의 앨리스는 said라는 단어가 특히 많다고 합니다. said도 stopwords에 포함시키겠습니다.

 

stopwords.add('said')

 

matplotlib 한글 대응하는 코드도 혹시 모르니 들고옵니다.

 

import matplotlib.pyplot as plt
import platform
from matplotlib import font_manager, rc

path = 'C:/Windows/Fonts/malgun.ttf'
if platform.system() == 'Darwin':
    rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc('font', family=font_name)
else:
    print('Unknown system... sorry')

get_ipython().run_line_magic('matplotlib', 'inline')

 

plt.title('헬로우')

 

제대로 한글이 나오는지 확인해보겠습니다.

 

이제 alice_mask가 어떻게 생겼는지 보겠습니다.

 

plt.figure(figsize=(8,8))
plt.imshow(alice_mask, cmap=plt.cm.gray, interpolation='bilinear')

 

numpy array를 imageshow(imshow)에 뿌리겠습니다. cmap을 plt가 제공하는 gray를 적용시켜보겠습니다.
interpolation 옵션은 이미지의 block과 block이 이어질때 어떤식으로 이어지는지를 선택하는 옵션인데, 화질이 좋으면 큰 차이가 없습니다.

 

 

네 이제 이 검은 부분에 글자들이 모일 예정입니다.

 

wc = WordCloud(
    background_color='white', max_words=2000, mask=alice_mask, stopwords=stopwords
)

wc = wc.generate(text)

 

text에는 이상한 나라의 앨리스 원문이 들어있었죠.

WordCloud()에 옵션을 주어 설정한뒤, .generate()함수에 text를 넣어 워드클라우드를 만듭니다.

 

이렇게 만들어진 wordcloud(wc)는 단어의 발생 빈도를 알아서 갖고있습니다.

 

wc.words_

 

단어의 발생 빈도를 뱉습니다.

 

 

이런식으로 단어와 단어가 얼마나 자주 등장했는지를 나타내줍니다.

이제 wc를 plt.imshow()에 넣어 그려주겠습니다.

그냥 그리면 축이 보이므로 axis('off')를 시켜줍니다.

plt.figure(figsize=(12, 12))
plt.imshow(wc)
plt.axis('off')
plt.show()

2. 스타워즈 워드클라우드

다음으로 강사님이 좋아하는 스타워즈 원문을 들고와 스타워즈 그림에 워드클라우드를 만들어보겠습니다.

 

text = open('./NLP/06_a_new_hope.txt').read()
text = text.replace('HAN', 'Han')
text = text.replace("LUKE'S", 'Luke')

mask = np.array(Image.open('./NLP/06_stormtrooper_mask.png'))

 

자주나오는 쓸모없는 단어를 stopwords에 포함시킵니다.

 

stopwords.add('int')
stopwords.add('ext')

wc = WordCloud(
    max_words=1000, mask=mask, stopwords=stopwords, margin=10, random_state=13
).generate(text)

 

아까는 WordCloud()옵션을 wc에 넣고, wc.generate(text)를 시켰는데 이걸 한번의 코드로 넣어준겁니다.

margin은 워드 클라우드 이미지의 가장자리와 텍스트 사이의 여백을 의미합니다.

뒤에 나오는 relative_scaling은 텍스트들 사이의 여백을 말합니다.

 

지금부터 하는 작업은, 워드클라우드를 흑백으로 나타내기 위해서 워드클라우드 사이트에서 알려준 방법입니다.

default_color = wc.to_array()
default_color
import random

def grey_color_func(word, font_size, position, orientation, random_state=None, **kwargs):
    #wordcloud에서 이렇게 하면 단어들의 color를 변경할 수 있다라고 지정한것입니다.

    return 'hsl(0, 0%%, %d%%)' % random.randint(60, 100)

 

이 후 plt.imshow(wc)시에 함수를 줍니다. plt.imshow(wc.recolor(color_func=grey_color_func))을 주면 색상이 들어갑니다.

 

plt.figure(figsize=(12, 12))
plt.imshow(wc.recolor(color_func=grey_color_func, random_state=13))
plt.axis('off')
plt.show()

이렇게하면 조금 멋있어서... color를 바꾸는 작업을 wordcloud에서 찾아서 해본겁니다.

728x90