[ 딥러닝 개발 ] 원-핫 인코딩

유제승·2023년 8월 18일
0
post-thumbnail

자연어를 처리하는 원-핫 인코딩(One-Hot Encoding) 기법


단어 집합(vocabulary)

원-핫 인코딩(One-Hot Encoding)에 대해 설명하기 앞서 단어 집합에 대해 먼저 소개할까 합니다.
단어집합이란, 서로 다른 단어들의 집합을 뜻합니다. 기본적으로 dog나 dogs는 같은 단어의 복수형이지만 다른 문자로 인식합니다.
단어 집합은 머신러닝, 딥러닝에서 많이 사용됨으로 반드시 배워야 하는 표현 방법입니다.


원-핫 인코딩(One-Hot Encoding)이란.

: 단어 집합의 크기를 벡터의 차원으로 하고, 표현하고 싶은 단어의 인덱스별로 숫자를 부여하는 벡터 표현 방법. 원-핫 인코딩에는 두가지 방법이 있습니다.

1. 정수 인코딩

: 각 단어마다 고유한 정수를 부여하는 방식. 전체 문장을 단어별로 쪼갠 후 각 토큰(쪼개진 단어)별 고유한 정수를 부여합니다.

ex)
나는 오늘 김밥을 먹었다
-> ['나', '는', '오늘', '김밥', '을', '먹었다']
-> {'나' : 0, '는' : 1, '오늘' : 2, '김밥' : 3, '을' : 4, '먹었다' : 5}


2. 케라스(Keras)를 이용한 인코딩

: 위에 방식은 코드를 통해 직접 분리를 하였지만, 케라스는 to_categorical()을 지원하여 쉽게 분리할 수 있습니다. to_categorical()을 사용하기 전에 토큰화를 먼저 설명하고자 합니다.

토큰화(Tokenization)

토큰화를 먼저 설명하는 이유는 인코딩 하기 전 단어를 분리하는 과정인 토큰화(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}

위와 같이 생성된 단어 집합(vocabulary)를 texts_to_sequences()를 사용하여 정수 시퀀스로 변환이 가능해졌습니다.
예시 문장을 주고 시퀀스 값에 대해 확인해보겠습니다.
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] 로 표현 후 원-핫 인코딩을 수행한 모습을 보여줍니다.


[출처]

위키독스

profile
안녕하세요 개발자 꿈나무 입니다.

1개의 댓글

comment-user-thumbnail
2023년 8월 18일

공감하며 읽었습니다. 좋은 글 감사드립니다.

답글 달기