ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 패딩(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]])
    반응형

    댓글

Designed by Tistory.