본문 바로가기

자연어 처리

타이타닉 데이터 분석 및 자연어처리 (RNN)

결측치는 아래 두가지 방법으로 진행

  1. 삭제 (다른 데이터에 영향 없을때 가능)
  2. 대체 

isna() 함수로 결측치냐? 결측치 있으면 True, 없으면 False를 반환함

 

파이썬은 boolean 값을 연산이 가능함

 

False —> 0 , True —> 1이기 때문.

 

결측치가 있으면 훈련이 제대로 안된다. 

 

머신러닝 성능

  • 머신러닝 80% 괜찮다
  • 90% 좋다
  • 95% 무지 좋다

 

 

  • 자연어
  • 시계열 데이터
  • 순서가 있는 데이터

 

Ch7. 순환 신경망 1

  1. 언어를 분석하는 RNN (Recurrent Neural Network)
  • 텍스트를 분류
  • 뉴런의 상태를 저장하고 이를 다음 스텝에서의 입력으로 사용함
  • 긴 순서열에 대해서도 예측 가능
  • 문장이나 시계열 데이터와 같은 순서열을 예측
  • 예측하고자 하는 값이 더 오랜 과거의 데이터에 의존하게 해야함
  • 10000개의 단어로 구성된 단어장을 사용하는 언어 모형에서 과거 100 단어의 순서열에 대해 출력을 예측하려면 1,000,000 차원의 입력 벡터가 필요

2. 순차 데이터

- 지금까지 인공신경망에 사용한 데이터셋은 각 샘플이 독립적이라고 가정하고, 에포크마다 전체 샘플을 섞은 후에 모델 훈련을 진행하였다.

    - 완전 연결 신경망이나 합성곱 신경망은 이전의 샘플에 대한 정보를 유지하지 않는다.

    - 현재의 샘플을 처리할 때 이전에 어떤 샘플이 주입되었는지도 고려하지 않는다.

- 데이터 중에는 독립적이지 않고 각 샘플이 서로 연관되어 있는 경우도 있다.

 

(1) 순차 데이터

- 시계열(time series) 데이터 : 일정 시간 간격으로 배치된 데이터

    - 예) 날씨 정보 : 3시 정보는 2시 정보와 연관이 있다.

- 순차 데이터(sequential data) : 샘플에 순서가 있는 데이터

    - 예) 시계열 데이터

    - 예) 텍스트 : 글을 구성하는 글자와 단어들의 순서가 맞아야 의미가 제대로 전달된다.

 

(2) 타임 스텝(time step)

- 모델에서 순차 데이터를 처리하는 각 단계

    - 예) 3개의 단어로 이루어진 순차 데이터 (Hello Deep Learning)

    -> 처리 단위가 단어라면 총 타임

 

  • 파이썬 대량의 데이터 저장
  1. 리스트.   [1, 2, 3]
  2. 튜플.      (1, 2, 3) -> 특징: 데이터 수정이 안됨 
  3. 딕셔너리      {‘one’ : 1, ‘two’: 2, ‘three’ : 3}
  4. 세트.       {1, 2, 3} -> 특징: 데이터의 중복 허용하지 않음, 데이터를 불러오기 어려움, 리스트에 있는 중복 데이터 제거할때 자주 사용함. 

 

 

# 참고예제1. 딕셔너리 key, value 교환하기

word_to_index = {'fawn': 34701, 'tsukino': 52006, 'nunnery':52007, 'sonja':16816,
                 'vani':63951}

print(word_to_index)
print('-' * 20)

for k in word_to_index :
    print(word_to_index[k], k)
    
print('-' * 20)

# 내포 : 리스트나 딕셔너리를 for문을 이용해서 한꺼번에 만드는 방법
# 1) 리스트 내포 (리스트 뿐만 아니라 딕셔너리도 사용 가능)
lst1 = [i for i in range(50)]
print(lst1)
print('-' * 20)

# 딕셔너리의 key와 value 값을 바꾼 딕셔너리 만들기
index_to_word = {word_to_index[k]: k for k in word_to_index}
print(index_to_word)
print('-' * 20)

Ch7. 순환 신경망 1

  1. 언어를 분석하는 RNN (Recurrent Neural Network)
  • 텍스트를 분류
  • 뉴런의 상태를 저장하고 이를 다음 스텝에서의 입력으로 사용함
  • 긴 순서열에 대해서도 예측 가능
  • 문장이나 시계열 데이터와 같은 순서열을 예측
  • 예측하고자 하는 값이 더 오랜 과거의 데이터에 의존하게 해야함
  • 10000개의 단어로 구성된 단어장을 사용하는 언어 모형에서 과거 100 단어의 순서열에 대해 출력을 예측하려면 1,000,000 차원의 입력 벡터가 필요
  1. 텍스트 데이터 세트 준비

(1) IMDB (Internet Movie Database)

  • 서양의 영화 정보 모음 사이트이다.
  • Https://www.imdb.com/
  • 데이터셋은 훈련셋 25000 , 테스트셋 25000

 

 

예제1. 테너플로의 IMDB 데이터세트 구조 확인하기

  • 왠만한 모든 데이터는 500개 데이터 안에 포함되어있음
  • Box plot과 픽스토그램으로 확인
  • 세로축은 numpy 배열의 갯수이다.
  • 머신러닝의 입력 데이터는 모두 숫자로 이루어져야 한다.

 

  • Imdb 데이터셋의 구조
  • 아래와 같이 0,1,2가 특수한 문자로 나타냄

숫자 0 : 패딩을 나타냄

숫자 1 : 글의 시작을 나타냄

숫자 2 : 어휘 사전에 없는 단어 

=> 데이터셋에서 3을 빼야지만 정확한 단어를 나타냄

 

  • Imdb 데이터셋 확인
  1. 0, 1, 2 숫자 제거
  2. 데이터셋에서 3을 빼야함 
  3. 이렇게 해야 정확한 데이터를 볼 수 있음

 

150개 데이터셋을 200개 데이터셋으로 만들고자 할때

0으로 채우는 작업을 ‘패딩’이라고 한다.

 

Q1. 어휘 사전에 없는 단어를 왜 넣는걸까요 ?

고유명사 같은 경우 어휘 사전에 없는 단어로 빼버린다.

딱 안에 있는 단어들로만 어휘 사전을 만든 것이다.

 

5만개 => 8만개 

어휘 사전에 없을 수도 있지만 하나의 규칙이다.

특히 자연어로 데이터를 만들때 

  1. 0, 1, 2 숫자 제거
  2. 데이터셋에서 3을 빼야함 
  3. 이렇게 해야 정확한 데이터를 볼 수 있음

이러한 규칙대로 데이터셋을 만들기도 한다.

 

  1. 샘플의 길이 맞추기

(1) 샘플의 구조

  • 각 리뷰들의 길이가 달라 샘플의 길이가 다르다.
  • 샘플의 길이가 다르면 모델을 제대로 훈련시킬 수 없다. => 같은 길이로 맞추어야 한다.
  • 잘라버리거나 0으로 채운다

 

(2) 텐서플로로 샘플의 길이 맞추기

  • 문장의 길이를 maxlen 인자로 맞춰준다.
  • 모델의 입력으로 사용하려면 고정된 길이로 만들어야 하므로 ~~ 

 

예제3. 텐서플로의 IMDB 데이터세트 샘플이 길이 맞추기

 

  1. 샘플을 원-핫 인코딩하기
  • 데이터를 준비하는 마지막 단계는 정수 데이터를 원-핫 인코딩하는 것이다. 가장 큰 단어를 1로 바꾼다. 
  • 20000개의 샘플이 100차원으로 원-핫 인코딩 되었다.
  • 텐서플로의 to_categorical() 함수를 사용한다.
  • 샘플을 100개의 단어로 제안했지만, x_train_onehot의 크기를 확인해보면760MB 정도가 된다.
  • 훈련에 사용할 단어의 개수가 늘어나면 컴퓨터의 메모리가 더 필요하다.

 

  1. 순환신경망 

 

참고예제2. 배열의 축 변환 : numpy.swapaxes()

 

예제5. 순환 신경망을 만들고 텍스트를 분류