반응형

안녕하세요!

오늘은 저번에 만들었던 네이버 블로그 크롤러를 이용해서 txt 파일을 만들고

만들어진 텍스트 파일을 이용하여 워드 클라우드(WordCloud)로 시각화해보도록 하겠습니다.

 

step1. 데이터 준비
 

[python] Naver 오픈API를 이용하여 원하는 검색어로 블로그 크롤링 하기(제목+본문)

오늘은 NAVER API를 이용하여 네이버 블로그 크롤링을 해 보겠습니다 ;) NAVER OPEN API 신청하는 방법은 여기를 클릭해주세요ㅎㅎ step1. 네이버 OPEN API를 이용하여 원하는 검색어로 관련 게시물 불러오

wonhwa.tistory.com

 

위의 링크를 클릭하여 원하는 검색어 입력 후 관련 내용을 text 파일로 만들어 준비해 줍니다.

저는 '상암 맛집' 이라는 키워드로 'blog_text.txt' 파일을 만들어 보았습니다.

blog_text.txt
0.42MB

 

이제 위 파일 또는 다른 검색어로 크롤링한 파일을 파이썬으로 열어 줍니다.

파이썬으로 파일 주소를 입력할 때는 꼭 \를 //로 바꾸어 주세요!

# text 파일 읽어오기
#※※주소불러올때 \를 //로 바꾸어주기※※
blog_text = open('주소입력//blog_text.txt','rt', encoding='UTF-8').read()

# csv 파일일때
# import pandas as pd
# blog_text = pd.read_csv('csv파일.csv',encoding='utf-8')
# blog_text = blog_text['형태소분석할 컬럼명']
step2. Konlpy를 이용해 text의 형태소 분석하여 텍스트 전처리하기

텍스트 파일을 불러오고, 파일 안에 텍스트들을 konlpy를 이용해 명사, 형용사만 추출하도록 하겠습니다.

konlpy의 Okt를 이용하여 추출하도록 하겠습니다.

텍스트 한 줄 마다 형용사와 명사를 뽑아

n_adj라는 변수에 리스트를 만들어 단어를 추가해 줍니다.

from konlpy.tag import Okt
from collections import Counter

# Okt 함수를 이용해 형태소 분석
okt = Okt()
line =[]

line = okt.pos(blog_text)

n_adj =[]
# 명사 또는 형용사인 단어만 n_adj에 넣어주기
for word, tag in line:
    if tag in ['Noun','Adjective']:
        n_adj.append(word)
# 명사 또는 형용사인 단어 및 2글자 이상인 단어 선택 시
# n_adj = [word for word, tag in line if tag in ['Noun','Adjective'] and len(word) > 1]
print(n_adj)

출력:

위에를 보면 '아니었네요. ,  끝' 등과 같은 워드클라우드를 만들 때 부적절한 단어가 있습니다.

위같은 단어를 '불용어(stopwords)'라고 하는데 이 불용어들을 리스트에서 지워 주도록 하겠습니다.

#제외할 단어 추가
stop_words = "아니었네요. 있어서 끝 " #추가할 때 띄어쓰기로 추가해주기
stop_words = set(stop_words.split(' '))
# 불용어를 제외한 단어만 남기기
n_adj = [word for word in n_adj if not word in stop_words]

다음으로 같은 단어들이 2개 이상 나오는 것들을 counter를 이용하여 세어 주고,

가장 많이 나온 단어 100단어만 남기겠습니다.

#가장 많이 나온 단어 100개 저장
counts = Counter(n_adj)
tags = counts.most_common(100)

그 후 이 100단어들로 워드클라우드를 만들어 보겠습니다.

step3. 워드클라우드 만들기

저는 워드 클라우드에 모양을 넣어주고 싶어 하트 모양의 사진을 준비하여

하트 모양의 워드 클라우드를 만들어 보았습니다.

이런 하트 사진 또는 원하는 사진을 (배경이 투명해야 합니다.) 다운로드 받아 주세요.

# 이미지 추가(워드크라우드 모양 설정)
import numpy as np
from PIL import Image

mask = Image.new("RGBA",(2555,2275), (255,255,255)) #(2555,2575)는 사진 크기, (255,255,255)는 색을의미
image = Image.open('사진주소//heart.png').convert("RGBA")
x,y = image.size
mask.paste(image,(0,0,x,y),image)
mask = np.array(mask)

이렇게 이미지를 설정해주고,(제가 사용하는 이미지는 2555 x 2275 pixel 입니다.)

위의 mask를 사용하여 WordCloud를 만들어 주도록 하겠습니다.

한글을 사용하기 때문에 원하는 폰트 파일(.ttf)을 다운받아 설치하여 아래와 같이 파일 위치 및 이름을 적어줍니다.

저는 배경은(background) 검은색(black)으로, mask(모양)은 하트모양으로, 색상(colormap)은 프리즘(prism)을 이용해 

워드 클라우드를 만들어 주었습니다.

from wordcloud import WordCloud

###WordCloud(워드크라우드) 만들기###
#폰트지정
font='C://Users//user//AppData//Local//Microsoft//Windows//Fonts//BMDOHYEON.ttf'
word_cloud = WordCloud(font_path=font, background_color='black',max_font_size=400, mask=mask,colormap='prism').generate_from_frequencies(dict(tags))

# 사이즈 설정 및 화면에 출력
import matplotlib.pyplot as plt
plt.figure(figsize=(10,8))
plt.imshow(word_cloud)
plt.axis('off')
#워드클라우드 사진으로 저장
#cloud.to_file('상암맛집_wc.png')
#또는
plt.savefig('상암맛집.png', bbox_inches='tight')
plt.show()

출력:

그럼 위에 모양과 같이 하트모양의 상암맛집과 관련한 워드클라우드가 만들어졌습니다. ㅎㅎ

저는 검색어를 상암맛집으로 했기 때문에 이를 보여주기 위해 상암 맛집을 그대로 놔두었지만,

상암 맛집을 검색해서 나온 내용을 텍스트로 만들었기때문에 실제 정확한 분석을 위해서는

'상암, 맛집' 이 두 단어를 불용어로 두어 처리하고 다른 불용어를 더 추가해 다듬는다면

더 퀄리티 높은 워드클라우드가 만들어질 것 같습니다.

 

++추가로 워드클라우드의 글자 색상은 워드클라우드 파라미터인 colormap을 통해 변경할 수 있습니다.

아래 사진을 참고하여 원하는 컬러 맵 이름을 파라미터에 적어주면 적용 됩니다 :)

ex) colormap = 'autumn' 이런 식으로 작성하면 됩니다.

참고해 주세요 ^0^

컬러맵 종류

전체 코드
from konlpy.tag import Okt
from wordcloud import WordCloud
from collections import Counter

# text 파일 읽어오기
#※※주소불러올때 \를 //로 바꾸어주기※※
blog_text = open('C://주소//blog_text.txt','rt', encoding='UTF-8').read()
#print(blog_text)

# csv 파일일때
# import pandas as pd
# blog_text = pd.read_csv('csv파일.csv',encoding='utf-8')
# blog_text = blog_text['형태소분석할 컬럼명']

# Okt 함수를 이용해 형태소 분석
okt = Okt()
line =[]

line = okt.pos(blog_text)

n_adj =[]
# 명사 또는 형용사인 단어만 n_adj에 넣어주기
for word, tag in line:
    if tag in ['Noun','Adjective']:
        n_adj.append(word)
# 명사 또는 형용사인 단어 및 2글자 이상인 단어 선택 시
# n_adj = [word for word, tag in line if tag in ['Noun','Adjective'] and len(word) > 1]

#제외할 단어 추가
stop_words = "상암맛집 입니다 있어서 입니다." #추가할 때 띄어쓰기로 추가해주기
stop_words = set(stop_words.split(' '))

n_adj = [word for word in n_adj if not word in stop_words]
print(n_adj)

#print(line)
#print(n_adj)

#가장 많이 나온 단어 100개 저장
counts = Counter(n_adj)
tags = counts.most_common(100)

# 이미지 추가(워드크라우드 모양 설정)
import numpy as np
from PIL import Image

mask = Image.new("RGBA",(2555,2275), (255,255,255)) #(2555,2575)는 사진 크기, (255,255,255)는 색을의미
image = Image.open('C://Users//user//주소//heart.png').convert("RGBA")
x,y = image.size
mask.paste(image,(0,0,x,y),image)
mask = np.array(mask)

###WordCloud(워드크라우드) 만들기###
#폰트지정
font='C://폰트주소//폰트이름.ttf'
word_cloud = WordCloud(font_path=font, background_color='black',max_font_size=400, mask=mask,colormap='prism').generate_from_frequencies(dict(tags))

# 사이즈 설정 및 화면에 출력
import matplotlib.pyplot as plt
plt.figure(figsize=(10,8))
plt.imshow(word_cloud)
plt.axis('off')
#워드클라우드 사진으로 저장
#cloud.to_file('상암맛집_wc.png')
#또는
plt.savefig('상암맛집.png', bbox_inches='tight')
plt.show()

 

코드 파일

word_cloud_blog.py
0.00MB

마무리

오늘은 크롤링한 텍스트파일로 워드클라우드를 만들어 보았습니다.

항상 전처리가 시간이 많이 걸리고 전처리를 잘 해야 시각화도 잘 되어서 그 중요성을 다시 깨닫게 되네요ㅎㅎ

이번에는 블로그를 예제로 해서 워드클라우드를 만들었지만

뉴스나 연설문 등을 텍스트로 만들어 워드클라우드 해봐도 좋겠네요.

더 궁금한 것이 있다면 댓글 남겨주세요 :)

반응형

+ Recent posts