반응형

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

+ Recent posts