rueki

(NLP in TensorFlow) 2. Text to Sequence 본문

DL/NLP

(NLP in TensorFlow) 2. Text to Sequence

륵기 2020. 3. 24. 22:47
728x90
반응형

이전 글에서는 단어와 문장을 토큰화 하는 방법을 알아보았고, 하나의 corpus가 생성되는 것을 볼 수 있었다.

이 다음 작업으로 필요한 것은 토큰 기반으로 문장을 Value list로 만드는 것이다.

 

이미지 데이터에서는 신경망에 입력할 때 이미지 크기로 정의가 된다.

크기가 다를 때는 reshape 해서 크기를 조정하지만, 텍스트에서는 일단 문장들의 길이를 하나의 길이로 통일 시켜야 한다.

 

아래의 두 문장 예시가 있다.

 

1) 나는 엄마를 좋아해.

2) 나는 엄마보다 아빠를 좋아해.

 

단어 한 개를 문장 길이 1이라고 가정했을 때 1번은 3, 2번은 4이다.

여기서 길이를 3으로 통일하게 되면 2번 문장에서 좋아해는 없어지게 되며, 1번과 2번 문장의 길이는 같아진다.

 

이제 위에서 설명한 것들을 코드로 옮겨보도록 하자.

from tensorflow.keras.preprocessing.text import Tokenizer

sentences = [
    'I love my dog',
    'I love my cat',
    'you love my dog!',
    'Do you think my dog is amazing?'
]

tokenizer = Tokenizer(num_words=100)
tokenizer.fit_on_texts(sentences)
word_index = tokenizer.word_index
sequences = tokenizer.texts_to_sequences(sentences)

print(word_index)
print(sequences)

이전 글에서 추가된 코드를 보면 texts_to_sequences가 있다.

이를 이용해서 문자를 숫자로 인코딩 할 수가 있다.

 

-결과

{'my': 1, 'love': 2, 'dog': 3, 'i': 4, 'you': 5, 'cat': 6, 'do': 7, 'think': 8, 'is': 9, 'amazing': 10}

[[4, 2, 1, 3], [4, 2, 1, 6], [5, 2, 1, 3], [7, 5, 8, 1, 3, 9, 10]]

 

I LOVE MY DOG
4 2 1 3

첫 번째 문장 인코딩 된 것을 예시로 들면 위의 표와 같다.

단어 인덱스와 매칭을 하면, 왜 이런 결과가 나왔는지 이해가 될 것이다.

 

이는 신경망을 훈련할 때, 여러 문장을 넣게 될텐데, 여기서 하나의 단어가 같은 index로 값을 가져야 하며, 그렇지 않으면 의미가 없다. 

첫 번째 문장과, 두 번째 문장에서 'I' 가 다른 인코딩 값을 가지게 된다면, 이를 학습할 때 문제가 생길 것이다.

 

test_data = ['i really love my dog','my dog loves my manatee']

test_seq = tokenizer.texts_to_sequences(test_data)
print(test_seq)

'''
[[4, 2, 1, 3], [1, 3, 1]]
'''

테스트 데이터로 상단에서 만든 Tokenizer 모델에 적용했을 때 코드 내부의 주석에 적혀있는 결과가 나온다.

my dog loves my manatee 의 문장에서  my, dog 만 존재하기에 [1, 3, 1]의 인코딩 값만 받게 된다.

728x90
반응형

'DL > NLP' 카테고리의 다른 글

어텐션 메커니즘 (Attention)  (0) 2020.04.18
(NLP in TensorFlow) 3. Padding  (0) 2020.03.25
(NLP in TensorFlow) 1. 단어 기반 인코딩  (0) 2020.03.24
글로브(Glove)  (0) 2019.07.04
패스트텍스트(FastText)  (0) 2019.07.04
Comments