Tokenizers 퀵스타트
Tokenizers 퀵스타트
Tokenizers(🤗 Tokenizers)는 오늘날 가장 많이 쓰이는 토크나이저를 초고속으로·쉽게 제공하는 라이브러리예요. 파이썬·러스트·Node.js를 지원해요. 큰 말뭉치로 토크나이저를 몇 초 만에 처음부터 훈련할 수 있고, 사전 훈련된 토크나이저를 허브에서 바로 불러올 수도 있어요.
처음부터 토크나이저 만들기
wikitext-103(텍스트 516M) 데이터로 토크나이저를 몇 초 만에 훈련해 볼게요. 데이터셋을 내려받고 압축을 풀어요.
wget https://s3.amazonaws.com/research.metamind.io/wikitext/wikitext-103-raw-v1.zip
unzip wikitext-103-raw-v1.zip
이번엔 Byte-Pair Encoding(BPE) 토크나이저를 만들어요. 핵심 API는 Tokenizer 클래스인데, BPE 모델로 인스턴스화해요.
from tokenizers import Tokenizer
from tokenizers.models import BPE
tokenizer = Tokenizer(BPE(unk_token="[UNK]"))
훈련
훈련을 위해 BpeTrainer를 만들고 special token을 지정해요. 이 토큰들은 훈련 중엔 쓰이지 않지만 어휘(vocabulary)에는 포함돼요.
from tokenizers.trainers import BpeTrainer
trainer = BpeTrainer(special_tokens=["[UNK]", "[CLS]", "[SEP]", "[PAD]", "[MASK]"])
special token 리스트의 순서가 ID를 결정해요. 여기선 "[UNK]"가 ID 0, "[CLS]"가 ID 1이 돼요. 사전 토큰화(pre-tokenizer)를 넣지 않으면 "it is" 같은 토큰이 여러 단어를 걸칠 수 있으니, 공백 기준으로 나누는 Whitespace를 써요.
from tokenizers.pre_tokenizers import Whitespace
tokenizer.pre_tokenizer = Whitespace()
그다음 train()에 파일 목록을 넘겨 훈련해요.
files = [f"data/wikitext-103-raw/wiki.{split}.raw" for split in ["test", "train", "valid"]]
tokenizer.train(files, trainer)
수 초 만에 훈련이 끝나요. 저장은 save(), 재로드는 from_file()로 해요.
tokenizer.save("data/tokenizer-wiki.json")
tokenizer = Tokenizer.from_file("data/tokenizer-wiki.json")
사용
encode()로 텍스트를 토큰화하면 Encoding 객체가 나와요. .tokens에 토큰 분할, .ids에 어휘 내 인덱스가 들어 있어요.
output = tokenizer.encode("Hello, y'all! How are you 😁 ?")
print(output.tokens)
# ["Hello", ",", "y", "'", "all", "!", "How", "are", "you", "[UNK]", "?"]
print(output.ids)
# [27253, 16, 93, 11, 5097, 5, 7961, 5112, 6218, 0, 35]
배치와 패딩
최고 속도를 내려면 encode_batch()로 배치 처리하는 게 좋아요.
output = tokenizer.encode_batch(["Hello, y'all!", "How are you 😁 ?"])
enable_padding(pad_id=3, pad_token="[PAD]")로 패딩을 켜면 가장 긴 문장 크기로 맞춰져요. 패딩을 고려한 attention_mask도 함께 생성돼요.
사전 훈련된 토크나이저
허브에서 tokenizer.json이 있는 저장소면 from_pretrained()으로 바로 불러올 수 있어요.
from tokenizers import Tokenizer
tokenizer = Tokenizer.from_pretrained("bert-base-uncased")
더 알아보기
- 파이프라인: The tokenization pipeline
- 구성 요소: Components
- BPE: BPE