[개발이야기#05] 파이썬/인공지능- 트랜스포머 모델을 활용한 '영 -> 한' 번역하기 (2) 데이터 사전 작업-토크나이징

in hive-196917 •  5 months ago  (edited)

글 작성일: 2024년 9월 14일 (토)


안녕하세요. 요거트 @yoghurty 입니다!

파이썬/인공지능 공부를 위해
트랜스포머 모델을 이용한 영문을 한글로 번역할 수 있는 (간단한)번역기를 직접 만들어 보려고 합니다.
이를 위해 제가 참고하는 글은 다음의 두가지입니다.

'영->한' 번역하기 프로젝트로 계획된 총 4회 중 오늘은 2번째 - 토크나이징 입니다.


(1회차) 학습용 데이터 셋 준비

(2회차) 컴퓨터가 학습을 할 수 있도록 학습용 데이터 사전 작업(토크나이징, tokenizing)

(3회차) 학습을 통한 모델(번역기) 생성
(4회차) 생성된 번역기를 이용한 영문->한글 번역 테스트


가상환경(engtokor) 구동 및 필요 패키지 설치


영문을 한글로 번역하기 위한 프로젝트 진행을 위해 지난시간-(1)회차-에 생성한 가상환경 engtokor 를 구동시켜 줍니다.
추가로 필요한 패키지를 설치해 줍니다.

conda activate engtokor
pip install protobuf

학습가능한 데이터셋으로 변환(tokenizing)


작업 방법

  1. 지난시간-(1)회차-에 파일로 저장해 두었던 학습용 데이터를 읽어옵니다.
  2. 토크나이징(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회차 전체 코드'를 이용하시면 다음과 같은 토큰화된 결과를 얻으실 수 있습니다! ^^

tokenizing.png

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번째 시간에는
이렇게 준비한 데이터를 이용하여
학습을 시켜서 번역기(모델)를 만들어 보도록 하겠습니다!

고맙습니다~ ^^

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

Upvoted! Thank you for supporting witness @jswit.

image.png

오 훌륭하십니다. ^^
내일 나갈 글에서 저는 음성을 텍스트로 변환하는 부분을 공부해서 글을 적어 두었습니다. 내일 새벽에 글을 올릴 예정이네요 저부분은 오거트님 글보고 다시 따라 해야겠습니다.

감사합니다.

가야태자님 덕분에 잘 시작할 수 있었습니다.
영->한 번역기 작업을 잘 마무리 해보도록 하겠습니다~
고맙습니다. ^^

넵 글 잘 써주시면 저도 하던글 다쓰고 따라 해보겠습니다.
오늘 주제로 TTS에 관한글도 하나 써서 올려 두었습니다.
내일은 시간이 될지는 모르겠지만, TTS를 실제로 모델로 돌려 볼 계획입니다.

대단하네요. 그림 뿐만아니라 이런 번역기능도 가능하군요. 손을 뗀지오래되어 복잡하게 보입니다.

넵~ AI를 이용하면 그림도 그리고, 번역도 할 수 있는 것 같습니다~!
복잡하게 보이는 것이 당연한 것 같습니다. 저도 복잡하네요. 😆

엄청난것을 공부하시네요.

끝까지 잘 마무리해 보도록 하겠습니다!
감사합니다! ^^