프로젝트/2021 한이음(probono)

[프로보노프로젝트/딥러닝] 패딩 (Padding)

pxatd 2021. 8. 25. 15:57
728x90

1. 패딩을 사용하는 이유

 

자연어 처리를 하다보면 각 문장(또는 문서)은 서로 길이가 다를 수 있다. 그런데 기계는 길이가 전부 동일한 문서들에 대해서는 하나의 행렬로 보고, 한꺼번에 묶어서 처리할 가능성이 존재한다. 다시 말해 병렬 연산을 위해서 여러 문장의 길이를 임의로 동일하게 맞춰주는 작업이 필요하다. (wikidocs발췌)

 

우리의 프로젝트 역시, 각 샘플의 길이가 너무나도 다르고 짧은건 한 줄, 긴 건 수십 줄이였기 때문에 패딩을 통해 일정하게 길이를 맞추어야겠다고 생각했다.

 

따라서 나는 from tensorflow.keras.preprocessing.sequence import pad_sequences, 케라스에서 제공하는 pad_sequences()도구를 사용하여 샘플의 길이를 일정하게 맞추는 작업을 진행하였다. 

 

2. text data 토큰화

 

import numpy as np
import pandas as pd
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.utils import to_categorical
import numpy as np
import pandas as pd
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
import nltk
nltk.download('punkt')

text_data = pd.read_csv('textvp.txt',names=['data','label'] , sep='|')
text_train = text_data['data'].to_numpy()
text_target=text_data['label'].to_numpy()

tokenizer = Tokenizer()
tokenizer.fit_on_texts(text_train)

encoded = tokenizer.texts_to_sequences(text_train)
print(encoded)

텍스트 데이터를 토큰화 시키는 코드이다.

-fit_on_texts 메소드를 사용해 현재 Tokenizer 객체를 해당 데이터에 맞게 fitting 해준다. (각 단어 인덱스를 체크하여 각 인덱스별로 벡터를 적절하게 결정한다)

-texts_to_sequences에 사용할 문자열을 넣으면 해당 문자열의 각 단어에 인덱스를 부여해준다. ('The cat sat on the other cat' => [1, 2, 3, 4, 1, 5, 2])

 

 

3. text data padding

padding을 하는 방법에는 두 가지가 있는데 위키독스(https://wikidocs.net/83544)에 따르면 

1. 데이터의 앞을 0으로 채우기 

프로젝트의 text data set으로 진행한  pad_sequences

2. 데이터의 뒤를 0으로 채우기

프로젝트의 text data set으로 진행한  pad_sequences(padding = 'post')

4. 우리 프로젝트에서 사용한 padding 과 그 이유 

padded = pad_sequences(encoded, truncating = 'post', maxlen = 500)
print(padded)

-maxlen은 길이가 maxlen보다 짧은 문서들은 0으로 패딩되고, 기존에 maxlen보다 길었다면 데이터가 손실된다.

 

우리 프로젝트에서는 pad_sequences 명령어에 truncating = 'post'를 넣어 앞의 빈 부분을 0으로 채우도록 코딩하였다. 그 이유는 우리가 사용하는 엔진인 RNN은 순환하며 데이터를 학습하기에 마지막 셀의 영향이 엔진 학습에 가장 큰 영향을 미치기 때문이다.  (첫번째에 있는 셀이 두번째에 쓰이고... 그렇게되면 마지막 셀의 영향이 커짐)

 

5. 기타 노션 정리 내용 update

프로젝트에서 전처리 개발을 맡은지도 두 달이 되어가는데 처음에는 구글링 하는 속도도 느리고 제대로 된 정보를 찾는것 조차 어려웠다면 지금은 프로젝트에 적합한 정보(코드)를 찾아 적용시켜 원하는 결과를 내는 것에 어느정도 익숙해 진 것 같아 신기하다. 이제 검증데이터 분리, 어휘사전 데이터 개수 줄이기, STT, 라즈베리파이와 연결 등이 남았는데 끝까지 책임감을 갖고 잘 마무리 해보겠다. 

728x90