패딩
앞서 정수 인코딩을 하는 과정에서 문장 토큰화 후 문장 별로 단어 토큰화를 했다.
이 때 문장마다 단어의 개수가 다르므로 인코딩 후 각 리스트마다 길이가 다르다.
'''
[[1, 5],
[1, 8, 5],
[1, 3, 5],
[8, 2],
[2, 4, 3, 2],
[3, 2],
[1, 4, 6],
[1, 4, 6],
[1, 4, 2],
[7, 7, 3, 2, 8, 1, 8],
[1, 8, 3, 8]]
'''
길이를 동일하게 맞추기 위해서는 가장 긴 문장을 기준으로 다른 문장들의 길이를 늘린다.
가상의 단어 'PAD'가 있다고 가정하고 0번으로 정의해서 짧은 문장들을 채운다.
for sentence in encoded:
while len(sentence) < max_len:
sentence.append(0)
padded_np = np.array(encoded)
padded_np
'''
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]])
'''
보편적으로 문장 뒤에 0을 채워 길이를 동일하게 맞춘다.
이 0은 의미 없는 단어이기 때문에 자연어 처리 과정에서 무시하게 될 것이다.
이렇게 데이터의 크기를 조정하는 것을 패딩이라고 하고,
숫자 0을 사용한다면 제로 패딩이라고 한다.
케라스 패딩
pad_sequences()
케라스에서는 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]], dtype=int32)
'''
케라스의 패딩 처리는 위와 달리 기본적으로 문서의 앞에 0을 채운다.
위에서 진행했던 것처럼 뒷 부분에 0을 채우고 싶다면 padding='post'를 인자에 추가하면 된다.
또한 패딩을 진행할 때, 가장 긴 문장을 기준으로 하는 것이 아닌 일정한 기준을 줄 수 있다.
평균 문장의 길이가 20인데 한 문장이 5000이라면 5000을 기준으로 잡는 것이 낭비일 수 있다.
이런 경우 maxlen=n을 인자로 주어 긴 문장을 잘라낼 수도 있다.
이 또한 기본 값은 뒷 부분을 사용하고 앞 부분이 제거된다.
뒤의 단어를 삭제하고 싶다면 truncating='post'를 인자로 추가하면 된다.
패딩을 0이 아닌 다른 숫자로 채우고 싶다면 value=n 인자를 추가할 수 있다.
'AI > NLP' 카테고리의 다른 글
[Wiki] 한국어 전처리 패키지 (1) | 2024.06.02 |
---|---|
[Wiki] 원-핫 인코딩 (0) | 2024.06.02 |
[Wiki] 정수 인코딩 (0) | 2024.06.01 |
[Wiki] 불용어 (0) | 2024.06.01 |
[Wiki] 어간 추출 (0) | 2024.06.01 |