https://wikidocs.net/83544

위 내용을 참고하여 정리

 

1) Numpy로 패딩하기

import numpy as np
from tensorflow.keras.preprocessing.text import Tokenizer
preprocessed_sentences = [['barber', 'person'], ['barber', 'good', 'person'], 
['barber', 'huge', 'person'], ['knew', 'secret'], ['secret', 'kept', 'huge', 'secret'], 
['huge', 'secret'], ['barber', 'kept', 'word'], ['barber', 'kept', 'word'], 
['barber', 'kept', 'secret'], ['keeping', 'keeping', 'huge', 'secret', 'driving', 'barber', 'crazy'], 
['barber', 'went', 'huge', 'mountain']]

// 단어 집합을 만들고, 정수 인코딩을 수행
tokenizer = Tokenizer()
tokenizer.fit_on_texts(preprocessed_sentences)
encoded = tokenizer.texts_to_sequences(preprocessed_sentences)
print(encoded)

모든 단어가 고유한 정수로 변환

 

- 모두 동일한 길이로 맞춰주기 위해 가장 길이가 긴 문장의 길이를 계산한다.

max_len = max(len(item) for item in encoded)
print('최대 길이 :',max_len)

최대 길이 : 7

 

- 가장 길이가 긴 문장의 길이는 7이므로 모든 문장의 길이를 7로 맞춘다.  데이터에 특정 값을 채워 데이터 크기를 조정하는 것을 패딩이라고 한다. 숫자 0을 사용하고 있다면 제로 패딩이라고 한다.

for sentence in encoded:
    while len(sentence) < max_len:
        sentence.append(0)

padded_np = np.array(encoded)
padded_np

 

 

2) 케라스 전처리 도구로 패딩하기

케라스에서는 패딩을 위한 pad_sequences()를 제공하고 있다.

padded = pad_sequences(encoded)
padded

 

- pad_sequences는 기본적으로 문서의 앞에 0으로 채우기 때문에 Numpy와의 패딩 결과가 다르다. 뒤에 0을 채우고 싶다면 인자로 padding='post'를 해주면 된다.

padded = pad_sequences(encoded, padding='post')
padded

 

- 꼭 가장 긴 문서의 길이를 기준으로 해야하는 것은 아니다. 길이에 제한을 두고 패딩할 수 있다. maxlen의 인자로 정수를 주면, 해당 정수로 모든 문서의 길이를 동일하게 한다. 길이가 maxlen보다 짧은 문서들은 0으로 패딩되고, 긴 문서는 데이터가 손실된다. 

padded = pad_sequences(encoded, padding='post', maxlen=5)
padded

 

- 기본적으로 앞쪽의 데이터가 손실되는데 뒤의 단어가 삭제되도록 하려면 truncating='post' 를 주면 된다.

 

+ Recent posts