Jaegool_'s log

데이터분석 종합반 2주차[스파르타 코딩]<데이터 시각화, 워드클라우드, 벡터화, 머신러닝> 본문

Development Log/Data Analytics

데이터분석 종합반 2주차[스파르타 코딩]<데이터 시각화, 워드클라우드, 벡터화, 머신러닝>

Jaegool 2022. 6. 12. 20:32

https://teamsparta.notion.site/2-a3962bdb49ef4c8ba54b00c6f3e52f99#6ce87e6511a5430ea3b65fedc6c91de7

 

[스파르타코딩클럽] 데이터분석 종합반 - 2주차

매 주차 강의자료 시작에 PDF파일을 올려두었어요!

teamsparta.notion.site

 

<HW>

네이버 쇼핑 리뷰를 이용하여 긍정 워드 클라우드/ 부정 워드 클라우드 만들기

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 

df = pd.read_table('https://raw.githubusercontent.com/bab2min/corpus/master/sentiment/naver_shopping.txt', names=['ratings', 'reviews'])

print(df['reviews'].nunique())

# 중복 샘플 제거
df.drop_duplicates(subset=['reviews'], inplace=True)

df['ratings'].value_counts().plot(kind = 'bar')
print(df.groupby('ratings').size().reset_index(name = 'count'))

###########################

!pip install konlpy
from konlpy.tag import Okt
tokenizer = Okt()
df['tokenized'] = df['reviews'].apply(tokenizer.nouns)

# 리뷰 점수가 4~5점이면 1, 리뷰 점수가 1~2면 0의 값을 줍니다.
df['label'] = np.select([df.ratings > 3], [1], default=0)
df.head()

positive_reviews = np.hstack(df[df['label']==1]['tokenized'].values)
negative_reviews = np.hstack(df[df['label']==0]['tokenized'].values)

############################

각각의 리스트를 하나의 리스트 형태로 리뷰들을 묶어준 뒤

 

from wordcloud import WordCloud

temp_positive_data = ' '.join(positive_reviews)
temp_negative_data = ' '.join(negative_reviews)

plt.figure(figsize=(15, 15))
wc = WordCloud(max_words = 2000, width = 1600, height = 800, font_path = fontpath).generate(temp_positive_data)
plt.imshow(wc, interpolation = 'bilinear')

plt.figure(figsize=(15, 15))
wc = WordCloud(max_words = 2000, width = 1600, height = 800, font_path = fontpath).generate(temp_negative_data)
plt.imshow(wc, interpolation = 'bilinear')

조인으로 묶어서 문자열로 만들어준 후 워드 클라우드로 만들어 준다.

 

긍정 워드 클라우드
부정 워드 클라우드

 

<Colab 한글패치>

import matplotlib as mpl
import matplotlib.pyplot as plt
 
%config InlineBackend.figure_format = 'retina'
 
!apt -qq -y install fonts-nanum
 
import matplotlib.font_manager as fm
fontpath = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf'
font = fm.FontProperties(fname=fontpath, size=9)
plt.rc('font', family='NanumBarunGothic') 
mpl.font_manager._rebuild()

 

<DTM>

문서 단어 행렬(Document-Term Matrix,  DTM)이란

- 문서를 행으로 하고,

- 각 문서에서 등장하는 각 단어들의 등장 횟수를 행렬로 표현한 것을 말합니다.

-  DTM을 통해 각 문서들의 유사도를 구할 수 있습니다.

 

<TF-IDF>

Term Frequency-Inverse Document Frequency는 단어의 빈도와 문서의 빈도의 역수를 사용하여  DTM 내의 각 단어들마다 중요한 정도를 가중치로 주는 방법입니다. 사용 방법은 우선 DTM을 만든 후,  TF-IDF 가중치를 부여합니다.

 

TF-IDF는 주로 문서의 유사도를 구하는 작업, 검색 시스템에서 검색 결과의 중요도를 정하는 작업, 문서 내에서 특정 단어의 중요도를 구하는 작업 등에 쓰일 수 있습니다.

 

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
corpus = [
    'you know I want your love',
    'I like you',
    'what should I do ',    
]

vector = CountVectorizer() # DTM 벡터화를 위한 객체 생성
x_train_dtm = vector.fit_transform(corpus) # 해당 문서들을 벡터화 진행
print(x_train_dtm.toarray()) # 벡터가 어떻게 생겼는지 확인
[[0 1 0 1 0 1 0 1 1]
 [0 0 1 0 0 0 0 1 0]
 [1 0 0 0 1 0 1 0 0]]

 

사이킷런을 이용하면, DTM과 TF-IDF를 쉽게 만들 수 있습니다.

사이킷런의 CountVectorizer를 사용하면 DTM을 만들 수 있고,

TfidfTransformer를 사용하면 TF-IDF 행렬을 만들 수 있습니다.

tfidf_transformer = TfidfTransformer() # tfidf 벡터화를 위한 객체 생성
tfidfv = tfidf_transformer.fit_transform(x_train_dtm) # x_train_dtm에 대해서 벡터화 진행
print(tfidfv.toarray()) # 벡터가 어떻게 생겼는지 확인
[[0.         0.46735098 0.         0.46735098 0.         0.46735098
  0.         0.35543247 0.46735098]
 [0.         0.         0.79596054 0.         0.         0.
  0.         0.60534851 0.        ]
 [0.57735027 0.         0.         0.         0.57735027 0.
  0.57735027 0.         0.        ]]
  • fit_transform()은 생성한 객체 (vector, tfidf_transformer) 에다가 해당 문서 혹은 단어들의 벡터값을 저장하면서 벡터화를 진행하는 함수입니다. - train
  • transform()은 훈련 데이터를 통해서 만들어진 벡터값을 보고, 그것에 따라 벡터화를 진행하는 함수입니다. 만약 훈련 데이터를 토대로 'a' 라는 단어에 대해서 벡터값을 [0 1 0] 이라고 생성해놓았다면, 테스트 데이터에서 등장한 'a' 에 대해서도 [0 1 0] 이라고 벡터화를 진행하는 것입니다. - test