본문 바로가기

NLP

ch2. 키워드 분석(KeywordAnalysis)

이수안 교수님의 유튜브 강의 참조

- 핵심어(keyword)란 텍스트 자료의 중요한 내용을 압축적으로 제시하는 단어 또는 문구

-  핵심어 분석 순서

  1. 불용어 제거 
  2. 어간 추출
  3. 형태소 분석
  4. 많이 등장하는 형태소의 등장빈도를 분석 → 핵심어 추출~

가정 <특정 텍스트 자료에 많이 나타나는 형태소가 그 텍스트 주제를 표출할 가능성이 높다>

 

- 키워드 분석 활용 : 텍스트의 주제 추정, 텍스트 유사도, 검색결과 우선순위 측정 등 다양하게 사용됨.

 

이제 실습을 해보자(in colab)

한글폰트 설정

import matplotlib as mpl
import matplotlib.pyplot as plt
plt.style.use('seaborn-white')

%config InlineBackend.figure_format='retina'

!apt -qq -y install fonts-nanum

import matplotlib.font_manager as fm
fontpath = '/user/share/fonts/truetype/nanum/NanumBarunGothic.ttf'
font = fm.FontProperties(fname=fontpath, size=10)
plt.rc('font', family='NanumBarunGothic')
mpl.font_manager._rebuild()

런타임 재시작 필요

konlpy와 mecab설치

!set -x \
&& pip install konlpy \
&& curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh : bash -x

필자는 이걸로 부족해서 

!apt-get update
!apt-get install g++ openjdk-8-jdk 
!pip3 install konlpy JPype1-py3
!bash <(curl -s https://raw.githubusercontent.com/konlpy/konlpy/master/scripts/mecab.sh)

이것도 같이 실행해준다.

 

데이터 준비

네이버 영화리뷰 데이터 사용

import urllib.request

raw = urllib.request.urlopen('https://raw.githubusercontent.com/e9t/nsmc/master/ratings.txt').readlines()
print(raw[:5])
>>>[b'id\tdocument\tlabel\n', b'8112052\t\xec\x96\xb4\xeb\xa6\xb4\xeb\x95\x8c\xeb\xb3\xb4\xea\xb3
##리뷰외 다른 데이터도 존재
## 문자열로 변환하고 리뷰만 추출하자

 

raw = [x.decode() for x in raw[1:]]

reviews = []
for i in raw :
  reviews.append(i.split('\t')[1])

print(reviews[:5])
>>>['어릴때보고 지금다시봐도 재밌어요ㅋㅋ', 
'디자인을 배우는 학생으로,
외국디자이너와 그들이 일군 전통을 통해 발전해가는 문화산업이 부러웠는데. 사실 우리나라에서도 그 어려운시절에 끝까지 열정을 지킨 노라노 같은 전통이있어 저와 같은 사람들이 꿈을 꾸고 이뤄나갈 수 있다는 것에 감사합니다.',
'폴리스스토리 시리즈는 1부터 뉴까지 버릴께 하나도 없음.. 최고.', '와.. 연기가 진짜 개쩔구나.. 지루할거라고 생각했는데 몰입해서 봤다.. 그래 이런게 진짜 영화지', 
'안개 자욱한 밤하늘에 떠 있는 초승달 같은 영화.']

 

명사만 추출해보자

from konlpy.tag import Mecab
tagger = Mecab()

nouns = []
for review in reviews:
  for noun in tagger.nouns(review):
    nouns.append(noun)

 

 

한국어 불용어는 직접 사전을 만들어주어야 한다. 지금은 간단하게 만들어보자.

한국어는 조사나, 접사 등 여러 요인으로 불필요한 단어가 많고, 형태가 바뀌므로 굉장히 어렵다..

'영화' 같이 빈도가 너무 커서 분석에 방해되는 단어도 제거가 필요하다. 

stop_words = "영화 전 난 일 걸 뭐 줄 만 건 분 개 끝 잼 이거 번 중 듯 때 게 내 말 나 수 거 점 것"
stop_words = stop_words.split(' ')

 

불용어를 제외하고 형태소 분석을 수행하자. 

nouns = []
for review in reviews :
  for noun in tagger.nouns(review):
    if noun not in stop_words :
      nouns.append(noun)
nouns[:10]

단어 빈도수 측정을 위해서 collections패키지에 있는 Counter함수를 사용해보자.

from collections import Counter

nouns_counter = Counter(nouns)
top_nouns = dict(nouns_counter.most_common(50))
##상위 50개만 지정

단어빈도 시각화

import numpy as np

y_pos = np.arange(len(top_nouns))

plt.figure(figsize=(12,12))
plt.barh(y_pos, top_nouns.values())
plt.title('Word Count')
plt.yticks(y_pos, top_nouns.keys())
plt.show()

 

워드클라우드 시각화

!pip install wordcloud

##워드클라우드 시각화를 수행할땐, 이미지 시각화 함수 imshow()함수를 사용
figure = plt.figure(figsize=(12,12))
ax = figure.add_subplot(1,1,1)
ax.axis('off')
ax.imshow(wc)
plt.show()

squarify 트리맵 시각화

- 트리맵 생성을 지원해주는 파이썬 라이브러리이다. 

- 키워드와 키워드 빈도수를 트리맵을 나타낸다. 

  • 색깔이 진하고, 칸이 클수록 자주 나온 단어 
!pip install squarify

import squarify

norm = mpl.colors.Normalize(vmin = min(top_nouns.values()),
                            vmax = max(top_nouns.values()))
colors = [mpl.cm.Blues(norm(value)) for value in top_nouns.values()]

squarify.plot(label=top_nouns.keys(),
              sizes = top_nouns.values(),
              color = colors,
              alpha = .7);

 

 

 

 

이수안 교수님 감사합니다~ 

'NLP' 카테고리의 다른 글

ch4. 문서분류(Document Classification)  (0) 2023.01.24
ch5. 의미연결망 분석(SNA)  (0) 2023.01.21
ch3. 군집분석  (0) 2023.01.19