토크나이제이션 파이프라인

토크나이제이션 파이프라인

Tokenizer.encode() 또는 encode_batch()를 호출하면 입력 텍스트가 일련의 파이프라인 단계를 거쳐요. 순서는 다음과 같아요.

  1. 정규화(normalization)
  2. 사전 토큰화(pre-tokenization)
  3. 모델(model)
  4. 후처리(post-processing)

각 단계가 무엇을 하는지, 그리고 tokenizers가 각 단계를 어떻게 커스터마이즈하게 해주는지 살펴볼게요.

출처: https://huggingface.co/docs/tokenizers/en/pipeline

정규화(Normalization)

각 정규화 연산은 Normalizer로 표현되고, 여러 개는 normalizers.Sequence로 합칠 수 있어요. 예를 들어 NFD 유니코드 정규화 + 악센트 제거를 조합할 수 있어요.

from tokenizers import normalizers
from tokenizers.normalizers import NFD, StripAccents

normalizer = normalizers.Sequence([NFD(), StripAccents()])
tokenizer.normalizer = normalizer

사전 토큰화(Pre-Tokenization)

사전 토큰화는 입력을 더 작은 조각으로 나눠, 최종 토큰의 상한선을 정하는 작업이에요. "단어"로 나눈다고 생각하면 돼요. 공백과 문장부호 기준으로 나누는 Whitespace가 가장 간단해요.

from tokenizers.pre_tokenizers import Whitespace

tokenizer.pre_tokenizer = Whitespace()

모델(Model)

모델은 실제 토크나이제이션을 담당하는 핵심 단계예요. 사전 토큰을 어휘의 토큰으로 분할하고, 각 토큰을 ID에 매핑해요. tokenizers는 다음 모델을 지원해요.

  • models.BPE
  • models.Unigram
  • models.WordLevel
  • models.WordPiece

모델은 Tokenizer 초기화 시 전달되므로 이미 커스터마이즈가 끝난 상태예요.

후처리(Post-Processing)

후처리는 Encoding이 반환되기 전에 추가 변환을 수행하는 마지막 단계예요. 대표적으로 special token을 추가하는 TemplateProcessing이 있어요.

from tokenizers.processors import TemplateProcessing

tokenizer.post_processor = TemplateProcessing(
    single="[CLS] $A [SEP]",
    pair="[CLS] $A [SEP] $B:1 [SEP]:1",
    special_tokens=[("[CLS]", 1), ("[SEP]", 2)],
)

single="[CLS] $A [SEP]"에서 $A는 문장을 뜻하고, :1은 그 부분의 type_id를 지정해요.

디코딩

ID를 다시 읽을 수 있는 텍스트로 되돌리려면 디코딩을 해요. ByteLevel처럼 특수 문자를 쓰는 모델은 전용 Decoder로 되돌려야 읽을 수 있어요.

더 알아보기