원-핫 인코딩(One-Hot Encoding)에 대해 설명하기 앞서 단어 집합에 대해 먼저 소개할까 합니다.
단어집합이란, 서로 다른 단어들의 집합을 뜻합니다. 기본적으로 dog나 dogs는 같은 단어의 복수형이지만 다른 문자로 인식합니다.
단어 집합은 머신러닝, 딥러닝에서 많이 사용됨으로 반드시 배워야 하는 표현 방법입니다.
: 단어 집합의 크기를 벡터의 차원으로 하고, 표현하고 싶은 단어의 인덱스별로 숫자를 부여하는 벡터 표현 방법. 원-핫 인코딩에는 두가지 방법이 있습니다.
: 각 단어마다 고유한 정수를 부여하는 방식. 전체 문장을 단어별로 쪼갠 후 각 토큰(쪼개진 단어)별 고유한 정수를 부여합니다.
ex)
나는 오늘 김밥을 먹었다
-> ['나', '는', '오늘', '김밥', '을', '먹었다']
-> {'나' : 0, '는' : 1, '오늘' : 2, '김밥' : 3, '을' : 4, '먹었다' : 5}
: 위에 방식은 코드를 통해 직접 분리를 하였지만, 케라스는 to_categorical()을 지원하여 쉽게 분리할 수 있습니다. to_categorical()을 사용하기 전에 토큰화를 먼저 설명하고자 합니다.
토큰화를 먼저 설명하는 이유는 인코딩 하기 전 단어를 분리하는 과정인 토큰화(Tokenization)을 선행하기 때문입니다.
토큰화란, 주어진 코퍼스(copus)에서 토큰(token)이라 불리는 단위로 나누는 작업을 뜻합니다. 토큰의 단위는 보통 의미있는 단위로 정의합니다.
케라스에서는 전처리 도구인 토크나이저를 사용하여 토큰화를 진행합니다. 다음 예시를 보며 이해해도록 하겠습니다.
모듈, 입력값
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.utils import to_categorical
text = "나랑 점심 먹으러 갈래 점심 메뉴는 햄버거 갈래 갈래 햄버거 최고야"
tokenizer = Tokenizer()
tokenizer.fit_on_texts([text])
print(tokenizer.word_index)
# 결과
{'갈래': 1, '점심': 2, '햄버거': 3, '나랑': 4, '먹으러': 5, '메뉴는': 6, '최고야': 7}
sub_text = "점심 먹으러 갈래 메뉴는 햄버거 최고야 최고야"
encoded = tokenizer.texts_to_sequences([sub_text])[0]
print(encoded)
# 결과
[2, 5, 1, 6, 3, 7, 7]
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의 원-핫 벡터
[0. 0. 0. 0. 0. 0. 0. 1.]] # 인덱스 8의 원-핫 벡터
위 코드는 "나랑 점심 먹으러 갈래 점심 메뉴는 햄버거 갈래 갈래 햄버거 최고야" 라는 텍스트를 정수 인코딩하여 [2, 5, 1, 6, 3, 7, 7] 로 표현 후 원-핫 인코딩을 수행한 모습을 보여줍니다.
[출처]
공감하며 읽었습니다. 좋은 글 감사드립니다.