윤제로의 제로베이스

토치 텍스트 튜토리얼(Torchtext tutorial) 영어 본문

Background/Pytorch 기초

토치 텍스트 튜토리얼(Torchtext tutorial) 영어

윤_제로 2022. 1. 19. 19:33

https://wikidocs.net/60314

 

02. 토치텍스트 튜토리얼(Torchtext tutorial) - 영어

파이토치(PyTorch)에서는 텍스트에 대한 여러 추상화 기능을 제공하는 자연어 처리 라이브러리 토치텍스트(Torchtext)를 제공합니다. 자연어 처리를 위해 토치텍스트가 ...

wikidocs.net

토치텍스트가 제공하는 기능들은 다음과 같다.

 

  • 파일 로드하기(File loading) : 다양한 포맷의 코퍼스를 로드한다.
  • 토큰화(Tockenization) : 문장을 단어 단위로 분리한다.
  • 단어 집합(Vocab) : 단어 집합을 만든다.
  • 정수 인코딩(Integer encoding) : 전체 코퍼스의 단어들을 각각의 고유한 정수로 맵핑한다.
  • 단어 벡터(Word Vector) : 단어 집합의 단어들에 고유한 임베딩 벡터를 만들어준다. 랜덤값으로 초기화한 값일 수도 있고, 사전 훈련된 임베딩 벡터들을 로드할 수도 있다.
  • 배치화(Batching) : 훈련 샘플들의 배치를 만들어준다. 이 과정에서 패딩 작업(Padding)도 이루어진다.

토치텍스트가 모든 전처리를 해결해주지는 않는다.

위 모든 과정 이전에 훈련데이터, 검증데이터, 테스트데이터를 분리하는 작업은 별도로 해주어야하며 위 모든 과정 이후에 각 샘플에 대해서 단어들을 임베딩 벡터로 맵핑해주는 작업, 룩업테이블이라 불리는 작업은 파이토치의 nn.Embedding()을 통해서 해결해야한다. 

1. 훈련 데이터와 테스트 데이터로 분리하기

import urllib.request
import pandas as pd

#IMDB 데이터 다운로드
urllib.request.urlretrieve("https://raw.githubusercontent.com/LawrenceDuan/IMDb-Review-Analysis/master/IMDb_Reviews.csv", filename="IMDb_Reviews.csv")

df = pd.read_csv('IMDb_Reviews.csv', encoding='latin1')

train_df = df[:25000]
test_df = df[25000:]

train_df.to_csv("train_data.csv", index=False)
test_df.to_csv("test_data.csv", index=False)

 

index=False를 하여 인덱스는 저장하지 않는다.

2. 필드 정의하기(torchtext.data)

필드를 통해 앞으로 어떤 전처리를 할 것인지 정의한다.

 

from torchtext import data # torchtext.data 임포트

# 필드 정의
TEXT = data.Field(sequential=True,
                  use_vocab=True,
                  tokenize=str.split,
                  lower=True,
                  batch_first=True,
                  fix_length=20)

LABEL = data.Field(sequential=False,
                   use_vocab=False,
                   batch_first=False,
                   is_target=True)

 

위 코드에서 2개의 필드 객체를 선언했다.

하나는 실제 텍스트를 위한 TEXT 객체, 다른 하나는 레이블 데이터를 위한 LABEL 객체이다.

각 인자가 의미하는 바는 다음고 같다.

 

  • sequential : 시퀀스 데이터 여부(True가 기본값)
  • use_vocab : 단어 집합을 만들 것인지 여부(True가 기본값)
  • tokenize : 어떤 토큰화 함수를 사용할 것인지 지정(string.split이 기본값)
  • lower : 영어 데이터를 전부 소문자화(Flase가 기본값)
  • batch_first : 미니 배치 차원을 맨 앞으로 하여 데이터를 불러올 것인지 여부(False가 기본값)
  • is_target : 레이블 데이터 여부(False가 기본값)
  • fix_length : 최대 허용 길이. 이 길이에 맞춰서 패딩작업이 진행된다.

주의할 점은 위의 피드는 어떻게 전처리를 진행할 것인지를 정의한 것이고, 실제 훈련 데이터에 대해서는 전처리는 진행하지 않았다.

사실, 아직 훈련 데이터를 다운로드 받지도 않았다.

3. 데이터셋 만들기

from torchtext.data import TabularDataset

 

필드를 저장했따면 데이터셋을 만든다.

TabularDataset은 데이터를 불러오면서 필드에서 정의했던 토큰화 방법으로 토큰화를 수행한다.

이때 소문자화 같은 기본적인 전처리도 함께 이루어진다.

 

train_data, test_data = TabularDataset.splits(
        path='.', train='train_data.csv', test='test_data.csv', format='csv',
        fields=[('text', TEXT), ('label', LABEL)], skip_header=True)

 

  • path : 파일이 위치한 경로
  • format : 데이터의 포맷
  • fields : 위에서 정의한 필드를 지정. 첫번째 원소는 데이터셋 내에서 해당 필드를 호칭할 이름, 두번째 원소는 지정할 필드.
  • skip_header : 데이터의 첫번째 줄은 무시.

앞서 TabularDataset의 fields 인자로 TEXT필드는 text로 호칭하고, LABEL 필드는 label로 호칭한다고 지정하였다.

 

# 필드 구성 확인.
print(train_data.fields.items())

 

4. 단어 집합(Vocabulary) 만들기

토큰화 전처리를 끝냈다면, 이제 각 단어의 고유한 정수를 맵핑해주는 정수 인토딩 작업이 필요하다.

이 전처리를 위해서는 단어 집합을 만들어주어야 한다.

 

TEXT.build_vocab(train_data, min_freq=10, max_size=10000)

 

  • min_freq : 단어 집합에 추가 시 단어의 최소 등장 빈도 조건을 추가
  • max_size : 단어 집합의 최대 크기 지정

단어 집합의 크기를 10000개로 제한하지면 실제 생성된 단어 집합의 크기는 0번부터 10001번까지 10002개 이다.

이는 토치텍스트가 임의로 특별 토큰인 <unk>와 <pad>를 추가하였기 때문이다.

<unk>는 0번으로 집합에 없는 단어를, <pad>는 1번으로 길이를 맞추는 패딩 작업을 할 때 사용된다.

5. 토치텍스트로 데이터로더 만들기

from torchtext.data import Iterator

batch_size = 5
train_loader = Iterator(dataset=train_data, batch_size = batch_size)
test_loader = Iterator(dataset=test_data, batch_size = batch_size)

batch = next(iter(train_loader)) # 첫번째 미니배치

 

앞서 배운 일반적인 데이터로더와 토치 텍스트의 데이터로더가 조금 다른데, 일반적인 데이터로더는 미니 배치를 텐서로 가져오지만, 토치 텍스트의 데이터로더는 torchtext.dat.batch.Batch 객체를 가져온다.

실제 데이터 텐서에 접근하기 위해서는 정의한 필드 명을 사용해야 한다.

6. <pad> 토큰이 사용되는 경우

맨 처음 필드를 정의할 때 fix_length를 150으로 정의하고 이후 데이터로더를 정의했다고 가정해보자.

그렇다면 샘플의 뒷부분이 <pad>의 번호였던 1로 채워지게 된다.

샘플의 길이가 150이 되지 않으면 숫자 1로 채워서 길이 150을 맞춘것이다.

이러한 작업을 패딩 작업이라고 한다.