ABC부트캠프: Day11 [대통령 연설문 텍스트마이닝]
ABC 부트캠프 [텍스트 마이닝]
오늘은 오전에 팀과제 발표가 있었다!
내가 조장이라서 그런지 발표는 내가 맡기로 하였다 ㅎㅎ
나름 우리 10조는 다 에이스들만 모여서
조장인 내가 고생하지 않아도 다들 알아서 해주니깐
너무 고맙구 마음이 편했다 ! !
성공적인 발표를 마치고 교수님과 우리조가 밥을 먹게 되어서
몇번이나 칼국수를 드셨을 교수님을 데리고
대동역 6번출구쪽의 신선칼국수라는 곳에 다녀왔다
사실 내가 칼국수를 많이 안먹기도… 하지만
이곳의 칼국수집은 처음와봤는데 진짜 맛있게 먹은 것 같다
- 교수님이 우리조 발표 너무 잘했다고 칭찬해줬다ㅎㅎ
대한민국 대통령 취임식 연설문을 활용한 텍스트마이닝
각 대통령의 연설문 특징 분석
가장 많이 언급된 단어는?
정치색(보수/진보) 성향이 담겨 있는가?
가장 중점을 두고 있는 분야나 대상을 찾을 수 있는가?
패키지 설치 및 라이브러리 임포
!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
데이터 준비
- 문재인 대통령 연설문
https://www.president.go.kr/president/greeting
moon = open('/content/문재인대통령_연설문.txt').read()
moon
- 윤석열 대통령 연설문
yoon = open('/content/윤석열대통령_연설문.txt').read()
yoon
데이터 전처리
특수기호 및 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
komoran
Komoran = konlpy.tag.Komoran()
k_moon_nn = Komoran.nouns(moon)
k_moon_nn
데이터 프레임으로 변환하기
h_word_df = pd.DataFrame({'word':h_moon_nn})
h_word_df
k_word_df = pd.DataFrame({'word':k_moon_nn})
k_word_df
단어수 파생변수 만들기
h_word_df['count'] = h_word_df['word'].str.len()
h_word_df
k_word_df['count'] = k_word_df['word'].str.len()
k_word_df
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
k_word_df = k_word_df.groupby('word', as_index=False).agg(n= ('word', 'count')).sort_values('n', ascending=False) # 중복이 없는 데이터프레임
k_word_df
대통령이 가장 많은 것을 알 수 있다
단어 빈도 상위 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()
워드클라우드 시각화
1. 한글 폰트 설정
font_path = '/content/BMDOHYEON_ttf.ttf'
2. 단어와 빈도를 담은 딕셔너리 만들기
k_word_dic = k_word_df.set_index('word').to_dict()['n']
k_word_dic
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()
문재인 대통령
윤석열 대통령
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()
워드클라우드 이미지 저장
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()
이렇게 태극기 이미지로도 표현해봤는데
이러한 텍스트마이닝으로 만든 이미지는 처음이고
또 활용성에서도 정말 많이 쓰일 것 같아 재밌게 진행했다
파이썬 라이브러리 마무리!
댓글남기기