티스토리 뷰

pip install newspaper3k

모듈 newspaper3k를 설치해준다. newspaper는 웹 기사를 끌어와 문장을 추출해 주는 모듈이다. 

from newspaper import Article
article = Article('https://en.wikipedia.org/wiki/Lifelong_learning')
article.download()
article.parse()

영문 위키피디아에서 lifelong education을 검색하면 lifelong learning으로 자동 연결된다. 

article.text

제대로 끌어오는지 확인할 수 있음. 

from wordcloud import WordCloud
import matplotlib.pyplot as plt

matplotlib과 wordcloud를 가져오자. 

wc = WordCloud()
wc.generate(article.text)
plt.imshow(wc, interpolation="bilinear")
plt.axis('off')
plt.show()

 

interpolation이 무엇인지에 대해서는 좀더 공부를 해봐야겠다. 

axis를 on하면 별로 안 예쁜 게 생기니까 꼭 off해 주기. 

from wordcloud import STOPWORDS

 

 

불용어 처리를 위해서 stopwords를 가져오자. 

wc = WordCloud(background_color="white", max_words=2000, stopwords=STOPWORDS, max_font_size=256, random_state=42, width=500, height=500)
wc.generate(article.text)
plt.imshow(wc, interpolation="bilinear")
plt.axis('off')
plt.show

background color 배경색 / max_words 빈출 단어를 최대 몇 개까지 셀 것인지 / stopwords 불용어 목록 / max_font_size 최대 글꼴 크기 / random_state 난수 고정을 위한 초깃값 설정 / width, height 가로세로

font_path = 'NIAGENG.ttf'
wc = WordCloud(stopwords=STOPWORDS, font_path=font_path, background_color="white", max_words=2000, max_font_size=256, random_state=42)
wc.generate(article.text)
plt.imshow(wc, interpolation="bilinear")
plt.axis('off')
plt.show()
plt.savefig('wordcloud.png')

미리보기 없이 아무 폰트나 대충 눈에 보이는 거 가져왔는데 예뻐서 놀람.

여하튼 font_path로 폰트를 바꿀 수 있다. 한국어도 가능. 


내가 하려는 건 이 워드클라우드를 특정한 이미지 위에 마스킹하는 것이다. 

이미지를 불러올 때는 조건이 있는데, 배경이 흰색이어야 한다. 투명화는 불가능하다. 투명화된 부분을 검정으로 인식하기 때문. 

from PIL import Image
import numpy as np

이제는 익숙해진 numpy를 부른다.

mask = np.array(Image.open('map.png'))
wc = WordCloud(stopwords=STOPWORDS, font_path=font_path, mask=mask, background_color="white", max_words=2000, max_font_size=256, random_state=42, width=mask.shape[1], height=mask.shape[0])
wc.generate(article.text)
plt.imshow(wc, interpolation="bilinear")
plt.axis('off')
plt.show()

나는 부산지역 지도를 map.png로 불러와서 마스킹했다.

그럼 이제 색깔을 약간 커스텀해보자. 

from wordcloud import ImageColorGenerator

컬러 제너레이터를 꺼내서, 

def multi_color_func(word=None, font_size=None, position=None, orientation=None, font_path=None, random_state=None):
    colors=[[4, 77, 82], [25, 74, 85], [82, 43, 84], [158, 48, 79]]
    rand = random_state.randint(0, len(colors)-1)
    return "hsl({}, {}%, {}%)".format(colors[rand][0], colors[rand][1], colors[rand][2])

위와 같은 함수를 정의해 준다. 

두 번째 줄에 들어가는 숫자는 HSV 코드니까 원하는 컬러로 적당히 바꿔도 된다. 

컬러코드 차트는 여기서. 

wc = WordCloud(stopwords = STOPWORDS, font_path=font_path, 
              mask=mask, background_color="white", 
              max_words=2000, max_font_size=256, 
              random_state=42, width=mask.shape[1], 
              height=mask.shape[0], color_func=multi_color_func)
wc.generate(article.text)
plt.imshow(wc, interpolation="bilinear")
plt.axis('off')
plt.show()

파스텔톤이 됐다. 내 취향은 이것보다 아까 그 색이지만.

plt.savefig('savefig_default.png')

savefig 함수로 방금 만든 그림을 저장할 수 있다.