3. 자연어처리 (보충)

1장에서 처음으로 다뤘던 자연어처리에 대해서 다시 짚고 넘어가보려고 한다. 아직 처음이다보니 여러 번 개념과 실습을 반복해야만 익혀지기 때문에 이러한 과정을 반복해서 진행해보려고 한다. 개념과 실습코드를 참고한 사이트는 다음과 같다 (https://wikidocs.net/32105)

  1. 전처리
    전처리에서 사용하는 토큰화(Tokenizer)는 인코딩(단어에 대한 인덱싱)을 위해 사용된다. 그리고 pad_sequence를 사용하는데, 이는 전체 훈련 데이터에서 각 샘플의 길이는 서로 다를 수 있기 때문이다. 각 문서 또는 각 문장은 단어의 수가 제각각이다. 모델의 입력으로 사용하려면 모든 샘플의 길이를 동일하게 맞추어야할 때가 있다. 이를 자연어 처리에서는 패딩(padding) 작업이라고 하는데, 보통 숫자 0을 넣어서 길이가 다른 샘플들의 길이를 맞춰준다. 케라스에서는 pad_sequence를 사용한다. pad_sequence는 정해준 길이보다 길이가 긴 샘플은 값을 일부 자르고, 정해준 길이보다 길이가 짧은 샘플은 값을 0으로 채운다
from tensorflow.keras.preprocessing.text import Tokenizer
    	
t = Tokenizer()
text = "The earth is an awesome place live" 
t.fit_on_texts([text])

print(f'word_index: {t.word_index}')
print(f'word_count: {t.word_counts}')

sequence = t.texts_to_sequences([text])[0]
print('sequnce: {}'.format(sequence))

from tensorflow.keras.preprocessing.sequence import pad_sequences
pad_sequences([[1, 2, 3], [3, 4, 5, 6], [7, 8]], maxlen=3, padding='pre') # pre는 앞에, post는 뒤에 0을 채우게 된다, 지우는 것도 앞에서 기준으로 지우게 된다

  1. 단어 임베딩 (Word Embedding)
    단어 임베딩이란 텍스트 내의 단어들을 밀집 벡터(dense vector)로 만드는 것이다. 밀집 벡터는 원-핫 벡터와 비교되는데, 원-핫 벡터는 대부분이 0의 값을 가지고, 단 하나의 1의 값을 가지는 벡터를 말한다. 벡터들은 단어의 수만큼 벡터의 차원을 가지게 된다. 원-핫 벡터는 예를 들어 [0 1 0 0 0 0 중략 0 0 0 0]과 같다. 단어의 수만큼 차원을 가지게 되는데, 단어 간 유사도가 모두 동일하다는 단점이 있다
    반면에 밀집 벡터 또한 벡터의 형태를 가지고 있지만, 0 혹은 1이 아닌 대부분의 값이 실수이고, 상대적으로 저차원을 가진다. 예를 들어 [0.1 -1.2 0.8 0.2 1.8]의 형태를 가지고 있다

이러한 밀집 벡터로 만드는 과정을 단어 임베딩이라고 한다. 주로 원-핫 벡터로 20,000 이상의 차원을 넘어가는 것과 달리 단어 임베딩은 256, 512, 1024 차원을 가지게 된다. 임베딩 벡터는 초기에는 랜덤한 값을 가지지만, 인공 신경망의 가중치가 학습되는 방법과 같은 방식으로 학습되며 변경된다

케라스에서는 Embedding이라는 레이어를 제공해주는데, 총 단어의 길이 그리고 압축할 차원에 대해서 매개변수로 받게 된다

from tensorflow.keras.layers import Embedding
from tensorflow.keras.preprocessing.text import Tokenizer

t = Tokenizer()
t.fit_on_texts(text)
print(t.word_counts, t.word_index)

word_index와 같은 경우는 빈도에 따라서 처음 순서를 지정받게 됨을 알 수 있다

t.texts_to_sequences(text)

Embedding(classes, 2, input_length=5)
  • 첫번째 인자 = 단어 집합의 크기. 즉, 총 단어의 개수
  • 두번째 인자 = 임베딩 벡터의 출력 차원. 결과로서 나오는 임베딩 벡터의 크기
  • input_length = 입력 시퀀스의 길이

좋은 웹페이지 즐겨찾기