딥러닝 영화 리뷰 감성분석

IngCoding·2022년 2월 24일
0

코드출처 : 모두의 딥러닝

import numpy as np
from numpy import array
from tensorflow.keras.preprocessing.text import Tokenizer # 토큰화
from tensorflow.keras.preprocessing.sequence import pad_sequences # 케라스 전처리 도구 for 패딩
from tensorflow.keras.models import Sequential # 레이어(층) 연결
from tensorflow.keras.layers import Dense,Flatten,Embedding # 레이어 설정, 1차원화, word2vect
# 텍스트 리뷰 10개를 정의
docs = ["너무 재밌네요","최고예요","참 잘 만든 영화예요","추천하고 싶은 영화입니다","한번 더 보고싶네요","글쎄요","별로예요","생각보다 지루하네요","연기가 어색해요","글쎄요 재미없어요"]

# 긍정 리뷰는 1, 부정 리뷰는 0으로 클래스 지정
classes = array([1, 1, 1, 1, 1, 0, 0, 0, 0, 0])

1. 토큰화

from tensorflow.keras.preprocessing.text import Tokenizer 

token = Tokenizer()
token.fit_on_texts(docs) # 문장에 토큰화 적용
# token.word_counts # 단어별 빈도수 확인 (결과창 길어서 생략)

# 인덱스 길이, 각 단어 인덱스 값 확인
print(len(token.word_index))
print(token.word_index) # 2회 나온 글쎄요 1번 인덱스, 나머지는 순서대로 
20
{'글쎄요': 1, '너무': 2, '재밌네요': 3, '최고예요': 4, '참': 5, '잘': 6, '만든': 7, '영화예요': 8, '추천하고': 9, '싶은': 10, '영화입니다': 11, '한번': 12, '더': 13, '보고싶네요': 14, '별로예요': 15, '생각보다': 16, '지루하네요': 17, '연기가': 18, '어색해요': 19, '재미없어요': 20}
# 문장 별 토큰화 결과 확인
x = token.texts_to_sequences(docs)
print('리뷰 텍스트, 토큰화 결과: \n', x)
리뷰 텍스트, 토큰화 결과: 
 [[2, 3], [4], [5, 6, 7, 8], [9, 10, 11], [12, 13, 14], [1], [15], [16, 17], [18, 19], [1, 20]]

2. 패딩 (데이터 길이를 맞춤)

# 문장 최대 길이 확인

len_list = []
for i in range(len(x)):
    len_list.append(len(x[i]))

print('문장 별 길이: ', len_list)
print('문장 최대 길이: ', np.max(len_list)) 
문장 별 길이:  [2, 1, 4, 3, 3, 1, 1, 2, 2, 2]
문장 최대 길이:  4
# 패딩 -> 서로 다른 길이 4로 맞춰줌
padded_x = pad_sequences(x,4)
print('패딩결과: \n', padded_x)
패딩결과: 
 [[ 0  0  2  3]
 [ 0  0  0  4]
 [ 5  6  7  8]
 [ 0  9 10 11]
 [ 0 12 13 14]
 [ 0  0  0  1]
 [ 0  0  0 15]
 [ 0  0 16 17]
 [ 0  0 18 19]
 [ 0  0  1 20]]

3. 테스트 데이터 만들기

test_docs = ["영화 재밌네요","올해 영화 중 최고예요","참 잘 만든 영화예요","추천하고 싶지 않은 영화입니다","두번 더 보고싶네요","글쎄요","아주 별로예요","생각보다 재미없네요","배우 연기가 어색해요","글쎄요 재미없어요"]
classes_test = array([1, 1, 1, 0, 1, 0, 0, 0, 0, 0])
# 토큰화 
from tensorflow.keras.preprocessing.text import Tokenizer
token_test = Tokenizer()
token_test.fit_on_texts(test_docs)

# 문장 별 토큰화 결과 확인
test_x = token_test.texts_to_sequences(test_docs)
print("\n리뷰 텍스트, 토큰화 결과:\n",  test_x)
리뷰 텍스트, 토큰화 결과:
 [[1, 3], [4, 1, 5, 6], [7, 8, 9, 10], [11, 12, 13, 14], [15, 16, 17], [2], [18, 19], [20, 21], [22, 23, 24], [2, 25]]
# 패딩
from tensorflow.keras.preprocessing.sequence import pad_sequences
test_padded_x = pad_sequences(test_x, 4)  
# print("\n패딩 결과:\n", test_padded_x)  # 결과 생략

4. 딥러닝 모델 적용

# 임베딩에 입력될 단어의 수 지정
word_size = len(token.word_index) + 1
 # 패딩 0까지 단어로 포함하기 위해 1을 더함
word_size
21
# 모델 적용 (입력층, 은닉층, 출력층 연결)
model = Sequential()

# 임베딩 (텍스트를 벡터화 )
# 벡터화 -> 크기조절이 가능한 배열구조로 구현
model.add(Embedding(26, 10, input_length=4))
model.add(Flatten()) # 다차원인 텐서플로 평탄화
model.add(Dense(1, activation='sigmoid'))  # 이진 분류(긍정/부정)

# 모델 컴파일 (활성화함수 adam 적용, 오차함수 이항교차엔트로피)
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# 모델 학습 : 데이터로 패딩된 피처(padded_x)와 클래스를 넣어준다.
model.fit(padded_x, classes, epochs=20) # 결과 생략
profile
Data & PM

0개의 댓글