drive mount
# 모든 과정은 colab을 통해 진행했습니다.
from google.colab import drive
drive.mount('/content/drive')
library import
#라이브러리 import
#형분석 설치
!pip install konlpy
import os
import re
import urllib.request
import pandas as pd
from konlpy.tag import Kkma
import tqdm
from wordcloud import WordCloud
data download
urllib.request.urlretrieve("https://raw.githubusercontent.com/e9t/nsmc/master/ratings_train.txt", filename="ratings_train.txt")
urllib.request.urlretrieve("https://raw.githubusercontent.com/e9t/nsmc/master/ratings_test.txt", filename="ratings_test.txt")
data = pd.read_table('ratings_train.txt')
print(data.shape)
data.head()
형태소 분석
#명사추출
def preprocessing_nouns(text, kkma, remove_stopwords=False, stop_words=[]):
#한글 추출
text=re.sub("[^가-힣ㄱ-ㅎㅏ-ㅣ]"," ", text)
#명사 추출
word_text=kkma.nouns(text)
#불용어 및 두글자 이상 명사 추출
if remove_stopwords:
word=[token for token in word_text if not token in stop_words and len(token)>1]
return word
kkma = Kkma()
stop_words=['은','는','이','가', '하','아','것','들','의','있','되','수','보','주','등','한']
document = data['document'].iloc[:3000]
nouns_text=[]
for text in tqdm.tqdm(document):
try:
nouns_text.append(preprocessing_nouns(text, kkma, remove_stopwords=True, stop_words=stop_words))
except:
nouns_text.append([])
nouns_text[:5]
Word Count - TF(Term Frequency)
tf_words=[]
for i in range(len(nouns_text)):
tf_words.extend(nouns_text[i])
word_count = {} # 사전을 만든다
for word in tf_words: # 모든 단어에 대해서
if word in word_count: # 사전에 단어가 있으면
word_count[word] += 1 # 단어의 개수를 1 증가 시킨다
else: # 없으면
word_count[word] = 1 # 단어의 개수를 1로 한다
Word Count - DF(Document Frequency)
DF의 경우는 문서 내의 단어가 1번등장하던 10번등장하던 1번등장으로 생각합니다. 따라서 문서내의 동일한 단어를 중복제거 합니다.
df_words=[]
for i in range(len(nouns_text)):
# set을 통해 문서 내 중복단어 제거
df_words.extend(list(set(nouns_text[i])))
word_count = {} # 사전을 만든다
for word in df_words: # 모든 단어에 대해서
if word in word_count: # 사전에 단어가 있으면
word_count[word] += 1 # 단어의 개수를 1 증가 시킨다
else: # 없으면
word_count[word] = 1 # 단어의 개수를 1로 한다
WordCloud
wc = WordCloud(width=1000,
height=400,
font_path = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf' )
cloud = wc.fit_words(word_count)
cloud.to_image()
WordCloud - Option
워드클라우드 옵션을 살펴보면 워드클라우드 크기(width, height), 글자 방향(prefer_horizontal), 불용어(stopwords), 배경색(background_color) 등이 있습니다. 이외의 옵션은 직접 사용하며, 확인해보면 됩니다.
wc = WordCloud(width=1000,
height=400,
font_path = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf',
#배경 흰색
background_color='white',
#글자 수평
prefer_horizontal = 1,
#최대 단어 100개
max_words=100)
cloud = wc.fit_words(word_count)
cloud.to_image()
WordCloud - 상위빈도키워드
보통 wordcloud를 그릴 경우 모든 단어가 아닌 상위 빈도수의 키워드를 나타내길 원합니다. 예를 들어 고객의 리뷰를 분석할 경우 고객이 가장 많이 언급한 단어가 고객 opinion의 단서가 될 수 있기 때문입니다.
sort를 통해 count기반으로 정렬 후 상위 50개를 추출하여 다시 딕셔너리 형태로 변경해줍니다.
from operator import itemgetter
빈도수 기준으로 sort
sorted_words = sorted(word_count.items(), key=itemgetter(1), reverse=True)
상위빈도 키워드 5개 추출
print(sorted_words[:5])
word_dict = {}
for n , i in sorted_words[:50]:
word_dict[n] = i
print("영화 wordcount :",word_dict['영화'])
print("딕셔너리 갯수 :",len(word_dict))
wc = WordCloud(width=1000,
height=400,
font_path = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf' )
cloud = wc.fit_words(word_dict)
cloud.to_image()
'데이터분석 > NLP' 카테고리의 다른 글
[Keras] RNN 내부동작 알아보기 (0) | 2021.08.05 |
---|---|
[Keras] Embedding에 대해 알아보자. (3) | 2021.08.05 |
[soynlp] 띄어쓰기 교정 모델 (0) | 2020.05.11 |