-
패딩(Padding)Natural Language Processing/딥 러닝을 이용한 자연어 처리 입문 2021. 5. 18. 13:38728x90반응형
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_sequencesencoded=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) paddedarray([[ 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') paddedarray([[ 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) paddedarray([[ 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)14pad_sequences의 인자로value값을 사용하면 0이 아닌 다른 숫자로 패딩이 가능함padded=pad_sequences(encoded, padding='post', value=last_value) paddedarray([[ 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]])728x90반응형'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