컴퓨터 또는 기계는 문자보다는 숫자를 더 잘 처리할 수 있다. 이를 위해 자연어 처리에서는 문자를 숫자로 바꾸는 여러 가지 기법이 있다. 원-핫 인코딩은 그 많은 기법 중에서 단어를 표현하는 가장 기본적인 표현 방법이며, 머신 러닝, 딥러닝을 하기 위해서는 반드시 배워야 하는 표현 방법이다.
단어 집합(Vocabulary)
단어 집합은 서로 다른 단어들의 집합이다. 여기서 혼동이 없도록 서로 다른 단어라는 정의에 대해서 좀 더 주목할 필요가 있다. 단어 집합에서는 기본적으로 book과 books와 같은 단어의 변형 형태도 다른 단어로 간주한다.
원-핫 인코딩이란?
원-핫 인코딩은 단어 집합의 크기를 벡터의 차원으로 하고, 표현하고 싶은 단어의 인덱스에 1의 값을 부여하고, 다른 인덱스에는 0을 부여하는 단어의 벡터 표현 방식이다. 이렇게 표현된 벡터를 원-핫 벡터(One-Hot vector)라고 한다.
원-핫 인코딩을 두 과정으로 정리해보면
- 정수 인코딩을 수행한다.
- 표현하고 싶은 단어의 고유한 정수를 인덱스로 간주하고 해당 위치에 1을 부여하고, 다른 단어의 인덱스의 위치에는 0을 부여한다.
한국어 문장을 예제로 원-핫 벡터를 만들어보자.
Step 1 : 정수 인코딩을 수행한다.
출력 결과 : ['나', '는', '자연어', '처리', '를', '배운다']
출력 결과 : {'나': 0, '는': 1, '자연어': 2, '처리': 3, '를': 4, '배운다': 5}
Step 2 : 표현하고 싶은 단어의 고유한 정수를 인덱스로 간주하고 해당 위치에 1을 부여하고, 다른 단어의 인덱스의 위치에는 0을 부여한다.
출력 결과 : [0, 0, 1, 0, 0, 0]
"자연어"는 정수 2이므로 원-핫 벡터는 인덱스 2의 값이 1이며, 나머지 값은 0인 벡터가 나온다.
Keras를 이용한 원-핫 인코딩
Keras는 원-핫 인코딩을 수행하는 유용한 도구 to_categorical()를 지원한다.
Step 1 : 정수 인코딩을 수행한다.
출력 결과 : {1: '갈래', 2: '점심', 3: '햄버거', 4: '나랑', 5: '먹으로', 6: '메뉴는', 7: '최고야'}
출력 결과 : [2, 5, 1, 6, 3, 7]
Step 2 : 표현하고 싶은 단어의 고유한 정수를 인덱스로 간주하고 해당 위치에 1을 부여하고, 다른 단어의 인덱스의 위치에는 0을 부여한다.
출력 결과 :
[[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.]]
위의 결과는 "점심 먹으러 갈래 메뉴는 햄버거 최고야"라는 문장이 [2, 5, 1, 6, 3, 7]로 정수 인코딩이 되고나서, 각각의 인코딩 된 결과를 인덱스로 원-핫 인코딩이 수행된 모습을 보여준다.
원-핫 인코딩의 한계
이러한 표현 방식은 단어의 개수가 늘어날수록, 벡터를 저장하기 위해 필요한 공간이 계속 늘어난다는 단점이 있다. 다른 표현으로는 벡터의 차원이 늘어난다고 표현한다. 원-핫 벡터는 단어 집합의 크기가 곧 벡터의 차원 수가 된다. 가령, 단어가 1000개인 코퍼스를 가지고 원-핫 벡터를 만들면, 모든 단어 각각은 모두 1000개의 차원을 가진 벡터가 된다. 다시 말해 모든 단어 각각은 하나의 값만 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라는 방법이 존재한다.
'NLP > 딥러닝을 이용한 자연어 처리 입문' 카테고리의 다른 글
[NLP] 2-1. 통계적 언어 모델(Statistical Language Model, SLM) (0) | 2023.12.04 |
---|---|
[NLP] 2. 언어 모델(Language Model) (0) | 2023.12.04 |
[NLP] 1-6. 패딩(Padding) (0) | 2023.12.01 |
[NLP] 1-5. 정수 인코딩 (0) | 2023.11.30 |
[NLP] 1-4. 불용어(Stopword) (1) | 2023.11.30 |