글 작성일: 2024년 9월 14일 (토)
안녕하세요. 요거트 @yoghurty 입니다!
파이썬/인공지능 공부를 위해
트랜스포머 모델을 이용한 영문을 한글로 번역할 수 있는 (간단한)번역기를 직접 만들어 보려고 합니다.
이를 위해 제가 참고하는 글은 다음의 두가지입니다.
- [개발이야기#017] 파이썬/인공지능 영어를 한글로 번역해보자. - 트랜스포머모델 두번째
- 친절한 영어-한국어 번역기 만들기 A Gentle Introduction to Creating an English-to-Korean translator with Transformers
'영->한' 번역하기 프로젝트로 계획된 총 4회 중 오늘은 2번째 - 토크나이징 입니다.
(1회차) 학습용 데이터 셋 준비
- 두 번째 프로젝트를 위한 새로운 가상 환경 만들기
- 학습용 '영문<->한글' 데이터 셋 다운로드
- 데이터 셋을 정비 후 학습용train, 검증용valid, 테스트test 용도의 세 그룹으로 분할
👉 [개발이야기#03] 파이썬/인공지능- 트랜스포머 모델을 활용한 '영 -> 한' 번역하기 (1) 학습용 데이터셋 준비(feat. 가야태자님)
(2회차) 컴퓨터가 학습을 할 수 있도록 학습용 데이터 사전 작업(토크나이징, tokenizing)
(3회차) 학습을 통한 모델(번역기) 생성
(4회차) 생성된 번역기를 이용한 영문->한글 번역 테스트
가상환경(engtokor) 구동 및 필요 패키지 설치
영문을 한글로 번역하기 위한 프로젝트 진행을 위해 지난시간-(1)회차-에 생성한 가상환경 engtokor 를 구동시켜 줍니다.
추가로 필요한 패키지를 설치해 줍니다.
conda activate engtokor
pip install protobuf
학습가능한 데이터셋으로 변환(tokenizing)
작업 방법
- 지난시간-(1)회차-에 파일로 저장해 두었던 학습용 데이터를 읽어옵니다.
- 토크나이징(tokenizing)하여 컴퓨터가 학습할 수 있는 숫자로 토큰화 되어있는 새로운 데이터셋(tokenized dataset)으로 변환합니다.
학습용 데이터 읽어오기
지난시간-(1)회차-에 작업했던 폴더에서 그대로 시작하면,
저장해 두었던 파일들(train.tsv, valid.tsv, test.tsv)을 다시 읽어올 수 있습니다.
data_files = {"train": "train.tsv", "valid": "valid.tsv", "test": "test.tsv"}
dataset = load_dataset("csv", data_files=data_files, delimiter="\t")
토큰화 된 새로운 데이터셋으로 변환하기
이제 읽어들인 지난번 준비했던 학습 데이터셋을 토큰화된 데이터셋으로 변환하려고 하는데요.
먼저, 토큰과 토크나이징이라는 뜻에 대해 인터넷을 한 번 검색해봤습니다. ^^
- 토큰(token)이란?
어떤 문장을 일정한 의미가 있는 가장 작은 단어들로 나눈다. 그다음 나눠진 단어를 이용해 의미를 분석한다.
이때 가장 기본이 되는 단어를 토큰(token)이라 한다.
- 토크나이징(tokenizing)이란?
주어진 문장에서 토큰 단위로 정보를 나누는 작업
문장 형태의 데이터를 처리하기 위해 제일 처음 수행해야 하는 기본적인 작업(텍스트 전처리 과정)
출처: https://sunflyblog.tistory.com/18
즉, 토크나이징은 주어진 문장을 의미가 있는 작은 단위로 나누는 작업이라고 볼 수 있을 것 같습니다.
그리고, 컴퓨터는 숫자만 다룰 수 있기 때문에,
토크나이징 작업을 통해 기존의 영어나 한글 조각들은 모두 숫자로 바꾸어 학습에 사용합니다.
토큰화 예시
예를 들어 문장으로 되어있는 학습용 원 데이터가 다음과 같다고 할때,
어떤 학문이든지 일정의 성취를 이루기 위해서는 끊임없는 반복이 필요하다.
토큰화를 수행하면, 의미가 있는 조각으로 쪼개지게 되고,
'▁어떤', '▁학문', '이', '든지', '▁일정', '의', '▁성취', '를', '▁이루기', '▁위해서는', '▁끊임없는', '▁반복', '이', '▁필요하다', '.', ''
컴퓨터는 아래와 같이 숫자로 변환 처리된 한글 조각들을 이용하여 학습을 합니다.
404, 12663, 15, 10775, 2334, 6, 15757, 21, 29819, 1736, 26778, 4342, 15, 1701, 3, 1
그래서 학습에 사용하는 토큰화 된 데이터 셋에는
지난시간에 작업했던 영어문장, 한글 문장들 대신에 이들 문장이 토큰화되어 변환된 숫자들이 존재하게 됩니다.
아래에 제시된 '2회차 전체 코드'를 이용하시면 다음과 같은 토큰화된 결과를 얻으실 수 있습니다! ^^
2회차 전체 코드
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
from datasets import load_dataset, load_metric
import torch
import multiprocessing
device = 'cuda' if torch.cuda.is_available() else 'cpu'
model_ckpt = "KETI-AIR/ke-t5-base"
max_token_length = 64
# dataset 읽어오기
data_files = {"train": "train.tsv", "valid": "valid.tsv", "test": "test.tsv"}
dataset = load_dataset("csv", data_files=data_files, delimiter="\t")
# Tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_ckpt)
def convert_examples_to_features(examples):
model_inputs = tokenizer(examples['en'],
text_target=examples['ko'],
max_length=max_token_length, truncation=True)
return model_inputs
NUM_CPU = multiprocessing.cpu_count()
tokenized_datasets = dataset.map(convert_examples_to_features,
batched=True,
remove_columns=dataset["train"].column_names,
num_proc=NUM_CPU)
print('\n')
print( '원 데이터 :', dataset['train'][10]['en'] )
print( '처리 후 데이터:', tokenized_datasets['train'][10]['input_ids'] )
print( '토큰화 :', tokenizer.convert_ids_to_tokens(tokenized_datasets['train'][10]['input_ids']) )
print('\n')
print( '원 데이터 :', dataset['train'][10]['ko'] )
print( '처리 후 데이터:', tokenizer.convert_ids_to_tokens(tokenized_datasets['train'][10]['labels']) )
print( '토큰화 :', tokenized_datasets['train'][10]['labels'] )
마무리
이번 작업은
영어를 한글로 번역할 수 있는 번역기(모델)을 만들기 위해,
지난시간(1회차)에 작업했던 학습용 데이터셋을 불러와서
토크나이징(tokenizing)작업을 통해
컴퓨터가 학습을 할 수 있는 토큰화된 데이터셋(tokenized dataset)으로 변환하는 작업을 해보았습니다!
다음 3번째 시간에는
이렇게 준비한 데이터를 이용하여
학습을 시켜서 번역기(모델)를 만들어 보도록 하겠습니다!
고맙습니다~ ^^
Upvoted! Thank you for supporting witness @jswit.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
오 훌륭하십니다. ^^
내일 나갈 글에서 저는 음성을 텍스트로 변환하는 부분을 공부해서 글을 적어 두었습니다. 내일 새벽에 글을 올릴 예정이네요 저부분은 오거트님 글보고 다시 따라 해야겠습니다.
감사합니다.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
가야태자님 덕분에 잘 시작할 수 있었습니다.
영->한 번역기 작업을 잘 마무리 해보도록 하겠습니다~
고맙습니다. ^^
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
넵 글 잘 써주시면 저도 하던글 다쓰고 따라 해보겠습니다.
오늘 주제로 TTS에 관한글도 하나 써서 올려 두었습니다.
내일은 시간이 될지는 모르겠지만, TTS를 실제로 모델로 돌려 볼 계획입니다.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
대단하네요. 그림 뿐만아니라 이런 번역기능도 가능하군요. 손을 뗀지오래되어 복잡하게 보입니다.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
넵~ AI를 이용하면 그림도 그리고, 번역도 할 수 있는 것 같습니다~!
복잡하게 보이는 것이 당연한 것 같습니다. 저도 복잡하네요. 😆
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
엄청난것을 공부하시네요.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
끝까지 잘 마무리해 보도록 하겠습니다!
감사합니다! ^^
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit