본문 바로가기
A·I

[Keras] 영화 리뷰 데이터로 알아보는 시퀀스 데이터

by 방구석 몽상가 2018. 12. 26.
2018-12-26-keras-sequence-data-imdb

1. 시퀀스(Sequence), 시계열 데이터

시퀀스(Sequence) 데이터는 쉽게 말하자면, 순서가 있는 데이터다. 하지만, 순서가 있다는 것이 정렬되었다는 의미는 아니다. 예를 들어 대표적인 시퀀스 데이터인 문자열을 살펴보자. "안녕하세요" 라는 문자열은 '안', '녕', '하', '세', '요' 의 순서를 유지해야 그 뜻이 유지된다. 만약 순서가 뒤바뀌어 "녕안세하요" 라고 하면 동일한 데이터라고 볼 수 없는 것이다. 비디오 데이터도 마찬가지다. 비디오 데이터셋은 (samples, frames, height, width, cmap)의 5D 텐서로 나타낼 수 있는데 여기서 frame 순서가 뒤바뀌면 안 되므로 시퀀스 데이터다.

만약 순서가 시간이라면 시계열 데이터라고 부를 수 있다. 시계열 데이터는 시간 축을 포함한 데이터이며 주식 데이터를 대표적인 예시로 들 수 있다. 주식은 시간에 따라 현재 주식 가격, 최고 가격, 최소 가격이 달라진다. 따라서 시간 축을 반드시 포함하여 데이터를 표현하여야 학습하기 위한 의미있는 데이터라 볼 수 있다.

 

2. 영화 리뷰 긍/부정 분류 : Binary Classification

대표적인 시퀀스 데이터인 문자열 데이터 집합인 IMDB 데이터셋 학습 과정을 살펴보면서 시퀀스 데이터를 좀 더 이해해보자. 여기서 IMDB(Internet Movie Database)는 양극단의 영화 리뷰 5만 개로 이루어진 문자열 데이터셋이다.

 

2.1 IMDB 데이터셋 확인하기

IMDB 데이터셋은 keras에 포함되어 있으므로 imdb 모듈로 데이터를 불러올 수 있다. num_words 매개 변수는 영화 의견 중 가장 자주 나타나는 단어를 몇 개까지 사용할 것인지를 설정하는 변수다. 이해가 되지 않는다면 데이터 형태를 살펴보자.

먼저, 각 훈련, 테스트 데이터셋은 모두 25000개의 데이터를 가지고 있다. 여기서 훈련 데이터와 *라벨의 일부를 출력해보자.

하나의 훈련 데이터는 하나의 영화 감상평이고 그에 매칭되는 라벨은 긍정인지 부정인지를 나타내는 1 혹은 0이다. 여기서 1은 긍정, 0은 부정을 나타낸다. 위에 훈련 데이터는 숫자 리스트로 나타나있는데 이 숫자들의 의미는 미리 정의된 단어 리스트의 인덱스다. 위에서 사용하는 단어를 가장 자주 등장하는 단어 10000개로 제한했기 때문에 리스트 내 인덱스들은 9999를 넘지 않는다.

이 인덱스 리스트들을 실제 문자열로 바꿔보자. (코드 참고 : 케라스 창시자에게 배우는 딥러닝)

단어의 인덱스를 저장하고 있는 word_index 리스트를 불러오고 key와 value를 뒤바꿔 저장해준다. 이 과정을 하는 이유는 ('단어', 인덱스) 형태로 저장되어 있기 때문에 인덱스와 매핑하기 쉽도록 뒤집어주는 것이다. 그런 다음 훈련 데이터 리스트의 값을 인덱스로 원래 단어를 얻어오고 각 단어를 공백으로 구분한다. 여기서 -3을 해주는 이유는 0, 1, 2는 'padding', '문서 시작', '사전에 없음'을 위한 인덱스이기 때문이다. 이러한 문자들은 '?'로 대체하였다.

여기서 훈련 데이터 내 인덱스 순서가 바뀐다면 해당 문장의 의미는 완전히 달라질 것이다. 따라서 순서가 중요한 의미를 지니는 데이터이므로 이러한 문장 데이터는 시퀀스 데이터라고 할 수 있다.

 

2.2 데이터 전처리

이 데이터를 학습하기 위해서는 약간의 전처리 과정을 거쳐야 한다. 신경망에 주입하기 위해서는 숫자 리스트를 텐서로 바꾸어 주어야 한다. 여러 가지 방식이 있을 수 있지만, 원-핫 인코딩하여 벡터로 변환해보겠다.

원-핫 인코딩을 하면 하나의 문장은 10000차원의 벡터가 된다. 만약 리스트 값 중 54, 13, 1610이 있으면 해당 인덱스의 값은 1이 되고 리스트 내 없는 값들에 해당하는 인덱스의 값은 전부 0이 된다.

(코드 참고 : 케라스 창시자에게 배우는 딥러닝)

(samples, 10000)의 텐서를 만들고 위에 설명한 것처럼 매칭되는 인덱스는 1로 초기화한다.

레이블은 손쉽게 벡터로 바꿀 수 있다.

 

이제 준비된 데이터를 가지고 생성된 학습 모델에 주입하여 학습할 수 있다. 다른 시퀀스 데이터도 비슷한 과정을 통해 전처리를 할 수 있다.

댓글