본문 바로가기
과학/딥러닝

자연어 처리2 - 단어의 원핫 인코딩 임베딩 코드

by 루민즈 2023. 11. 2.

안녕하세요 

앞서 자연어 처리1에서 문장의 토큰화를 해야된다고 포스팅 하였습니다. 

https://ruminz.tistory.com/287 (자연어 처리1- 문장의 토큰화) 

 

하지만 단순히 단어의 출현 빈도만 가지고는 해당 단어가 어디에 왔는지 순서는 어떠했는지 알수가 없습니다. 

이러한 관계 정보를 담기 위해서는 단어의 원핫 인코딩을 진행해야 됩니다. 

 

단어의 원-핫 인코딩

예를들어 

'오랫동안 꿈꾸는 이는 그 꿈을 닮아간다' 라는 문장이 있을때 

각 단어를 모두 0으로 바꾸어 주고 원하는 단어만 1로 바꾸어 주는것이 단어의 원-핫 인코딩 입니다.

먼저 앞서 예시를 든 문장의 단어 인덱스 값을 출력해보겠습니다.

 

코랩으로 들어가서 아래와 같이 코드를 작성하고 실행해주세요

from tensorflow.keras.preprocessing.text import Tokenizer 

text = "오랫동안 꿈꾸는 이는 그 꿈을 달아간다"

token = Tokenizer()
token.fit_on_texts([text])
print(token.word_index)

  

그럼 다음과같이 출력이 됩니다. 

 

{'오랫동안': 1, '꿈꾸는': 2, '이는': 3, '그': 4, '꿈을': 5, '달아간다': 6}
 
 

각 단어의 인덱스 값이 출력되었습니다. 이제 이 단어들을 원핫 인코딩 방식으로 표현하겠습니다. 

 

x = token.texts_to_sequences([text])
print(x) 

from tensorflow.keras.utils import to_categorical

word_size = len(token.word_index) + 1 
x = to_categorical(x,num_classes=word_size)

print(x)

 

결과는 다음과 같습니다. 
 
[[1, 2, 3, 4, 5, 6]]
[[[0. 1. 0. 0. 0. 0. 0.]
  [0. 0. 1. 0. 0. 0. 0.]
  [0. 0. 0. 1. 0. 0. 0.]
  [0. 0. 0. 0. 1. 0. 0.]
  [0. 0. 0. 0. 0. 1. 0.]
  [0. 0. 0. 0. 0. 0. 1.]]]

 

해당 결과를 살펴보면 

오랫동안 -> [0. 1. 0. 0. 0. 0. 0.] 

꿈꾸는 -> [0. 0. 1. 0. 0. 0. 0.] 

이런식으로 원핫인코딩이 적용되는걸 확인할수있습니다. 

 

단어 임베딩

원핫 인코딩에 단점은 벡터의 길이가 너무 길어진다는 단점이 있습니다. 예를들어 1만 개의 단어 토큰으로 이루어진 말뭉치를 다룬다고 할때, 이 데이터를 원 핫인코딩으로 벡터화하면 9999개의 0과 하나의 1로 이루어진 단어 벡터를 1만개나 만들어야 합니다. 위 예시를 봐도 알수가 있죠 문장의 단어 6개 밖에 없는데 0이 36개 1이 6개 있습니다. 이러한 단점을 해결하기 위해 등장한게 단어 임베딩 입니다. 

 

 

단어 임베딩으로 얻은결과랑 원핫인코딩에 차이입니다. 단어 임베딩으로 얻은 결과가 현저히 작다라는걸 알수 있습니다. 

이러한 결과가 가능한 이유는 각 단어 간의 유사도를 계산했기 때문입니다. 예를들어 happy라는 단어는 bad보다는 good에 더 가깝고 cat이라는 단어는 good 보다는 dog에 더 가깝죠 

 

이 유사도를 계산할려면 Embedding() 함수를 적용하면 됩니다. 예를들어 다음과 같이 작성하면 됩니다. 

 

from tensorflow.keras.layers import Embedding 

model = Sequential()
model.add(Embedding(16,4))

 

Embedding 함수는 입력과 출력의 크기를 나타내느 두 매개변수를 입력합니다. 16은 입력될 총 단어수, 임베딩후 출력되는 벡터의 크기는 4로 하겠다는 의미입니다. 

다음에는 텍스트를 읽고 긍정 부정 예측하기, 코드를 같이 알아봅시다.

728x90
반응형