본문 바로가기

딥러닝/[딥 러닝을 이용한 자연어 처리 입문]딥러닝

패딩(Padding)

자연어 처리를 하다보면 각 문장(또는 문서)은 서로 길이가 다를 수 있습니다.

기계어의 병렬 연산을 위해서 여러 문장의 길이를 임의로 동일하게 맞춰주는 작업이 필요할 때가 있습니다.

 

1.Numpy로 패딩하기

단어 집합을 만들고, 정수 인코딩을 수행합니다.

모든 단어가 고유한 정수로 변환되었습니다.

모두 동일한 길이로 맞춰주기 위해서 이 중에서 가장 길이가 긴 문장의 길이를 계산해보겠습니다.

모든 문장의 길이를 숫자 0을 채워 가장 길이가 긴 문장의 길이로 맞춥니다.

기계는 이들을 하나의 행렬로 보고, 병렬 처리를 할 수 있습니다.

또한, 0번 단어는 사실 아무런 의미도 없는 단어이기 때문에 자연어 처리하는 과정에서 기계는 0번 단어를 무시하게 될 것입니다.

이와 같이 데이터에 특정 값을 채워서 데이터의 크기(shape)를 조정하는 것을 패딩(padding)이라고 합니다.

숫자 0을 사용하고 있다면 제로 패딩(zero padding)이라고 합니다.

 

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

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

 

 

pad_sequences는 기본적으로 문서의 앞에 0으로 채웁니다.

뒤에 0을 채우고 싶다면 인자로 padding='post'를 주면됩니다.

Numpy를 이용하여 패딩을 했을 때와 결과가 동일합니다. 

True값이 리턴됩니다. 두 결과가 동일하다는 의미입니다.

가장 긴 문서의 길이를 기준으로 해야하는 것은 아닙니다.

길이에 제한을 두고 패딩할 수 있습니다.

maxlen의 인자로 정수를 주면, 해당 정수로 모든 문서의 길이를 동일하게 합니다.

길이가 짧았다면 0으로 패딩되고, 기존에 5보다 길었다면 데이터가 손실됩니다.

만약, 데이터가 손실될 경우에 앞의 단어가 아니라 뒤의 단어가 삭제되도록 하고싶다면 truncating='post'를 사용하면 된다.

 

숫자 0으로 패딩하는 것은 널리 퍼진 관례이긴 하지만, 반드시 지켜야하는 규칙은 아닙니다.

현재 사용된 정수들과 겹치지 않도록, 단어 집합의 크기에 +1을 한 숫자로 사용해봅시다.

pad_sequences의 인자로 value를 사용하면 0이 아닌 다른 숫자로 패딩이 가능합니다.