Natural Language Processing/딥 러닝을 이용한 자연어 처리 입문

[딥 러닝을 이용한 자연어 처리 입문] 원-핫 인코딩(One-Hot Encoding)

림밤빵 2021. 3. 15. 20:55
728x90

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

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

 

원-핫 인코딩의 과정

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

 

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

케라스는 원-핫 인코딩을 수행하는 유용한 도구 to_categorical()를 지원한다. 케라스만으로 정수 인코딩과 원-핫 인코딩을 순차적으로 진행한다.

 

우선 "원 핫 코딩 예제"를 케라스 토크나이저를 이용하여 인코딩 하였다. 토크나이징 작업이 끝난나면 t.word_index로 인덱스 값을 확인 할 수 있다.

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) # 각 단어에 대한 인코딩 결과 출력.

 

texts_to_sequences()를 통해서 정수 시퀀스로 변환을 한다. 문장의 내용을 인덱스 배열로 리턴하여 encoded에 저장한다. encoded를 print하여 결과를 확인 해보자.

encoded=t.texts_to_sequences([text])[0]
print(encoded)

 

keras는 정수 인코딩 된 결과로 부터 원-핫 인코딩을 수행하는 to_categorical()함수를 지원한다. one_hot을 print해보면 순서대로 1, 2, 3, 4를 하나의 벡터에 표현한 것을 알 수 있다.

one_hot = to_categorical(encoded)
print(one_hot)

 

 

 원-핫 인코딩(One-Hot Encoding)의 한계

  • 이러한 표현 방식은 단어의 개수가 늘어날 수록, 벡터를 저장하기 위해 필요한 공간이 계속 늘어난다는 단점이 있다. 다른 말로는 벡터의 차원이 계속 늘어난다고도 표현한다. 원 핫 벡터는 단어 집합의 크기가 곧 벡터의 차원 수가 된다. 가령, 단어가 1,000개인 코퍼스를 가지고 원 핫 벡터를 만들면, 모든 단어 각각은 모두 1,000개의 차원을 가진 벡터가 된다. 다시 말해 모든 단어 각각은 하나의 값만 1을 가지고, 999개의 값은 0의 값을 가지는 벡터가 되는데 이는 저장 공간 측면에서는 매우 비효율적인 표현 방법이다.
  • 원-핫 벡터는 단어의 유사도를 표현하지 못한다는 단점이 있다. 예를 들어서 늑대, 호랑이, 강아지, 고양이라는 4개의 단어에 대해서 원-핫 인코딩을 해서 각각, [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]이라는 원-핫 벡터를 부여받았다고 하자. 이 때 원-핫 벡터로는 강아지와 늑대가 유사하고, 호랑이와 고양이가 유사하다는 것을 표현할 수가 없다. 좀 더 극단적으로는 강아지, 개, 냉장고라는 단어가 있을 때 강아지라는 단어가 개와 냉장고라는 단어 중 어떤 단어와 더 유사한지도 알 수 없다.

단어 간 유사성을 알 수 없다는 단점은 검색 시스템 등에서 심각한 문제이다. 가령, 여행을 가려고 웹 검색창에 '삿포로 숙소'라는 단어를 검색한다고 하자. 제대로 된 검색 시스템이라면, '삿포로 숙소'라는 검색어에 대해서 '삿포로 게스트 하우스', '삿포로 료칸', '삿포로 호텔'과 같은 유사 단어에 대한 결과도 함께 보여줄 수 있어야 한다. 하지만 단어간 유사성을 계산할 수 없다면, '게스트 하우스'와 '료칸'과 '호텔'이라는 연관 검색어를 보여줄 수 없다.

 

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

 

참고 자료

wikidocs.net/book/2155

needjarvis.tistory.com/565

728x90