빅데이터 서비스 교육/머신러닝

네이버 영화 리뷰데이터(konlpy활용) 실습

Manly 2022. 7. 7. 10:45
반응형

konlpy 설치

  • Konlpy(코엔엘파이): 한글 형태소 분석기
!pip install konlpy

from konlpy.tag import Okt # Open Korean Text: 트위터에서 만든 오픈소스 한국어 처리기

okt = Okt()

okt.morphs('한글 형태소 분석기') #morphs : 형태소 분석기
# 의미를 가지는 가장 작은 단위로 쪼갠다

['한글', '형태소', '분석', '기']

okt.nouns('한글 형태소 분석기') #nouns : 명사 추출

['한글', '형태소', '분석', '기']

okt.pos('한글 형태소 분석기') #pos : 매핑된 품사

[('한글', 'Noun'), ('형태소', 'Noun'), ('분석', 'Noun'), ('기', 'Noun')]

okt.tagset

{'Adjective': '형용사',
 'Adverb': '부사',
 'Alpha': '알파벳',
 'Conjunction': '접속사',
 'Determiner': '관형사',
 'Eomi': '어미',
 'Exclamation': '감탄사',
 'Foreign': '외국어, 한자 및 기타기호',
 'Hashtag': '트위터 해쉬태그',
 'Josa': '조사',
 'KoreanParticle': '(ex: ㅋㅋ)',
 'Noun': '명사',
 'Number': '숫자',
 'PreEomi': '선어말어미',
 'Punctuation': '구두점',
 'ScreenName': '트위터 아이디',
 'Suffix': '접미사',
 'Unknown': '미등록어',
 'Verb': '동사'}

from konlpy.tag import Kkma

kkma = Kkma()

kkma.morphs('한글 형태소 분석기')

['한글', '형태소', '분석기']

Konlpy 모델들의 속도차이

Countvectorizer에 연결해서 사용

from sklearn.feature_extraction.text import CountVectorizer

c = CountVectorizer()

 

c.fit(['나는 어제 밥을 먹었다.',
      '어제 영화는 너무 재밌었다.']) #CountVectorizer로 fit하는 순간 vocabulary 생성

 

c.vocabulary_

{'나는': 0, '어제': 4, '밥을': 3, '먹었다': 2, '영화는': 5, '너무': 1, '재밌었다': 6}
def myTokenizer(text):
    return kkma.nouns(text)    

c2 = CountVectorizer(tokenizer=myTokenizer)

c2.fit(['나는 어제 밥을 먹었다.',
      '어제 영화는 너무 재밌었다.'])

c2.vocabulary_
{'나': 0, '어제': 2, '밥': 1, '영화': 3}

네이버 한글 영화 리뷰 데이터 감성분석 실습

import pandas as pd

 

text_train = pd.read_csv('./data/ratings/ratings_train.txt', delimiter="\t")
text_test= pd.read_csv('./data/ratings/ratings_test.txt', delimiter="\t")

 

text_train

id	document	label
0	9976970	아 더빙.. 진짜 짜증나네요 목소리	0
1	3819312	흠...포스터보고 초딩영화줄....오버연기조차 가볍지 않구나	1
2	10265843	너무재밓었다그래서보는것을추천한다	0
3	9045019	교도소 이야기구먼 ..솔직히 재미는 없다..평점 조정	0
4	6483659	사이몬페그의 익살스런 연기가 돋보였던 영화!스파이더맨에서 늙어보이기만 했던 커스틴 ...	1
...	...	...	...
149995	6222902	인간이 문제지.. 소는 뭔죄인가..	0
149996	8549745	평점이 너무 낮아서...	1
149997	9311800	이게 뭐요? 한국인은 거들먹거리고 필리핀 혼혈은 착하다?	0
149998	2376369	청춘 영화의 최고봉.방황과 우울했던 날들의 자화상	1
149999	9619869	한국 영화 최초로 수간하는 내용이 담긴 영화	0
150000 rows × 3 columns

text_train.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150000 entries, 0 to 149999
Data columns (total 3 columns):
 #   Column    Non-Null Count   Dtype 
---  ------    --------------   ----- 
 0   id        150000 non-null  int64 
 1   document  149995 non-null  object
 2   label     150000 non-null  int64 
dtypes: int64(2), object(1)
memory usage: 3.4+ MB

text_train.dropna(inplace =True)
text_test.dropna(inplace =True)  # document 결측치5개있는거 나머지 5개씩 삭제

 

X_train = text_train['document']
y_train = text_train['label']
X_test = text_test['document']
y_test = text_test['label']

 

print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)

 

(149995,)
(149995,)
(49997,)
(49997,)

from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LogisticRegression

 

pipe_line = make_pipeline(CountVectorizer(),LogisticRegression())

pipe_line.fit(X_train,y_train)

pipe_line.score(X_test,y_test)

 

0.814428865731944

pipe_line.predict(['와 이 영화 너무 꿀잼',
                  '무슨 이런 영화를 돈주고 보나',
                  '주연 배우의 발연기가 돋보이는 영화!',
                  '돈 아까운 영화',
                  '영화를 보고 있는 시간이 아까웠다.',
                  '배우들의 연기가 만족스럽습니다.'])

array([1, 0, 0, 0, 0, 1], dtype=int64)

어떤 단어가 긍정/부정에 영향을 미칠까???

c_model = pipe_line.steps[0][1]
l_model = pipe_line.steps[1][1]

df = pd.DataFrame([
c_model.vocabulary_.keys(),
c_model.vocabulary_.values()     
])
df.head()

0	1	2	3	4	5	6	7	8	9	...	293356	293357	293358	293359	293360	293361	293362	293363	293364	293365
0	더빙	진짜	짜증나네요	목소리	포스터보고	초딩영화줄	오버연기조차	가볍지	않구나	너무재밓었다그래서보는것을추천한다	...	높아서ㅋㅋ	carl	세이건으로	디케이드	오즈인데	더블은	뭔죄인가	거들먹거리고	혼혈은	수간하는
1	71119	246232	248358	99567	273335	255126	190112	16352	167602	57394	...	60705	8822	143023	80079	190555	71115	105744	24486	287413	146244
2 rows × 293366 columns

df=df.T.sort_values(by=1)
df

df['coef'] = l_model.coef_.reshape(-1)  # 2차원을 1차원으로 reshape

df.sort_values(by='coef', inplace=True)
df

 

pos_neg_top30 = pd.concat([
    df.head(30)[[0, 'coef']],
    df.tail(30)[[0, 'coef']]
])
# df.head(30) 부정에 해당하는 30개
# df.tail(30) 긍정에 해당하는 30개
pos_neg_top30

 

import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
font_name = font_manager.FontProperties(fname='C:\Windows\Fonts\malgun.ttf').get_name()
rc('font', family = font_name)   #한글 안깨지게

plt.figure(figsize=(20,5))
plt.bar(pos_neg_top30[0], pos_neg_top30['coef'])
plt.xticks(rotation =90) #x축 글자 안겹치게 회전
plt.show()

모델저장

import pickle # 파이썬에 등장하는 모든 클래스를 저장 가능
with open('k_m_s_m.pkl', 'wb') as f:
    pickle.dump(pipe_line, f) # 저장 할때 dump사용
    
#저장한 모델 꺼내쓰기
with open('k_m_s_m.pkl', 'rb') as f:  #'k_m_s_m.pkl'라는 파일을 'rb'하겠다 alias f로
     model=pickle.load(f) # 불러 올때 load사용

model.predict(['짱이다'])
array([1], dtype=int64)

 

반응형

'빅데이터 서비스 교육 > 머신러닝' 카테고리의 다른 글

텍스트 마이닝  (0) 2022.07.06
앙상블 모델  (0) 2022.07.05
Linear Model 실습  (0) 2022.07.01
Linear Model  (0) 2022.06.29
예제 타이타닉 생존자 예측분석  (0) 2022.06.24