-
패딩(Padding)Natural Language Processing/딥 러닝을 이용한 자연어 처리 입문 2021. 5. 18. 13:38반응형
https://wikidocs.net/83544 참고하여 공부한 내용 정리
07) 패딩(Padding)
병렬 연산을 위해 여러 문장의 길이를 임의로 동일하게 맞춰주는 작업이 필요함
1.
Numpy
로 패딩하기
import numpy as np from tensorflow.keras.preprocessing.text import Tokenizer
정수 인코딩 진행
tokenizer=Tokenizer() tokenizer.fit_on_texts(sentences) # sentences는 이전 데이터 사용
텍스트 시퀀스의 모든 단어들을 각 정수에 매핑 후 출력
encoded=tokenizer.texts_to_sequences(sentences) print(encoded)
[[1, 5], [1, 8, 5], [1, 3, 5], [9, 2], [2, 4, 3, 2], [3, 2], [1, 4, 6], [1, 4, 6], [1, 4, 2], [7, 7, 3, 2, 10, 1, 11], [1, 12, 3, 13]]
모든 단어가 고유한 정수에 매핑된 결과를 확인할 수 있음
max_len=max(len(item) for item in encoded) print(max_len)
7
문장의 최대 길이는 7임
for item in encoded: # 각 인코딩된 문장에 대해서 while len(item)<max_len: # 최대 길이보다 작으면 최대 길이가 될 때까지 0으로 pad item.append(0) padded_np=np.array(encoded) print(padded_np)
[[ 1 5 0 0 0 0 0] [ 1 8 5 0 0 0 0] [ 1 3 5 0 0 0 0] [ 9 2 0 0 0 0 0] [ 2 4 3 2 0 0 0] [ 3 2 0 0 0 0 0] [ 1 4 6 0 0 0 0] [ 1 4 6 0 0 0 0] [ 1 4 2 0 0 0 0] [ 7 7 3 2 10 1 11] [ 1 12 3 13 0 0 0]]
길이가 7보다 짧은 문장에 0으로 패딩하여 모든 문장의 길이가 7로 같게 만듦
2. 케라스 전처리 도구로 패딩하기
케라스에서는 패딩을 위한 도구로
pad_sequences()
제공함from tensorflow.keras.preprocessing.sequence import pad_sequences
encoded=tokenizer.texts_to_sequences(sentences) print(encoded)
[[1, 5], [1, 8, 5], [1, 3, 5], [9, 2], [2, 4, 3, 2], [3, 2], [1, 4, 6], [1, 4, 6], [1, 4, 2], [7, 7, 3, 2, 10, 1, 11], [1, 12, 3, 13]]
pad_sequences
사용하여 패딩padded=pad_sequences(encoded) padded
array([[ 0, 0, 0, 0, 0, 1, 5], [ 0, 0, 0, 0, 1, 8, 5], [ 0, 0, 0, 0, 1, 3, 5], [ 0, 0, 0, 0, 0, 9, 2], [ 0, 0, 0, 2, 4, 3, 2], [ 0, 0, 0, 0, 0, 3, 2], [ 0, 0, 0, 0, 1, 4, 6], [ 0, 0, 0, 0, 1, 4, 6], [ 0, 0, 0, 0, 1, 4, 2], [ 7, 7, 3, 2, 10, 1, 11], [ 0, 0, 0, 1, 12, 3, 13]])
pad_sequences
는 기본적으로 문서의 앞에 0을 채움. 뒤에 0을 채우고 싶다면 아래와 같이 인자로padding='post'
를 주면 됨padded=pad_sequences(encoded, padding='post') padded
array([[ 1, 5, 0, 0, 0, 0, 0], [ 1, 8, 5, 0, 0, 0, 0], [ 1, 3, 5, 0, 0, 0, 0], [ 9, 2, 0, 0, 0, 0, 0], [ 2, 4, 3, 2, 0, 0, 0], [ 3, 2, 0, 0, 0, 0, 0], [ 1, 4, 6, 0, 0, 0, 0], [ 1, 4, 6, 0, 0, 0, 0], [ 1, 4, 2, 0, 0, 0, 0], [ 7, 7, 3, 2, 10, 1, 11], [ 1, 12, 3, 13, 0, 0, 0]])
numpy
를 이용한 결과와pad_sequences
를 이용한 결과를 비교(padded==padded_np).all()
True
동일한 것을 확인할 수 있음
문서의 최대 길이를
max_len
으로 정해놓고 패딩을 진행padded=pad_sequences(encoded, padding='post', maxlen=5) padded
array([[ 1, 5, 0, 0, 0], [ 1, 8, 5, 0, 0], [ 1, 3, 5, 0, 0], [ 9, 2, 0, 0, 0], [ 2, 4, 3, 2, 0], [ 3, 2, 0, 0, 0], [ 1, 4, 6, 0, 0], [ 1, 4, 6, 0, 0], [ 1, 4, 2, 0, 0], [ 3, 2, 10, 1, 11], [ 1, 12, 3, 13, 0]])
길이가 5보다 작으면 0으로 패딩되고 5보다 길면 데이터가 손실됨
last_value=len(tokenizer.word_index)+1 # 단어 집합의 크기보다 1 큰 숫자를 사용 print(last_value)
14
pad_sequences
의 인자로value
값을 사용하면 0이 아닌 다른 숫자로 패딩이 가능함padded=pad_sequences(encoded, padding='post', value=last_value) padded
array([[ 1, 5, 14, 14, 14, 14, 14], [ 1, 8, 5, 14, 14, 14, 14], [ 1, 3, 5, 14, 14, 14, 14], [ 9, 2, 14, 14, 14, 14, 14], [ 2, 4, 3, 2, 14, 14, 14], [ 3, 2, 14, 14, 14, 14, 14], [ 1, 4, 6, 14, 14, 14, 14], [ 1, 4, 6, 14, 14, 14, 14], [ 1, 4, 2, 14, 14, 14, 14], [ 7, 7, 3, 2, 10, 1, 11], [ 1, 12, 3, 13, 14, 14, 14]])
반응형'Natural Language Processing > 딥 러닝을 이용한 자연어 처리 입문' 카테고리의 다른 글
한국어 전처리 패키지 (0) 2021.05.18 원-핫 인코딩 (One-hot Encoding) (0) 2021.05.18 정수 인코딩(Integer Encoding) (0) 2021.05.18 정규 표현식(Regular Expression) (0) 2021.05.17 불용어(Stopwords) (0) 2021.05.17