본문 바로가기
Dot/ML

원-핫 인코딩 (One-Hot Encoding)

by jum0 2020. 10. 7.

오디오와 이미지는 숫자로 이루어져 있다. 반면 텍스트는 문자다. 0과 1만을 인식하는 컴퓨터가 어떤 단어를 이해하도록 하려면 이 텍스트를 숫자로 변환해야 한다. 그러나 이 작업은 쉽지 않다. 그래서 이런 자연어를 컴퓨터가 잘 이해하도록 하고자 생겨난 연구 분야 중 하나가 바로 자연어 처리(natural language processing, NLP)다.

원-핫 인코딩(One-Hot Encoding)

원-핫 인코딩은 텍스트를 유의미한 숫자(벡터)로 바꾸는 가장 손쉬운 방법으로 N개의 단어를 각각 N차원의 벡터로 표현하는 방식이다. 단어가 포함되는 자리엔 1을 넣고 나머지에는 0을 넣는다. 사전이 ['나', '는', '자연어', '처리', '를', '배운다']라면 자연어를 표현하는 벡터는 [0, 0, 1, 0, 0, 0]이 되는 식이다. 단어 하나에 인덱스 정수를 할당한다는 점에서 '단어 주머니(bag of words, Bow)'라 부르기도 한다.

원-핫 인코딩 예제

'나는 자연어 처리를 배운다' 문장에 대하여 원-핫 인코딩 진행

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

토큰을 입력하면 해당 토큰에 대한 웟-핫 벡터를 만드는 함수

print(one_hot_encoding("자연어",word2index))
# [0, 0, 1, 0, 0, 0]

함수에 '자연어'라는 토큰을 입력했을 경우 [0, 0, 1,  0, 0, 0]라는 벡터가 나온다. '자연어'는 사전에서 인덱스가 2이므로, '자연어'를 표현하는 원-핫 벡터는 인덱스 2의 값이 1이며, 나머지 값은 0인 벡터가 나온다.


참고 자료

[1] 카카오브레인 블로그 - www.kakaobrain.com/blog/6

[2] 딥 러닝을 이용한 자연어 처리 입문 - wikidocs.net/22647


수정해야 할 부분이 있다면 알려주세요!

감사합니다!

반응형

'Dot > ML' 카테고리의 다른 글

Validation Dataset  (0) 2020.10.07

댓글