본문 바로가기
실습/파이썬 데이터 분석 및 시각화

Konlpy_한글 텍스트 분석

by 이민우 2021. 11. 18.
728x90
반응형

텍스트 분석

텍스트 분석이란 비정형 데이터인 텍스트에서 의미있는 정보를 추출하는 작업이다.

 

텍스트 분석의 종류로는 텍스트 분류, 감성 분석, 요약, 군집화와 유사도 측정 등이 있다.

 

텍스트 분석의 순서는 다음과 같이 이루어진다.

  1. 문장 : 최초의 입력값
  2. 단어 : 문장을 단어 단위로 자른다. (영어의 경우 띄어쓰기 단위로, 한글은 형태소 단위로 자르곤 한다.)
  3. 키워드 : 단어의 배열에서 내장된 사전을 통해 키워드를 추출한다.
  4. 필터링 : 추출한 키워드 중 필요없는 단어들을 필터링한다.
  5. 집계 : 필터링 결과를 집계한다.
  6. 시각화 : 집계 결과를 시각화한다.

 

위의 과정 중 문장을 단어로 나누는 작업은 영어의 경우라면 띄어쓰기 만으로 충분히 처리할 수 있다.

하지만 한국어의 경우 같은 단어라도 다양한 형태로 나타나기에 띄어쓰기로 나누지 못하고, 대신 특정 라이브러리를 사용하여 형태소를 기반으로 나누어야 한다.

이 때 사용되는 라이브러리가 바로 Konlpy이다.

from konlpy.tag import Kkma

 

오늘은 Konlpy를 사용한 문장을 단어로 나누는 방법과, 이를 토대로 시각화 하는 방법을 실습해볼 것이다.

 

우선 데이터 셋이 필요한데, 이는 옛날에 네이버 뉴스를 파싱해 만든 데이터를 사용할 것이다.

https://github.com/123okk2/Naver_News_title_classification/blob/main/data/eco.csv

 

GitHub - 123okk2/Naver_News_title_classification: 네이버 뉴스 제목 파싱 후 제목에 따라 뉴스 주제 분류 (정

네이버 뉴스 제목 파싱 후 제목에 따라 뉴스 주제 분류 (정치, 경제, 사회, 생활, IT) - GitHub - 123okk2/Naver_News_title_classification: 네이버 뉴스 제목 파싱 후 제목에 따라 뉴스 주제 분류 (정치, 경제, 사

github.com

 

eco.csv
0.02MB

 

 

 

그리고 시각화에는 wordcloud 라는 라이브러리를 사용할 것인데,

텍스트를 시각화하는 작업을 할 것이다보니 필연적으로 한글이 들어가야 한다.

하지만 워드 클라우드는 matplotlib과 마찬가지로 기본적으로 한글이 사용되지 못하기 때문에 한글을 별도로 지정해줘야 한다.

 

윈도우는 그냥 설정해줄 수 있고, 코랩은 다음 과정을 거친다.

!apt-get install fonts-nanum*
!apt-get install fontconfig

위의 명령어를 사용하여 폰트를 다운받은 후 아래와 같이 font_path 파라미터를 통해 지정을 해주면 끝이다.

from wordcloud import WordCloud

wordcloud = WordCloud(font_path='/usr/share/fonts/truetype/nanum/NanumGothic.ttf')

 

 

그 후 Kkma를 사용하여 텍스트를 분석하는 과정은 다음과 같다.

순서는 위에서 설명한 것과 같이 구성하였다.

from konlpy.tag import Kkma
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
from wordcloud import WordCloud

from collections import Counter
import numpy as np
import pandas as pd

Kkma = Kkma()

#1. 문장 단계 (파일 로드)
data = pd.read_csv('/content/eco.csv', encoding='UTF-8')
data = data['title'][:10]
data = data.to_list() #Series => list
data = ' '.join(data) #list => String

#2~3. 문장 => 단어 => 키워드
noun_data = Kkma.nouns(data) #명사만 추출
#Kkma.sentences(data) #문장 단위 추출
#Kkma.pos(data) #형태소 분석(단어, 종류)
#Kkma.morphs(data) #형태소 분석(단어만)

#4. 필터링
#불용어 제거 단계
#한글은 별도의 파일을 구하여 각 단어를 비교하며 직접 제거해야 한다.
#불용어 파일을 구할 수 없어 일단 패스

#5. 집계
count_noun_data = Counter(noun_data) #명사별 빈도수 추출


#6. 시각화
#워드 클라우드 그리기
#기본적으로 워드 클라우드도 한글을 지원하지 않아 별도의 작업 필요
#\font_path = ".."으로 지정 가능
wordcloud = WordCloud(font_path='/usr/share/fonts/truetype/nanum/NanumGothic.ttf').generate_from_frequencies(count_noun_data)

plt.figure(figsize=(8, 4))
plt.imshow(wordcloud)
plt.axis('on')
plt.show()

 

위의 코드를 실행시키면 명사들의 빈도수에 따라 집계된 통계가 다음과 같이 시각화 된다.

 

 

참고로 워드 클라우드에는 재미있는 기능이 있는데, 바로 이미지 지정이다.

이미지를 지정하면 위와 같이 사각형이 아닌 지정한 이미지대로 출력이 된다.

무슨 말이냐 싶을 수 있는데, 사실 말로 하는 것보다는 보는 것이 좋으니 한 번 보도록 하자.

아까의 코드에서 

from konlpy.tag import Kkma
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
from wordcloud import WordCloud

from collections import Counter
import numpy as np
import pandas as pd

from PIL import Image 
from wordcloud import ImageColorGenerator


Kkma = Kkma()
bg_img = np.array(Image.open('/content/alice.jpg')) #배경 이미지로 사용할 사진 로드

#1. 문장 단계 (파일 로드)
data = pd.read_csv('/content/eco.csv', encoding='UTF-8')
data = data['title'][:10]
data = data.to_list() #Series => list
data = ' '.join(data) #list => String

#2~3. 문장 => 단어 => 키워드
noun_data = Kkma.nouns(data) #명사만 추출
#Kkma.sentences(data) #문장 단위 추출
#Kkma.pos(data) #형태소 분석(단어, 종류)
#Kkma.morphs(data) #형태소 분석(단어만)

#4. 필터링
#불용어 제거 단계
#한글은 별도의 파일을 구하여 각 단어를 비교하며 직접 제거해야 한다.
#불용어 파일을 구할 수 없어 일단 패스

#5. 집계
count_noun_data = Counter(noun_data) #명사별 빈도수 추출


#6. 시각화
#워드 클라우드 그리기
#기본적으로 워드 클라우드도 한글을 지원하지 않아 별도의 작업 필요
#\font_path = ".."으로 지정 가능
wordcloud = WordCloud(font_path='/usr/share/fonts/truetype/nanum/NanumGothic.ttf', #한글 지정
                      relative_scaling = 0.2,
                      mask = bg_img, #마스크 지정
                      background_color = 'white',
                      max_font_size = 40,
                      min_font_size = 1
                      ).generate_from_frequencies(count_noun_data)

plt.figure(figsize=(8, 4))
plt.imshow(wordcloud)
plt.axis('on')
plt.show()

 

마스크 지정은 바로 위와 같이 특정한 형태로 시각화를 하는 작업이라고 보면 된다.

 

 

또한 워드 클라우드는 보는 것만으로는 정량적인 판단이 어렵다는 단점이 있다.

그렇기에 가능하다면, 아래와 같이 워드 클라우드 그림을 단일로 사용하기 보다 그래프와 함께 출력하여 주는 것이 좋다.

 

워드 클라우드의 단점은 정량적인 판단이 어렵다는 점이다.

그렇기에 워드 클라우드의 그림은 그래프와 함께 나타내는 것이 좋다.

from konlpy.tag import Kkma
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
from wordcloud import WordCloud

from collections import Counter
import numpy as np
import pandas as pd

from PIL import Image 
from wordcloud import ImageColorGenerator


Kkma = Kkma()
bg_img = np.array(Image.open('/content/alice.jpg')) #배경 이미지로 사용할 사진 로드

#1. 문장 단계 (파일 로드)
data = pd.read_csv('/content/eco.csv', encoding='UTF-8')
data = data['title'][:10]
data = data.to_list() #Series => list
data = ' '.join(data) #list => String

#2~3. 문장 => 단어 => 키워드
noun_data = Kkma.nouns(data) #명사만 추출
#Kkma.sentences(data) #문장 단위 추출
#Kkma.pos(data) #형태소 분석(단어, 종류)
#Kkma.morphs(data) #형태소 분석(단어만)

#4. 필터링
#불용어 제거 단계
#한글은 별도의 파일을 구하여 각 단어를 비교하며 직접 제거해야 한다.
#불용어 파일을 구할 수 없어 일단 패스

#5. 집계
count_noun_data = Counter(noun_data) #명사별 빈도수 추출


#6. 시각화
#워드 클라우드 그리기
#기본적으로 워드 클라우드도 한글을 지원하지 않아 별도의 작업 필요
#\font_path = ".."으로 지정 가능
wordcloud = WordCloud(font_path='/usr/share/fonts/truetype/nanum/NanumGothic.ttf', #한글 지정
                      relative_scaling = 0.2,
                      mask = bg_img, #마스크 지정
                      background_color = 'white',
                      max_font_size = 40,
                      min_font_size = 1
                      ).generate_from_frequencies(count_noun_data)

plt.figure(figsize=(8, 4))
plt.imshow(wordcloud)
plt.axis('on')
plt.show()


import nltk
import matplotlib
from nltk.probability import FreqDist
import warnings
warnings.filterwarnings(action='ignore')

matplotlib.rc('font', family='NanumBarunGothic')
plt.figure(figsize=(20, 4))
g_data = FreqDist(count_noun_data)
g_data.plot(50)

 

728x90
반응형

'실습 > 파이썬 데이터 분석 및 시각화' 카테고리의 다른 글

Nltk_영어 텍스트 분석  (0) 2021.11.18
Bokeh 패키지  (0) 2021.11.17
Seaborn 사용법  (0) 2021.11.17
Matplotlib 사용법  (0) 2021.11.17
Pandas 사용법  (0) 2021.11.17