반응형
In [1]:
# 버젼이 달라지면 패키지 불러오는 방식이 달라집니다.
# 반드시 아래 버젼으로 설치해주세요
# pip install torchtext==0.10.0
torchtext를 활용한 학습데이터 구성 예시¶
In [2]:
# torchtext 관련 패키지 불러오기
import torch
from torchtext.legacy import data
from torchtext.legacy.data import Dataset, Example, BucketIterator
In [3]:
# 질의 응답 생성을 위한 샘플 데이터 셋 생성
# 데이터 구성 [(질문, 답변), (질문, 답변), ...]
QA = [
("What is the primary function of the heart?", "To pump blood through the circulatory system."),
("Where is the Great Barrier Reef situated?", "Off the coast of Queensland, Australia"),
("What is the Sun mainly composed of?", "Hot plasma"),
("Who designed the Eiffel Tower?", "Gustave Eiffel"),
("Will there be a London Marathon in October 2023?", "In August 2021, race organisers confirmed that the 2023 event would take place on 23 April;")
]
In [4]:
# Field 메서드를 활용하여 각 데이터에 맞는 전처리 방식 설정
# 질문데이터 Field 구성
QPREPROCESS = data.Field(
# 띄어쓰기 기준으로 토큰화
tokenize=lambda x: x.split(),
# 배치차원을 첫번째 순서로
batch_first=True,
# (미니배치, 문장길이) 형태로 반환
include_lengths=True,
# torch.long 타입으로 반환
dtype=torch.long
)
# 답변데이터 Field 구성
APREPROCESS = data.Field(
# 띄어쓰기 기준으로 토큰화
tokenize=lambda x: x.split(),
# 배치차원을 첫번째 순서로
batch_first=True,
# (미니배치, 배치모양) 형태로 반환
include_lengths=True,
# 필요하면 리턴 길이 고정
#fix_length=10,
# bos 토큰 설정
init_token='<BOS>',
# eos 토큰 설정
eos_token='<EOS>',
# torch.long 타입으로 반환
dtype=torch.long
)
In [5]:
# 예시 데이터 생성
example = []
for qa_tuple in QA:
input_data = Example.fromlist(
qa_tuple,
fields=[('question', QPREPROCESS),('answer', APREPROCESS)]
)
example.append(input_data)
In [6]:
# torchtext dataset 구축 (example 리스트 사용)
dataset = Dataset(
example,
fields=[('question', QPREPROCESS),('answer', APREPROCESS)]
)
In [7]:
# BucketIterator 생성(파이토치 데이터 로더 역할 수행)
iterator = BucketIterator(dataset, batch_size=1, sort_key=lambda x: len(x.text))
In [8]:
# 어휘 구축(단어 : 인덱스 구축을 위해 반드시 수행해야합니다 !)
QPREPROCESS.build_vocab(dataset)
APREPROCESS.build_vocab(dataset)
학습데이터 확인¶
batch_size 가 1 일때¶
In [9]:
sample = next(iter(iterator))
In [10]:
# 질문 데이터 확인
sample.question[0]
Out[10]:
tensor([[ 4, 3, 2, 13, 25, 20, 27]])
In [11]:
# 질문 데이터 모양 확인
sample.question[1] #만약, include_lengths=True일때만 확인 가능
Out[11]:
tensor([7])
In [12]:
# 답변 데이터 확인
sample.answer[0]
Out[12]:
tensor([[ 2, 13, 27, 3]])
In [13]:
# 답변 데이터 모양확인
sample.answer[1]
Out[13]:
tensor([4])
batch_size 가 2 이상일 때¶
In [14]:
# batch_size가 2 이상인 BucketIterator 생성(파이토치 데이터 로더 역할 수행)
iterator = BucketIterator(dataset, batch_size=2, sort_key=lambda x: len(x.text))
In [15]:
sample = next(iter(iterator))
In [16]:
# 질문 데이터 확인
sample.question[0] # 두번째 질문끝에 1로 패딩되어 길이가 고정되어 있음을 확인할 수 있음
Out[16]:
tensor([[ 4, 3, 2, 13, 25, 20, 27]])
In [17]:
# 질문 데이터 모양 확인
sample.question[1] #패딩을 제외한 길이로 표시됨
Out[17]:
tensor([7])
In [18]:
# 답변 데이터 확인
# 답변데이터 셋은 <BOS>가 2로 <EOS> 3으로 구성되어 있음을 확인할 수 있음
sample.answer[0]
Out[18]:
tensor([[ 2, 13, 27, 3]])
In [19]:
sample.answer[1] #패딩을 제외한 길이로 표시됨
Out[19]:
tensor([4])
전처리를 위한 단어 인덱스 사전 확인¶
In [20]:
# 질문 데이터 단어사전확인
QPREPROCESS.vocab.stoi
Out[20]:
defaultdict(<bound method Vocab._default_unk_index of <torchtext.legacy.vocab.Vocab object at 0x7fce151c2fa0>>, {'<unk>': 0, '<pad>': 1, 'the': 2, 'is': 3, 'What': 4, '2023?': 5, 'Barrier': 6, 'Eiffel': 7, 'Great': 8, 'London': 9, 'Marathon': 10, 'October': 11, 'Reef': 12, 'Sun': 13, 'Tower?': 14, 'Where': 15, 'Who': 16, 'Will': 17, 'a': 18, 'be': 19, 'composed': 20, 'designed': 21, 'function': 22, 'heart?': 23, 'in': 24, 'mainly': 25, 'of': 26, 'of?': 27, 'primary': 28, 'situated?': 29, 'there': 30})
In [21]:
# 답변 데이터 단어사전확인
APREPROCESS.vocab.stoi
Out[21]:
defaultdict(<bound method Vocab._default_unk_index of <torchtext.legacy.vocab.Vocab object at 0x7fce151c2400>>, {'<unk>': 0, '<pad>': 1, '<BOS>': 2, '<EOS>': 3, 'the': 4, '2021,': 5, '2023': 6, '23': 7, 'April;': 8, 'August': 9, 'Australia': 10, 'Eiffel': 11, 'Gustave': 12, 'Hot': 13, 'In': 14, 'Off': 15, 'Queensland,': 16, 'To': 17, 'blood': 18, 'circulatory': 19, 'coast': 20, 'confirmed': 21, 'event': 22, 'of': 23, 'on': 24, 'organisers': 25, 'place': 26, 'plasma': 27, 'pump': 28, 'race': 29, 'system.': 30, 'take': 31, 'that': 32, 'through': 33, 'would': 34})
반응형
'python' 카테고리의 다른 글
파이토치 clamp 최소값, 최대값 고정 (0) | 2023.05.09 |
---|---|
torchtext data.field 파라미터 설명 (0) | 2023.05.08 |
파이썬 정적 함수 vs 동적함수 (0) | 2023.05.07 |
@staticmethod 데코레이터, 객체선언 없이 클래스 메서드 사용하기 (0) | 2023.05.07 |
파이썬 올림,버림, 내림 (ceil, trunc, floor)¶ (0) | 2023.05.07 |
댓글