이수안 교수님의 유튜브 강의 참조
- 핵심어(keyword)란 텍스트 자료의 중요한 내용을 압축적으로 제시하는 단어 또는 문구
- 핵심어 분석 순서
- 불용어 제거
- 어간 추출
- 형태소 분석
- 많이 등장하는 형태소의 등장빈도를 분석 → 핵심어 추출~
가정 <특정 텍스트 자료에 많이 나타나는 형태소가 그 텍스트 주제를 표출할 가능성이 높다>
- 키워드 분석 활용 : 텍스트의 주제 추정, 텍스트 유사도, 검색결과 우선순위 측정 등 다양하게 사용됨.
이제 실습을 해보자(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 |