본문 바로가기
자연어 처리 - 파이썬

[자연어 처리] nn.Embedding() 함수 사용법

by Kc93 2022. 11. 21.
728x90
반응형

python

 

import torch.nn as nn
courpus = 'I am a good boy'
courpus_split = courpus.split() # 단어가 분리된 문장
word_set = set(courpus.split())	# 중복 단어 제거
vocabulary = dict = {'<unk>': '0', '<pad>': '1'} # 단어 사전

# <unk> 모르는 단어에 적용
# <pad> 문장 길이를 맞추기 위해 적용

# 단어 사전 만들기
for i, word in enumerate(word_set):
  vocabulary[word] = i+2 # i+2는 위에 특별 토큰 <unk>,<pad> 추가 한 것을 표시

# 숫자로 구성된 문장 만들기
number_coupus = [] 
for word in courpus_split:
  number_coupus.append(vocab[word])
# 단어만 분리된 문장 'courpus_split'
# ['I', 'am', 'a', 'good', 'boy']

# 숫자로 구성된 문장 'number_coupus'
# [3, 4, 2, 5, 6]

#  단어 사전 'vocabulary'
# {'<unk>': '0', '<pad>': '1', 'a': 2, 'I': 3, 'am': 4, 'good': 5, 'boy': 6}
# 단어 길이 설정
vocabulary_counts = len(vocabulary)
# 임베딩 설정
Embedding_vocabulary = nn.Embedding(num_embeddings=vocabulary_counts
					,embedding_dim=10
					,padding_idx=1) # 3번째 파라미터는 선택
                    
# 임베딩 imput에는 tensor 형태로 들어가야한다.
# 숫자로 구성된 변수를 텐서로 변환
input = torch.tensor(number_coupus)

result = embedding(input)
  • num_embeddings : 단어사전
  • embedding_dim : 임베딩 할 벡터의 차원
  • padding_idx : 패딩 번호
  • len() : 딕셔너리, 리스트 등 요소의 길이를 확인하는 함수
print(result)
print(result.size())

# 결과값
tensor([[-1.0586, -0.3920,  2.1072, -0.5490, -1.1683,  0.7467, -0.2672,  0.3694,
         -0.5761,  0.7961],
        [-0.7848,  1.1735, -2.2849, -0.1315, -0.7158,  2.0988, -1.4909, -0.5098,
         -1.6478, -1.3557],
        [ 0.6959,  0.3170, -0.6668, -1.1703,  0.0493,  1.1710, -0.7776,  0.3881,
         -0.8804, -0.3676],
        [-0.4160,  1.7372,  0.8942, -0.6586,  0.3471,  1.1535, -1.0113,  1.7878,
         -0.0269,  1.0291],
        [ 0.0998, -0.8214,  1.3969,  0.4016,  0.4374, -0.8214, -0.4019,  0.0376,
          0.1936, -0.1674]], grad_fn=<EmbeddingBackward0>)
torch.Size([5, 10])
  • 행의 길이 5는 숫자로 구성된 문장의 길이 len(number_coupus)
  • 열의 길이 10은 단어에 대한 차원 embedding_dim=10
  • 한 단어를 10개의 차원으로 표시
  • 단어 사전을 10 차원으로 표현 시키고, input 안에 단어들을 10차원으로 표현한 값으로 변경해준다는 개념

 

 ['I', 'am', 'a', 'good', 'boy']

 [3, 4, 2, 5, 6]

 [3, 4, 2, 5, 6]의 길이는 5, tensor 로 변환 [5]

embedding[단어사전길이(7), 표현하려는 차원(10)]

[5] → [7,10] → [5,10]

[3, 4, 2, 5, 6]
다차원의 단어사전(embedding)안에서 1차원의 문장(input)의 단어들을 찾아서 변경해준다.

  • [5] : [3, 4, 2, 5, 6] 리스트 요소의 길이 
  • [7,10] : [단어 사전 길이,표현하려는 차원 수]
  • [5,10] : [5]를 embedding[7,10]에 넣었을때 결과 값, [5] 에서 [5,10]으로 10차원으로 변경된 값으로 나온다.
  • 주의 사항 : input 으로 들어가는 단어는 단어사전에 반드시 포함 되어야한다. 그렇지 않으면 imdex 에러 발생
반응형

댓글