본문 바로가기

BLOG/머신러닝

[자연어처리] 파이썬으로 원 핫 인코딩(One-Hot Encoding) 구현하기 (코드)

 

1. 원-핫 인코딩이란?

원-핫 인코딩(One-Hot Encoding)이란 단어 집합의 크기를 벡터 차원으로 만든 뒤, 표현하고 싶은 단어의 인덱스에 1의 값을 부여하고 다른 인덱스에는 0을 부여하는 방식을 말합니다.

 

한편, 케라스에서는 원-핫 인코딩을 하기 위한 함수 'to_categorical()'를 제공하는데요, 코드를 통해 원-핫 인코딩을 어떻게 하는지 살펴보도록 하겠습니다.

 

 

2. 코드 구현하기

먼저, 다음과 같은 문장이 있다고 가정해보겠습니다.

 

text = "나는 얼죽아 추워도 아이스아메리카노 나는 아이스아메리카노 좋아 아이스아메리카노 마시자"

 

그리고나서 이 문장에 대해 원-핫 인코딩을 하기 위한 코드를 작성해보겠습니다.

 

(1) 라이브러리 설치

먼저, 원 핫 인코딩을 하기 위한 라이브러리를 비롯해 필요한 라이브러리를 import 해줍니다.

 

from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.utils import to_categorical

 

(2) 정수 인코딩

원 핫 인코딩을 하기 전, 문장에 대해 정수 인코딩과 정수 시퀀스로 변환을 해주어야 하는데요, 다음 코드는 정수 인코딩을 하는 코드입니다.(정수인코딩과 관련해서는 블로그 내 관련 글을 참고하시기 바랍니다)

 

tt = Tokenizer()
tt.fit_on_texts([text])

 

위와 같이 입력하고, 정수 인코딩이 된 결과를 보고 싶다면 다음과 같이 입력하면 됩니다.

 

print(tt.word_index)

# output :
{'아이스아메리카노': 1, '나는': 2, '얼죽아': 3, '추워도': 4, '좋아': 5, '마시자': 6}

 

정수 인코딩이 된 결과를 보면, 빈도수 순위에 대한 단어를 확인할 수 있습니다.

 

(3) 정수 시퀀스로 변환

원 핫 인코딩을 하기 전 마지막 단계로는 문장을 정수 시퀀스로 변환하는 건데요, 중복단어가 없는 문장에 정수 인코딩을 한 값을 적용시키는 단계입니다.

 

sub_text = "나는 얼죽아 추워도 아이스아메리카노 좋아 마시자"
encoded=tt.texts_to_sequences([sub_text])[0]

 

아래와 같이 변환된 값을 출력하면 정수 시퀀스로 변환되었음을 확인할 수 있습니다.

 

print(encoded)

# output :
[2, 3, 4, 1, 5, 6]

 

(4) 원-핫 인코딩

그다음 원-핫 인코딩을 하는 단계로, to_categorical() 함수를 이용하여 다음과 같이 원 핫 인코딩을 할 수 있습니다.

 

one_hot = to_categorical(encoded)
print(one_hot)

 

>> [[0. 0. 1. 0. 0. 0. 0.]
     [0. 0. 0. 1. 0. 0. 0.]
     [0. 0. 0. 0. 1. 0. 0.]
     [0. 1. 0. 0. 0. 0. 0.]
     [0. 0. 0. 0. 0. 1. 0.]
     [0. 0. 0. 0. 0. 0. 1.]]

 

원 핫 인코딩 결과, 해당 단어에 대해서 1이 부여되었고, 다른 인덱스에는 0이 부여되었음을 확인할 수 있습니다.

 

 

이렇게 원 핫 인코딩을 파이썬으로 구현하는 방법에 대해 살펴보았는데요, 원 핫 인코딩은 단어 간의 유사도를 표현하지 못한다는 문제가 있습니다. 따라서 이러한 문제를 보완하는 방법으로 LSA, HAL, NNLM, RNNLM 등이 있는데요, 이에 대해서는 추후 알아보도록 하겠습니다.