[Dev Course 최종 프로젝트]#1 NLP : Transformer 코딩해보기

Clay Ryu's sound lab·2022년 3월 20일
0

Projects

목록 보기
9/43

Introduction

최종 프로젝트와 직접적인 관련은 없지만 자연어 처리를 위해서 Transformer의 알고리즘을 좀더 공부하려고 한다. 이를 위해서 코딩을 해가며 하나하나 뜯어보는 것이 필요할 것 같다. 코드는 동빈나님의 https://www.youtube.com/watch?v=AA621UofTUA 강의를 참고했다.

Obstacles

자연어 전처리 부분이 어려웠다. 전처리의 순서를 정리해보았다.

Code

자연어 처리의 전처리

https://wikidocs.net/60314를 참고

토큰화

spacy를 사용한다.

# 실행되는 명령에 대한 정보의 결과를 저장
%%capture
# spacy에서 사용할 en과 de를 설치해준다.
!python -m spacy download en
!python -m spacy download de
import spacy

spacy_en = spacy.load('en') # 영어 토큰화(tokenization)
spacy_de = spacy.load('de') # 독일어 토큰화(tokenization)
def tokenize_de(text):
	return [token.text for token in spacy_de.tokenizer(text)]
    
def tokenize_en(text):
	return [token.text for token in spacy_en.tokenizer(text)]

필드 정의하기

torchtext.data에는 필드(Field)라는 도구를 제공한다. 필드를 통해 앞으로 어떤 전처리를 할 것인지를 정의한다. Field에 대한 더 자세한 내용을 알고 싶다면 아래 링크를 참고하자.

https://pytorch.org/text/_modules/torchtext/data/field.html
from torchtext.data import Field, BucketIterator

# attribute중에서 sequential의 dafault는 True이며 Flase이면 tonkenize가 되질 않는다.
# 즉 sequential False인 필드로 뽑아보면 src, trg는 tokenize가 되지 않은 문장으로 출력이 된다.
german = Field(sequential=True, tokenize=tokenize_de, init_token="<sos>", eos_token="<eos>", lower=True, batch_first=True)
english = Field(sequential=True, tokenize=tokenize_en, init_token="<sos>", eos_token="<eos>", lower=True, batch_first=True)

데이터셋 만들기

https://torchtext.readthedocs.io/en/latest/datasets.html#multi30k 를 참고하자.

from torchtext.datasets import Multi30k

# exts는 source와 target의 순서를 정한다.
# 실제로 데이터는 src와 trg로 나뉘어진 dictionary들의 집합이다.
# fields는 두 언어를 전처리하는 field를 불러온다.
train_dataset, valid_dataset, test_dataset = Multi30k.splits(exts=(".de", ".en"), fields=(german, english))
profile
chords & code // harmony with structure

0개의 댓글