ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 원-핫 인코딩 (One-hot Encoding)
    Natural Language Processing/딥 러닝을 이용한 자연어 처리 입문 2021. 5. 18. 14:18
    반응형

    https://wikidocs.net/22647 참고하여 공부한 내용 정리

    08) 원-핫 인코딩 (One-hot Encoding)

    • 단어 집합(vocabulary): 서로 다른 단어들의 집합, 여기에서 book과 books를 다른 단어로 간주함

    원-핫 인코딩을 위해 먼저 해야하는 일은 단어 집합을 만드는 일. 그리고 단어 집합에 고유한 숫자를 부여하는 정수 인코딩을 진행함

    1. 원-핫 인코딩(One-hot Encoding) 이란?


    원-핫 인코딩은 단어 집합의 크기를 벡터의 차원으로 하고 표현하고 싶은 단어의 인덱스에 1 값을 부여하고 나머지 인덱스에 0을 부여하는 단어의 벡터 표현 방식임

    원-핫 인코딩 과정

    (1) 각 단어에 고유한 인덱스 부여(정수 인코딩)

    (2) 표현하고 싶은 단어의 인덱스 위치에 1 부여하고 나머지 인덱스에 0 부여

    from konlpy.tag import Okt
    okt=Okt()
    token=okt.morphs('나는 자연어 처리를 배운다')
    print(token)
    ['나', '는', '자연어', '처리', '를', '배운다']

    Okt 형태소 분석기를 이용해 문장에 대해 토큰화 수행

    word2index={}
    for voca in token:
        if voca not in word2index.keys():
            word2index[voca]=len(word2index)
    print(word2index)
    {'나': 0, '는': 1, '자연어': 2, '처리': 3, '를': 4, '배운다': 5}

    각 토큰에 대해 고유한 index 부여. 지금은 문장이 짧아 단어의 빈도수 고려를 안 하지만 빈도수 순서로 단어를 정렬하여 고유한 인덱스를 부여하기도 함(정수 인코딩 챕터)

    def one_hot_encoding(word, word2index):
        one_hot_vector=[0]*(len(word2index))
        index=word2index[word]
        one_hot_vector[index]=1
        return one_hot_vector

    토큰을 입력하면 해당 토큰에 대한 원-핫 벡터를 만들어 냄

    one_hot_encoding('자연어', word2index)
    [0, 0, 1, 0, 0, 0]

    2. 케라스 이용한 원-핫 인코딩


    케라스에서는 원-핫 인코딩을 수행하는 to_categorical()을 지원함

    from tensorflow.keras.preprocessing.text import Tokenizer
    from tensorflow.keras.utils import to_categorical
    
    text="나랑 점심 먹으러 갈래 점심 메뉴는 햄버거 갈래 갈래 햄버거 최고야"
    
    t=Tokenizer()
    t.fit_on_texts([text])
    print(t.word_index) # 각 단어에 대한 인코딩 결과 출력
    {'갈래': 1, '점심': 2, '햄버거': 3, '나랑': 4, '먹으러': 5, '메뉴는': 6, '최고야': 7}

    단어 집합 출력

    sub_text="점심 먹으러 갈래 메뉴는 햄버거 최고야"
    encoded=t.texts_to_sequences([sub_text])[0]
    print(encoded)
    [2, 5, 1, 6, 3, 7]

    texts_to_sequences()를 통해 단어 텍스트를 정수 시퀀스로 변환. 정수 인코딩 결과임. 이 결과를 이용해 원-핫 인코딩 진행. 케라스는 정수 인코딩 결과로부터 원-핫 인코딩을 수행하는 to_categorical()을 지원함

    one_hot=to_categorical(encoded)
    print(one_hot)
    [[0. 0. 1. 0. 0. 0. 0. 0.]
     [0. 0. 0. 0. 0. 1. 0. 0.]
     [0. 1. 0. 0. 0. 0. 0. 0.]
     [0. 0. 0. 0. 0. 0. 1. 0.]
     [0. 0. 0. 1. 0. 0. 0. 0.]
     [0. 0. 0. 0. 0. 0. 0. 1.]]

    3. 원-핫 인코딩 한계


    • 원-핫 인코딩의 표현 방식은 단어의 개수가 늘어날 수록 벡터의 차원이 커지는 단점이 있음
    • 원-핫 벡터는 단어의 유사도를 표현하지 못하는 단점이 있음

    => 이러한 단점을 해결하기 위해 단어의 잠재 의미를 반영하여 다차원 공간에 벡화하는 기법으로 크게 두 가지가 있음. 1) 카운트 기반의 벡터화 방법인 LSA, HAL 등이 있음 2) 예측 기반의 벡터화 방법인 NNLM, RNNLM, Word2Vec, FastText 등이 있음. 카운트 기반과 예측 기반 두 가지 방법을 모두 사용하는 방법으로 GloVe가 있음

    반응형

    댓글

Designed by Tistory.