금융 데이터 분석가/text-analysis

[NLP] XLNet 토크나이저 처음부터 학습하기

리치즈 2023. 11. 7. 05:50
728x90

transformers 라이브러리로 토크나이저를 처음부터 학습시킬 수 있습니다.

다양한 클래스를 블록처럼 쌓아서 간단하게 토크나이저를 완성시킵니다.

 

이번 포스팅에서는 XLNet 토크나이저(XLNet 논문링크)를 처음부터 학습시켜보겠습니다. 

 

먼저 Unigram 모델을 사용하여 초기화합니다. vocabulary가 있다면 초기 모델에 넣을 수 있습니다.

tokenizer = Tokenizer(models.Unigram())

 

XLNet에 맞는 normalizer를 설정해줍니다. 이 규칙들은 sentencepiece에서 왔습니다.

from tokenizers import Regex

tokenizer.normalizer = normalizers.Sequence(
    [
        normalizers.Replace("``", '"'),
        normalizers.Replace("''", '"'),
        normalizers.NFKD(),
        normalizers.StripAccents(),
        normalizers.Replace(Regex(" {2,}"), " "),
    ]
)

 

sentencepiece의 pre-tokenizer는 Metaspace를 사용합니다.

tokenizer.pre_tokenizer = pre_tokenizers.Metaspace()

 

XLNet이 필요한 special token들을 추가하고, 모델을 학습시킵니다.

special_tokens = ["<cls>", "<sep>", "<unk>", "<pad>", "<mask>", "<s>", "</s>"]
trainer = trainers.UnigramTrainer(
    vocab_size=25000, special_tokens=special_tokens, unk_token="<unk>"
)
tokenizer.train_from_iterator(get_training_corpus(), trainer=trainer)

로컬 텍스트 파일로 학습시킬 수도 있습니다.

tokenizer.model = models.Unigram()
tokenizer.train(["wikitext-2.txt"], trainer=trainer)

XLNet의 post-processing 템플릿은 아래와 같습니다.

tokenizer.post_processor = processors.TemplateProcessing(
    single="$A:0 <sep>:0 <cls>:2",
    pair="$A:0 <sep>:0 $B:1 <sep>:1 <cls>:2",
    special_tokens=[("<sep>", sep_token_id), ("<cls>", cls_token_id)],
)

마지막 디코더도 쌓아줍니다.

tokenizer.decoder = decoders.Metaspace()

 

추가적으로 fast tokenizer로 만들어줄 수 있습니다. PreTrainedTokenizerFast나 XLNetTokenizerFast 클래스를 이용해서 토크나이저를 감싸주면 됩니다. 한가지 주의할 점은 PreTrainedTokenizerFast는 특수토큰을 지정하고 padding을 왼쪽으로 지정해야합니다. 

# 방법1. PreTrainedTokenizerFast 사용
from transformers import PreTrainedTokenizerFast

wrapped_tokenizer = PreTrainedTokenizerFast(
    tokenizer_object=tokenizer,
    bos_token="<s>",
    eos_token="</s>",
    unk_token="<unk>",
    pad_token="<pad>",
    cls_token="<cls>",
    sep_token="<sep>",
    mask_token="<mask>",
    padding_side="left",
)
# 방법2. XLNetTokenizerFast 사용
from transformers import XLNetTokenizerFast

wrapped_tokenizer = XLNetTokenizerFast(tokenizer_object=tokenizer)

 

 

 

 

 

 

본 포스팅은 Hugging Face NLP course를 참고하여 작성하였습니다.

 

Building a tokenizer, block by block - Hugging Face NLP Course

The 🤗 Tokenizers library has been built to provide several options for each of those steps, which you can mix and match together. In this section we’ll see how we can build a tokenizer from scratch, as opposed to training a new tokenizer from an old o

huggingface.co

 

728x90
LIST