원-핫 인코딩(One-hot encoding)

2020. 3. 30. 19:43·머신러닝/딥러닝을 이용한 자연어처리 입문

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

자연어 처리에서는 문자를 숫자로 바꾸는 여러 가지 기법들이 있습니다. 그중에서도 가장 기본적인 표현방법이 바로 원-핫 인코딩이라는 표현방법이다.

단어 집합의 크기를 벡터으 차원으로 하고, 표현하고 싶은 단어의 인덱스에 1의 값을 부여하고, 다른 인덱스에는 0을 부여하는 단어의 벡터 표현 방식이다. 이렇게 표현된 벡터를 원-핫 벡터(One-hot vector)라고 한다.

 

원-핫 인코딩의 두 가지 과정
(1) 각 단어에 고유한 인덱스를 부여합니다. (정수 인코딩)
(2) 표현하고 싶은 단어의 인덱스의 위치에 1을 부여하고, 다른 단어의 인덱스의 위치에는 0을 부여한다.

 

※예시※

 

문장: 나는 자연어 처리를 배운다

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

konlpy의 okt 형태소 분석기를 통해서 문장 토큰화

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

각 토큰에 대하여 고유 인덱스 부여 (빈도수 고려 X)

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]  

'자연어'라는 토큰을 입력으로 넣어봤더니 [0,0,1,0,0,0]라는 벡터가 나왔다. 단어의 집합에서 인덱스가 2이므로, 자연어를 표현하는 원-핫 벡터는 인덱스 2의 값이 1이며, 나머지 값은 0인 벡터가 나온다.

2. 케라스(Keras)를 이용한 원-핫 인코딩(One-hot encoding)

위에서는 파이썬으로 직접 코드를 작성하였지만, 케라스는 원-핫 인코딩을 수행하는 유용한 도구 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}

위와 같이 생성된 단어 집합(Vocabulary)에 있는 단어들로만 구성된 텍스가 있다면, texts_to_sequences()를 통해서 정수 시퀀스로 변환 가능하다. 단어 집합 내의 일부 단어들로만 구성된 서브 텍스트인 sub_text를 만들어 확인할 것이다.

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

이제 정수 인코딩을 하여 나온 결과를 가지고 원-핫 인코딩을 할 것이다. 케라스에서 지원하는 to_categorical()을 통해 해 볼 것이다.

one_hot = to_categorical(encoded)
print(one_hot)
[[0. 0. 1. 0. 0. 0. 0. 0.] #인덱스 2의 원-핫 벡터
 [0. 0. 0. 0. 0. 1. 0. 0.] #인덱스 5의 원-핫 벡터
 [0. 1. 0. 0. 0. 0. 0. 0.] #인덱스 1의 원-핫 벡터
 [0. 0. 0. 0. 0. 0. 1. 0.] #인덱스 6의 원-핫 벡터
 [0. 0. 0. 1. 0. 0. 0. 0.] #인덱스 3의 원-핫 벡터
 [0. 0. 0. 0. 0. 0. 0. 1.]] #인덱스 7의 원-핫 벡터

위의 결과는 "점심 먹으러 갈래 메뉴는 햄버거 최고야"라는 문장이 [2, 5, 1, 6, 3, 7]로 정수 인코딩이 되고 나서, 각각의 인코딩 된 결과를 인덱스로 원-핫 인코딩이 수행된 모습을 보여준다.

'머신러닝 > 딥러닝을 이용한 자연어처리 입문' 카테고리의 다른 글

Bag of Words(BoW)  (0) 2020.03.30
RNN(Recurrent Neural Network)  (0) 2020.01.02
데이터의 분리(Splitting Data)  (0) 2019.11.19
불용어(Stopword)  (0) 2019.11.11
어간 추출(Stemming) and 표제어 추출(Lemmatization)  (0) 2019.11.01
'머신러닝/딥러닝을 이용한 자연어처리 입문' 카테고리의 다른 글
  • Bag of Words(BoW)
  • RNN(Recurrent Neural Network)
  • 데이터의 분리(Splitting Data)
  • 불용어(Stopword)
dev.JJ
dev.JJ
Software Programming
  • dev.JJ
    끊임없이 생각하자
    dev.JJ
  • 전체
    오늘
    어제
    • 분류 전체보기 (43)
      • 서버 개발(생각과 구현) (14)
      • 머신러닝 (24)
        • 신경망 첫걸음 (2)
        • 모두를 위한 딥러닝 (12)
        • 딥러닝을 이용한 자연어처리 입문 (9)
        • AI 프로젝트 (1)
      • 수학 (5)
        • 기초 선형대수학 (4)
        • 기초수학 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    ML
    벡터
    ai
    수학
    자연어처리
    머신러닝
    코로나 바이러스 예측
    프로젝트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dev.JJ
원-핫 인코딩(One-hot encoding)
상단으로

티스토리툴바