3 분 소요

ABC 부트캠프 [텍스트 마이닝]

image

오늘은 오전에 팀과제 발표가 있었다!

내가 조장이라서 그런지 발표는 내가 맡기로 하였다 ㅎㅎ

나름 우리 10조는 다 에이스들만 모여서

조장인 내가 고생하지 않아도 다들 알아서 해주니깐

너무 고맙구 마음이 편했다 ! !

성공적인 발표를 마치고 교수님과 우리조가 밥을 먹게 되어서

몇번이나 칼국수를 드셨을 교수님을 데리고

대동역 6번출구쪽의 신선칼국수라는 곳에 다녀왔다

사실 내가 칼국수를 많이 안먹기도… 하지만

이곳의 칼국수집은 처음와봤는데 진짜 맛있게 먹은 것 같다

image

  • 교수님이 우리조 발표 너무 잘했다고 칭찬해줬다ㅎㅎ

대한민국 대통령 취임식 연설문을 활용한 텍스트마이닝

각 대통령의 연설문 특징 분석

가장 많이 언급된 단어는?

정치색(보수/진보) 성향이 담겨 있는가?

가장 중점을 두고 있는 분야나 대상을 찾을 수 있는가?

패키지 설치 및 라이브러리 임포

!pip install konlpy       # 자연어 처리를 위한 패키지
!pip install koreanize-matplotlib   # 한국어 패키지
!pip install wordcloud    # 시각화 할 때 필요한 패키지
import pandas as pd
import re

import konlpy

import matplotlib.pyplot as plt
import seaborn as sns
import koreanize_matplotlib

데이터 준비

  1. 문재인 대통령 연설문

https://www.president.go.kr/president/greeting

moon = open('/content/문재인대통령_연설문.txt').read()
moon

image

  1. 윤석열 대통령 연설문
yoon = open('/content/윤석열대통령_연설문.txt').read()
yoon

image

데이터 전처리

특수기호 및 html tag(\n), 숫자 등을 삭제

moon = re.sub('[^가-힣0-9]]', ' ', moon)      # 한글을 찾을 때, 가나다~~힣 추출
moon = re.sub('[^가-힣]', ' ', moon)
moon

명사 단어 추출

명사를 추출하는 함수는 Komoran, Hannanum, kkma가 있는데, kkma는 사용하지 않는다.

나머지 두 함수만 비교하여 사용하도록 해보자

Hannaum

hannanum = konlpy.tag.Hannanum()
h_moon_nn = hannanum.nouns(moon)    # nouns() 명사로만 추출하고 리스트로 반환하는 함수
h_moon_nn

image

komoran

Komoran = konlpy.tag.Komoran()
k_moon_nn = Komoran.nouns(moon)
k_moon_nn

image

데이터 프레임으로 변환하기

h_word_df = pd.DataFrame({'word':h_moon_nn})
h_word_df
k_word_df = pd.DataFrame({'word':k_moon_nn})
k_word_df

image

단어수 파생변수 만들기

h_word_df['count'] = h_word_df['word'].str.len()
h_word_df

image

k_word_df['count'] = k_word_df['word'].str.len()
k_word_df

image

hannanum은 466 단어수 / komoran은 440 단어수

두 글자 이상 단어만 남기고 삭제(한 단어 삭제)

h_word_df = h_word_df.query('count >= 2')
h_word_df
k_word_df = k_word_df.query('count >= 2')
k_word_df

hannnanum은 399 단어수 / komoran은 393 단어수

한 글자 단어는 사라진 것을 알 수 있다.

단어의 사용 빈도표(사용 빈도가 많은순으로 정렬)

h_word_df = h_word_df.groupby('word', as_index=False).agg(n= ('word', 'count')).sort_values('n', ascending=False)   # 중복이 없는 데이터프레임
h_word_df

image

k_word_df = k_word_df.groupby('word', as_index=False).agg(n= ('word', 'count')).sort_values('n', ascending=False)   # 중복이 없는 데이터프레임
k_word_df

image

대통령이 가장 많은 것을 알 수 있다

단어 빈도 상위 20개 추출

h_top20 = h_word_df.head(20)
k_top20 = k_word_df.head(20)

단어 빈도 시각화

2개의 그래프() 한번에 표시하기

fig, axes = plt.subplots(1,2, figsize=(15,5))      # fig-스케치북 , axes-수 : 1개의 스케치북에 2개 그린다.
plt.suptitle('한국어 자연어 처리기 Hannanum, Komoran 명사 비교 분석')

sns.barplot(data=h_top20, x = 'n', y = 'word', ax = axes[0])
axes[0].set_title('Hannanum')

sns.barplot(data=k_top20, x = 'n', y = 'word', ax = axes[1])
axes[1].set_title('Komoran')

plt.show()

image

워드클라우드 시각화

1. 한글 폰트 설정

font_path = '/content/BMDOHYEON_ttf.ttf'

2. 단어와 빈도를 담은 딕셔너리 만들기

k_word_dic = k_word_df.set_index('word').to_dict()['n']
k_word_dic

image

3. 워드클라우드 만들기

from wordcloud import WordCloud

wc = WordCloud(width=1000, height=700, font_path=font_path)
img_wordcloud = wc.generate_from_frequencies(k_word_dic)

plt.figure(figsize=(20,10))
plt.axis('off')
plt.imshow(img_wordcloud, interpolation='bilinear')
plt.show()

문재인 대통령
image

윤석열 대통령 image

mask를 활용한 워드클라우드 시각화

from PIL import Image
import numpy as np
from wordcloud import ImageColorGenerator

# 이미지 불러오기
icon = Image.open('/content/korea_mask.jpg')

# 이미지를 numpy array로 만들기
korea_mask = np.array(icon)    # 단어들이 담긴 공간 배열

# 워드 클라우드 만들기
wc = WordCloud(background_color='white', width=1000, height=700, font_path=font_path, mask=korea_mask)    # background 하얗게, 그림 이미지 mask 삽입
img_wordcloud = wc.generate_from_frequencies(k_word_dic)

plt.figure(figsize=(20,10))
plt.axis('off')
plt.imshow(img_wordcloud, interpolation='bilinear')
plt.show()

image

워드클라우드 이미지 저장

img_wordcloud.to_file(filename='moon_wordcloud.png')   # 문재인대통령
img_wordcloud.to_file(filename='yoon_wordcloud.png')   # 윤석열대통령

태극기로 표현

from PIL import Image
import numpy as np
from wordcloud import ImageColorGenerator

# 이미지 불러오기
icon = Image.open('/content/태극기.png')

# 이미지를 numpy array로 만들기
korea_mark = np.array(icon)    # 단어들이 담긴 공간 배열

# 워드 클라우드 만들기
wc = WordCloud(background_color='white', width=1000, height=700, font_path=font_path, mask=korea_mark)    # background 하얗게, 그림 이미지 mask 삽입
img_wordcloud = wc.generate_from_frequencies(k_word_dic)

image_colors = ImageColorGenerator(korea_mark)
wordcloud = img_wordcloud.recolor(color_func=image_colors)

plt.figure(figsize=(20,10))
plt.axis('off')
plt.imshow(img_wordcloud, interpolation='bilinear')
plt.show()

image

이렇게 태극기 이미지로도 표현해봤는데

이러한 텍스트마이닝으로 만든 이미지는 처음이고

또 활용성에서도 정말 많이 쓰일 것 같아 재밌게 진행했다

파이썬 라이브러리 마무리!

댓글남기기