[๐ค ๊ฐ์ข 6.9] ๋ธ๋ก ๋จ์๋ก ํ ํฌ๋์ด์ ๋น๋ฉํ๊ธฐ
์ด์ ์น์ ์์ ๋ณด์๋ฏ์ด ํ ํฐํ๋ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ก ์คํ๋ฉ๋๋ค:
-
์ ๊ทํ (๊ณต๋ฐฑ์ด๋ ์ ์ผํธ ์ ๊ฑฐ, ์ ๋์ฝ๋ ์ ๊ทํ ๋ฑ๊ณผ ๊ฐ์ด ํ์ํ๋ค๊ณ ์ฌ๊ฒจ์ง๋ ๋ชจ๋ ํ ์คํธ ์ ์ ์์ )
-
์ฌ์ ํ ํฐํ (์ ๋ ฅ์ ๋จ์ด๋ค๋ก ๋ถ๋ฆฌ)
-
๋ชจ๋ธ์ ํตํ ์ ๋ ฅ ์คํ (์ฌ์ ํ ํฐํ๋ ๋จ์ด๋ค์ ์ฌ์ฉํ์ฌ ํ ํฐ ์ํ์ค ์์ฑ)
-
ํ์ฒ๋ฆฌ (ํ ํฐ๋์ด์ ์ ํน์ ํ ํฐ ์ถ๊ฐ, attention mask ๋ฐ ํ ํฐ ์ ํ ID ์์ฑ)
๋ค์ ๋งํ์ง๋ง, ์ ์ฒด ํ๋ก์ธ์ค๋ฅผ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
๐คTokenizers ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์ ๊ฐ๋ณ ๋จ๊ณ์ ๋ํด ์ฌ๋ฌ ์ต์ ์ ์ ๊ณตํ ์ ์๋๋ก ๋ง๋ค์ด์ก์ผ๋ฉฐ, ์ด๋ฌํ ์ต์ ๋ค์ ๋ชฉ์ ์ ๋ฐ๋ผ ์ง๋ง์ถฐ์ ํ์ฉํ ์ ์์ต๋๋ค. ์ด ์น์ ์์๋ ์น์ 2์์ ์ค๋ช ํ๋ ๊ธฐ์กด ํ ํฌ๋์ด์ ์์ ์๋ก์ด ํ ํฌ๋์ด์ ๋ฅผ ํ์ตํ๋ ๊ฒ๊ณผ๋ ๋ฌ๋ฆฌ ์์ ์ฒ์๋ถํฐ ํ ํฌ๋์ด์ ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ณผ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ํตํด์, ์๊ฐํ ์ ์๋ ๋ชจ๋ ์ข ๋ฅ์ ํ ํฌ๋์ด์ ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค!
๋ณด๋ค ์ ํํ๊ฒ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ค์ฌ์ Tokenizer
ํด๋์ค๋ฅผ ์ค์ฌ์ผ๋ก ๋ค์ํ ํ๋ถ ๋ชจ๋๋ค์ด ๊ธฐ๋ฅ๋ณ๋ก ๊ฒฐํฉ๋ ๊ตฌ์ฑ ์์(building blocks)๊ฐ ๊ฒฐํฉ๋ ํํ๋ก ๊ตฌ์ถ๋์์ต๋๋ค:
-
normalizers
์๋ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ๊ฐ๋ฅํNormalizer
์ ํ์ด ํฌํจ๋์ด ์์ต๋๋ค(์ ์ฒด ๋ชฉ๋ก์ ์ฌ๊ธฐ์์ ํ์ธํ์ธ์). -
pre_tokenizers
์๋ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ๊ฐ๋ฅํ ์ ํ์PreTokenizer
๊ฐ ํฌํจ๋์ด ์์ต๋๋ค (์ ์ฒด ๋ชฉ๋ก์ ์ฌ๊ธฐ์์ ํ์ธํ์ธ์). -
models
์๋BPE
,WordPiece
๋ฐUnigram
๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ์ ํ์Model
์ด ํฌํจ๋์ด ์์ต๋๋ค(์ ์ฒด ๋ชฉ๋ก์ ์ฌ๊ธฐ์์ ํ์ธํ์ธ์). -
trainer
์๋ ๋ง๋ญ์น์์ ๋ชจ๋ธ์ ํ๋ จํ๋๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ์ ํ์Trainer
๊ฐ ๋ชจ๋ ํฌํจ๋์ด ์์ต๋๋ค(๋ชจ๋ธ ์ ํ๋น ํ๋์ฉ, ์ ์ฒด ๋ชฉ๋ก์ ์ฌ๊ธฐ). -
post_processors
์๋ ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ์ ํ์PostProcessor
๊ฐ ํฌํจ๋์ด ์์ต๋๋ค(์ ์ฒด ๋ชฉ๋ก์ ์ฌ๊ธฐ์์ ํ์ธํ์ธ์). -
decoders
์๋ ํ ํฐํ ์ถ๋ ฅ์ ๋์ฝ๋ฉํ๋๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ์ ํ์Decoder
๊ฐ ํฌํจ๋์ด ์์ต๋๋ค(์ ์ฒด ๋ชฉ๋ก์ ์ฌ๊ธฐ์์ ํ์ธํ์ธ์).
์ฌ๊ธฐ์์ ๊ตฌ์ฑ ์์(building blocks)์ ์ ์ฒด ๋ชฉ๋ก์ ์ฐพ์ ์ ์์ต๋๋ค.
๋ง๋ญ์น ํ๋ณด
์๋ก์ด ํ ํฌ๋์ด์ ๋ฅผ ํ์ตํ๊ธฐ ์ํด ์์ ํ ์คํธ ๋ง๋ญ์น๋ฅผ ์ฌ์ฉํฉ๋๋ค(์์ ์คํ ์๊ฐ์ ์ค์ด๊ธฐ ์ํด์). ๋ง๋ญ์น๋ฅผ ํ๋ํ๋ ๋จ๊ณ๋ ์ด ์ฅ์ ์์ ๋ถ๋ถ์์ ์ํํ ๋จ๊ณ์ ์ ์ฌํ์ง๋ง ์ด๋ฒ์๋ WikiText-2 ๋ฐ์ดํฐ์ ์ ์ฌ์ฉํฉ๋๋ค:
from datasets import load_dataset
dataset = load_dataset("wikitext", name="wikitext-2-raw-v1", split="train")
def get_training_corpus():
for i in range(0, len(dataset), 1000):
yield dataset[i : i + 1000]["text"]
get_training_corpus()
ํจ์๋ 1,000๊ฐ์ ํ
์คํธ ๋ฐฐ์น(batch)๋ฅผ ์์ฑํ๋ ์์ฑ์(generator)์ด๋ฉฐ ํ ํฌ๋์ด์ ๋ฅผ ํ์ตํ๋ ๋ฐ ์ฌ์ฉํ ๊ฒ์
๋๋ค.
๐คTokenizers๋ ํ ์คํธ ํ์ผ์์ ์ง์ ํ์ต๋ ์๋ ์์ต๋๋ค. ๋ก์ปฌ์์ ์ฌ์ฉํ ์ ์๋ WikiText-2์ ๋ชจ๋ ํ ์คํธ/์ ๋ ฅ์ ํฌํจํ๋ ํ ์คํธ ํ์ผ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
with open("wikitext-2.txt", "w", encoding="utf-8") as f:
for i in range(len(dataset)):
f.write(dataset[i]["text"] + "\n")
์ด์ ๋ธ๋ก ๋จ์๋ก BERT, GPT-2 ๋ฐ XLNet ํ ํฌ๋์ด์ ๋ฅผ ๋น๋ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ด ๊ณผ์ ์์ ๊ฐ๊ฐ WordPiece, BPE ๋ฐ Unigram์ ์ธ ๊ฐ์ง ์ฃผ์ ํ ํฐํ ์๊ณ ๋ฆฌ์ฆ ๊ฐ๊ฐ์ ์ค์ ์์๊ฐ ์ ๊ณต๋ฉ๋๋ค. BERT๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค!
WordPiece ํ ํฌ๋์ด์ ๋ฅผ ์ฒ์๋ถํฐ ๋น๋ฉํ๊ธฐ
๐คTokenizers ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ ํฌ๋์ด์ ๋ฅผ ๋น๋ํ๋ ค๋ฉด ๋จผ์ model
๋ก Tokenizer
๊ฐ์ฒด๋ฅผ ์ธ์คํด์คํํ ๋ค์ normalizer
, pre_tokenizer
, post_processor
๋ฐ decoder
์์ฑ์ ์ํ๋ ๊ฐ์ผ๋ก ์ค์ ํฉ๋๋ค.
์ด ์์์๋ WordPiece ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ Tokenizer
๋ฅผ ๋ง๋ญ๋๋ค:
from tokenizers import (
decoders,
models,
normalizers,
pre_tokenizers,
processors,
trainers,
Tokenizer,
)
tokenizer = Tokenizer(models.WordPiece(unk_token="[UNK]"))
๋ชจ๋ธ์ด ์ด์ ์ ๋ณธ ์ ์ด ์๋ ๋ฌธ์๋ค์ ๋ง๋ฌ์ ๋ ๋ฌด์์ ๋ฐํํ ์ง ์ ์ ์๋๋ก unk_token
์ ์ง์ ํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์ ์ค์ ํ ์ ์๋ ๋ค๋ฅธ ์ธ์์๋ ๋ชจ๋ธ์ vocab
(์ฌ๊ธฐ์๋ ๋ชจ๋ธ์ ํ์ตํ ๊ฒ์ด๋ฏ๋ก ์ด๊ฒ์ ์ค์ ํ ํ์๊ฐ ์์ต๋๋ค)๊ณผ ๊ฐ ๋จ์ด์ ์ต๋ ๊ธธ์ด๋ฅผ ์ง์ ํ๋ max_input_chars_per_word
(์ด ๊ธธ์ด๋ณด๋ค ๋ ๊ธด ๋จ์ด๋ ๋ถํ ๋จ)๊ฐ ํฌํจ๋ฉ๋๋ค.
ํ ํฐํ์ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ ์ ๊ทํ(normalization)์
๋๋ค. BERT๊ฐ ๋๋ฆฌ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ BERT์ ๋ํด ์ค์ ํ ์ ์๋ ๊ธฐ๋ณธ์ ์ธ ์ต์
์ด ํฌํจ๋ BertNormalizer
๊ฐ ์กด์ฌํฉ๋๋ค. ์ง์ ํ ์ ์๋ ์ต์
์๋ lowercase
, strip_accents
๋ฑ์ ๋น๋กฏํ์ฌ, ๋ชจ๋ ์ ์ด ๋ฌธ์๋ฅผ ์ ๊ฑฐํ๊ณ ๋ฐ๋ณต๋๋ ๊ณต๋ฐฑ์ ๋จ์ผ ๋ฌธ์๋ก ๋ฐ๊พธ๋ clean_text
๊ทธ๋ฆฌ๊ณ ํ์(Chinese characters) ์ฃผ์์ ๊ณต๋ฐฑ์ ๋ฐฐ์นํ๋ handle_chinese_chars
๊ฐ ์์ต๋๋ค. bert-base-uncased
ํ ํฌ๋์ด์ ๋ฅผ ๋ณต์ ํ๋ ค๋ฉด ์ด ๋
ธ๋ฉ๋ผ์ด์ (normalizer)๋ฅผ ์ค์ ํ๋ฉด ๋ฉ๋๋ค:
tokenizer.normalizer = normalizers.BertNormalizer(lowercase=True)
๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ผ๋ก ์๋ก์ด ํ ํฌ๋์ด์ ๋ฅผ ๋น๋ํ ๋ ๐คTokenizers ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ฏธ ๊ตฌํ๋ ํธ๋ฆฌํ ๋
ธ๋ฉ๋ผ์ด์ ์ ์ ๊ทผํ ์๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ BERT ๋
ธ๋ฉ๋ผ์ด์ ๋ฅผ ์ง์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ Lowercase
๋
ธ๋ฉ๋ผ์ด์ ์ StripAccents
๋
ธ๋ฉ๋ผ์ด์ ๋ฅผ ์ ๊ณตํ๋ฉฐ Sequence
๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๋
ธ๋ฉ๋ผ์ด์ ๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค:
tokenizer.normalizer = normalizers.Sequence(
[normalizers.NFD(), normalizers.Lowercase(), normalizers.StripAccents()]
)
๋ํ ์ฌ๊ธฐ์๋ NFD ์ ๋์ฝ๋ ๋
ธ๋ฉ๋ผ์ด์ ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด, StripAccents
๋
ธ๋ฉ๋ผ์ด์ ๊ฐ ์
์ผํธ๊ฐ ์๋ ๋ฌธ์๋ฅผ ์ ๋๋ก ์ธ์ํ์ง ๋ชปํ๋ฏ๋ก ์ ๋๋ก ๋์ํ ์ ์์ต๋๋ค.
์ด์ ์ ๋ณด์๋ฏ์ด normalize_str()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ์ด์ง ํ
์คํธ์ ๋ณํ ์์์ ํ์ธํ ์ ์์ต๋๋ค:
print(tokenizer.normalizer.normalize_str("Hรฉllรฒ hรดw are รผ?"))
To go further ์ ๋์ฝ๋ ๋ฌธ์ u"\u0085"๊ฐ ํฌํจ๋ ๋ฌธ์์ด์์ ์ 2๊ฐ์ง ๋ ธ๋ฉ๋ผ์ด์ ๋ฅผ ํ ์คํธํ๋ฉด ๊ทธ ๊ฒฐ๊ณผ๊ฐ ๋์ผํ์ง ์๋ค๋ ๊ฒ์ ํ์คํ ์ ์ ์์ต๋๋ค.
normalizers.Sequence
๋ฒ์ ์ ๋๋ฌด ๋ณต์กํ๊ฒ ๋ง๋ค์ง ์๊ธฐ ์ํด,clean_text
์ธ์๊ฐ ๊ธฐ๋ณธ ๋์์ธTrue
๋ก ์ค์ ๋ ๋,BertNormalizer
๊ฐ ํ์๋ก ํ๋ ์ ๊ท์ ๋์ฒด(Regex replacements)๋ฅผ ํฌํจํ์ง ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฑฑ์ ํ์ง ๋ง์ญ์์ค. ๋ ๊ฐ์normalizer.Replace
๋ฅผ ๋ ธ๋ฉ๋ผ์ด์ ์ํ์ค์ ์ถ๊ฐํ์ฌ ํธํBertNormalizer
๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ ์ ํํ ๋์ผํ ์ ๊ทํ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๋ค์์ ์ฌ์ ํ ํฐํ ๋จ๊ณ์
๋๋ค. ์ฌ๊ธฐ์๋ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ์ ์๋ ์ฌ์ ๋น๋๋ BertPreTokenizer
๊ฐ ์์ต๋๋ค:
tokenizer.pre_tokenizer = pre_tokenizers.BertPreTokenizer()
๋๋ ์ฒ์๋ถํฐ ๋น๋ํ ์ ์์ต๋๋ค:
tokenizer.pre_tokenizer = pre_tokenizers.Whitespace()
Whitespace
์ฌ์ ํ ํฌ๋์ด์ (pre-tokenizer)๋ ๊ณต๋ฐฑ์ ๋ฌผ๋ก , ๋ฌธ์, ์ซ์ ๋๋ ๋ฐ์ค ๋ฌธ์๊ฐ ์๋ ๋ชจ๋ ๋ฌธ์๋ฅผ ๊ธฐ์ค์ผ๋ก ํ
์คํธ๋ฅผ ๋ถํ ํ๋ฏ๋ก, ๊ฒฐ๊ตญ์ ๊ณต๋ฐฑ๊ณผ ๊ตฌ๋์ ์ผ๋ก ๋ถํ ํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค:
tokenizer.pre_tokenizer.pre_tokenize_str("Let's test my pre-tokenizer.")
๊ณต๋ฐฑ๋ง์ ๊ธฐ์ค์ผ๋ก ๋ถํ ํ๋ ค๋ฉด WhitespaceSplit
์ฌ์ ํ ํฌ๋์ด์ (pre-tokenizer) ๋์ ์ฌ์ฉํด์ผ ํฉ๋๋ค:
pre_tokenizer = pre_tokenizers.WhitespaceSplit()
pre_tokenizer.pre_tokenize_str("Let's test my pre-tokenizer.")
๋
ธ๋ฉ๋ผ์ด์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก Sequence
๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์ฌ์ ํ ํฌ๋์ด์ (pre-tokenizer)๋ค์ ๊ฒฐํฉํ ์๋ ์์ต๋๋ค:
pre_tokenizer = pre_tokenizers.Sequence(
[pre_tokenizers.WhitespaceSplit(), pre_tokenizers.Punctuation()]
)
pre_tokenizer.pre_tokenize_str("Let's test my pre-tokenizer.")
ํ ํฐํ ํ์ดํ๋ผ์ธ์ ๋ค์ ๋จ๊ณ๋ ๋ชจ๋ธ์ ํตํด ์
๋ ฅ์ ์คํํ๋ ๊ฒ์
๋๋ค. ์ด๋ฏธ ์ด๊ธฐํ ๋จ๊ณ์์ ๋ชจ๋ธ์ ์ง์ ํ๊ธด ํ์ง๋ง ์ด์ ํ์ต์ด ํ์ํ๋ฉฐ ์ด๋ฅผ ์ํด์ WordPieceTrainer
๊ฐ ํ์ํฉ๋๋ค. ๐คTokenizers์์ ํธ๋ ์ด๋(trainer)๋ฅผ ์ธ์คํด์คํํ ๋ ๊ธฐ์ตํด์ผ ํ ์ค์ํ ์ ์ ์ฌ์ฉํ๋ ค๋ ๋ชจ๋ ํน์ ํ ํฐ์ ์ ๋ฌํด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ด๋ค ํ ํฐ์ด ํ์ต ์ฝํผ์ค์ ์๊ธฐ ๋๋ฌธ์ ์ดํ์ง(vocabulary)์ ์ถ๊ฐ๋์ง ์์ต๋๋ค:
special_tokens = ["[UNK]", "[PAD]", "[CLS]", "[SEP]", "[MASK]"]
trainer = trainers.WordPieceTrainer(vocab_size=25000, special_tokens=special_tokens)
vocab_size
๋ฐ special_tokens
๋ฅผ ์ง์ ํ๋ ๊ฒ ์ธ์๋ min_frequency
(ํ ํฐ์ด vocabulary์ ํฌํจ๋๊ธฐ ์ํ ์ต์ ์ถํ ๋น๋)๋ฅผ ์ค์ ํ๊ฑฐ๋ continue_subword_prefix
(##๋ง๊ณ ๋ค๋ฅธ ๊ธฐํธ๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ)๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
์์์ ์ ์ํ ๋ฐ๋ณต์(iterator)๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ํ์ต์ํค๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ ์คํํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค:
tokenizer.train_from_iterator(get_training_corpus(), trainer=trainer)
๋ํ ํ
์คํธ ํ์ผ์ ์ฌ์ฉํ์ฌ ํ ํฌ๋์ด์ ๋ฅผ ํ์ตํ ์ ์์ต๋๋ค. ๋ค์์ฒ๋ผ ์คํํ๋ฉด ๋ฉ๋๋ค. ๋ฏธ๋ฆฌ ๋น์ด์๋ WordPiece
๋ก ๋ชจ๋ธ์ ๋ค์ ์ด๊ธฐํํ์ต๋๋ค:
tokenizer.model = models.WordPiece(unk_token="[UNK]")
tokenizer.train(["wikitext-2.txt"], trainer=trainer)
๋ ๊ฒฝ์ฐ ๋ชจ๋ encode()
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ํ
์คํธ์์ ํ ํฌ๋์ด์ ๋ฅผ ํ
์คํธํ ์ ์์ต๋๋ค:
encoding = tokenizer.encode("Let's test this tokenizer")
print(encoding.tokens)
์์์ encoding
์ ๋ค์ํ ์์ฑ(ids
, type_ids
, tokens
, offsets
, attention_mask
, special_tokens_mask
, overflowing
)์ ํ ํฌ๋์ด์ ์ ๋ชจ๋ ํ์ํ ์ถ๋ ฅ์ ํฌํจํ๊ณ ์๋ Encoding
ํด๋์ค์ ๊ฐ์ฒด์
๋๋ค.
ํ ํฐํ ํ์ดํ๋ผ์ธ์ ๋ง์ง๋ง ๋จ๊ณ๋ ํ์ฒ๋ฆฌ(post-processing)์
๋๋ค. ์์ ๋ถ๋ถ์ [CLS] ํ ํฐ์ ์ถ๊ฐํ๊ณ ๋ ๋ถ๋ถ์ [SEP] ํ ํฐ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ํ ์์ ๋ฌธ์ฅ์ด ์๋ ๊ฒฝ์ฐ์๋ ๊ฐ ๋ฌธ์ฅ ๋ค์ [SEP]๋ฅผ ๋ถ์
๋๋ค. ์ด๋ฅผ ์ํด์, TemplateProcessor
๋ฅผ ์ฌ์ฉํ์ง๋ง ๋จผ์ ์ดํ์ง(vocabulary)์์ [CLS] ๋ฐ [SEP] ํ ํฐ์ ID๋ฅผ ์์์ผ ํฉ๋๋ค:
cls_token_id = tokenizer.token_to_id("[CLS]")
sep_token_id = tokenizer.token_to_id("[SEP]")
print(cls_token_id, sep_token_id)
TemplateProcessor
์ฉ ํ
ํ๋ฆฟ์ ์์ฑํ๋ ค๋ฉด ๋จ์ผ ๋ฌธ์ฅ๊ณผ ๋ฌธ์ฅ ์์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ง์ ํด์ผ ํฉ๋๋ค. ๋ ๋ค ์ฌ์ฉํ๋ ค๋ ํน์ ํ ํฐ์ ์์ฑํฉ๋๋ค. ์ฒซ ๋ฒ์งธ(๋๋ ๋จ์ผ) ๋ฌธ์ฅ์ \B๋ก ํ์๋ฉ๋๋ค. ์ด๋ค ๊ฐ๊ฐ(ํน์ ํ ํฐ ๋ฐ ๋ฌธ์ฅ)์ ๋ํด ์ฝ๋ก (colon) ๋ค์ ํด๋น ํ ํฐ ์ ํ ID๋ ์ง์ ํฉ๋๋ค.
๋ฐ๋ผ์ ๊ณ ์ ์ ์ธ BERT ํ ํ๋ฆฟ์ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋ฉ๋๋ค:
tokenizer.post_processor = processors.TemplateProcessing(
single=f"[CLS]:0 $A:0 [SEP]:0",
pair=f"[CLS]:0 $A:0 [SEP]:0 $B:1 [SEP]:1",
special_tokens=[("[CLS]", cls_token_id), ("[SEP]", sep_token_id)]
)
ํน์ ํ ํฐ์ ID๋ฅผ ์ ๋ฌํด์ผ ํ ํฌ๋์ด์ ๊ฐ ์ด๋ฅผ ํด๋น ID๋ก ์ ์ ํ๊ฒ ๋ณํํ ์ ์์ต๋๋ค.
์ผ๋จ ์ถ๊ฐ๋๋ฉด ์ด์ ์์ ์ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
encoding = tokenizer.encode("Let's test this tokenizer.")
print(encoding.tokens)
๋ํ, 2๊ฐ์ ๋ฌธ์ฅ์ ์ ๋ ฅํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ต๋๋ค:
encoding = tokenizer.encode("Let's test this tokenizer...", "on a pair of sentences.")
print(encoding.tokens)
print(encoding.type_ids)
์๋ก์ด ํ ํฌ๋์ด์ ๋ฅผ ๊ฑฐ์ ์์ฑํ์ต๋๋ค. ๋ง์ง๋ง ๋จ๊ณ๋ ๋์ฝ๋๋ฅผ ํฌํจํ๋ ๊ฒ์ ๋๋ค:
tokenizer.decoder = decoders.WordPiece(prefix="##")
์์ encoding
์ ์ด์ฉํด์ ํ
์คํธํด ๋ณด๊ฒ ์ต๋๋ค:
tokenizer.decode(encoding.ids)
์ข์ต๋๋ค! ์ด์ ๋ค์๊ณผ ๊ฐ์ด ๋จ์ผ JSON ํ์ผ์ ํ ํฌ๋์ด์ ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค:
tokenizer.save("tokenizer.json")
๊ทธ๋ฐ ๋ค์ from_file()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ Tokenizer
๊ฐ์ฒด์์ ํด๋น ํ์ผ์ ๋ค์ ๋ก๋ํ ์ ์์ต๋๋ค:
new_tokenizer = Tokenizer.from_file("tokenizer.json")
๐คTransformers์์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ํ ํฌ๋์ด์ ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด PreTrainedTokenizerFast
๋ก ๋ํํด์ผ ํฉ๋๋ค. ์ ๋๋ฆญ ํด๋์ค(generic class)๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ํ ํฌ๋์ด์ ๊ฐ ๊ธฐ์กด ๋ชจ๋ธ์ ํด๋นํ๋ ๊ฒฝ์ฐ, ํด๋น ํด๋์ค(์ฌ๊ธฐ์๋ BertTokenizerFast
)๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ๊ฐ์๋ฅผ ํ์ฉํ์ฌ ์๋ก์ด ํ ํฌ๋์ด์ ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒฝ์ฐ ์ฒซ๋ฒ์งธ ์ต์
์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
PreTrainedTokenizerFast
๋ฅผ ๊ฐ์ง๊ณ ํ ํฌ๋์ด์ ๋ฅผ ๋ํํ๋ ค๋ฉด ์ฐ๋ฆฌ๊ฐ ๋ง๋ ํ ํฌ๋์ด์ ๋ฅผ tokenizer_object
๋ก ์ ๋ฌํ๊ฑฐ๋ tokenizer_file
๋ก ์ ์ฅํ ํ ํฌ๋์ด์ ํ์ผ์ ์ ๋ฌํ ์ ์์ต๋๋ค. ๊ธฐ์ตํด์ผ ํ ์ค์ํ ์ ์ ๋ชจ๋ ํน์ ํ ํฐ์ ์๋์ผ๋ก ์ง์ ์ค์ ํด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค. PreTrainedTokenizerFast
ํด๋์ค๋ tokenizer
๊ฐ์ฒด๋ก๋ถํฐ ์ด๋ค ํ ํฐ์ด ๋ง์คํฌ ํ ํฐ์ธ์ง ์๋๋ฉด [CLS] ํ ํฐ ๋ฑ์ธ์ง ์ถ๋ก ํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค:
from transformers import PreTrainedTokenizerFast
wrapped_tokenizer = PreTrainedTokenizerFast(
tokenizer_object=tokenizer,
unk_token="[UNK]",
pad_token="[PAD]",
cls_token="[CLS]",
sep_token="[SEP]",
mask_token="[MASK]",
)
ํน์ ํ ํฌ๋์ด์ ํด๋์ค(์: BertTokenizerFast
)๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ ๋ ํ ํฐ(์ฌ๊ธฐ์๋ ์์)๊ณผ ๋ค๋ฅธ ํน์ ํ ํฐ๋ง ์ง์ ํ๋ฉด ๋ฉ๋๋ค:
from transformers import BertTokenizerFast
wrapped_tokenizer = BertTokenizerFast(tokenizer_object=tokenizer)
์ด์ ์ ํ ํฌ๋์ด์ ๋ฅผ ๋ค๋ฅธ ๐คTransformers ํ ํฌ๋์ด์ ์ฒ๋ผ ๋์ผํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ํ, save_pretrained()
๋ฉ์๋๋ก ์ ์ฅํ๊ฑฐ๋ push_to_hub()
๋ฉ์๋๋ก ํ๋ธ์ ์
๋ก๋ํ ์ ์์ต๋๋ค.
์ด์ ๊น์ง WordPiece ํ ํฌ๋์ด์ ๋ฅผ ๋น๋ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์์ผ๋ฏ๋ก BPE ํ ํฌ๋์ด์ ์ ๋ํด์๋ ๋์ผํ ์์ ์ ์ํํด ๋ณด๊ฒ ์ต๋๋ค. ๋ชจ๋ ๋จ๊ณ๋ฅผ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ์กฐ๊ธ ๋ ๋น ๋ฅด๊ฒ ์งํํ๊ณ ์ฐจ์ด์ ๋ง ๊ฐ์กฐ ํ์ํฉ๋๋ค.
BPE ํ ํฌ๋์ด์ ๋ฅผ ์ฒ์๋ถํฐ ๋น๋ฉํ๊ธฐ
์ด์ GPT-2 ํ ํฌ๋์ด์ ๋ฅผ ๋น๋ํด ๋ณด๊ฒ ์ต๋๋ค. BERT ํ ํฌ๋์ด์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก BPE ๋ชจ๋ธ๋ก Tokenizer
๋ฅผ ์ด๊ธฐํํ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค:
tokenizer = Tokenizer(models.BPE())
์์์์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ธฐ์กด์ ์ดํ์ง(vocabulary)์ด ์๋ ๊ฒฝ์ฐ ๋ชจ๋ธ์ ํด๋น ์ดํ์ง(vocabulary)์ผ๋ก ์ด๊ธฐํํ ์ ์์ง๋ง(์ด ๊ฒฝ์ฐ vocab
๊ณผ merges
๋ฅผ ์ ๋ฌํด์ผ ํจ) ์ฒ์๋ถํฐ ํ์ตํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋ด ํ์๋ ์์ต๋๋ค. ๋ํ GPT-2๋ byte-level BPE(๋ฐ์ดํธ ์์ค BPE)๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ unk_token
์ ์ง์ ํ ํ์๊ฐ ์์ต๋๋ค.
GPT-2๋ ๋ ธ๋ฉ๋ผ์ด์ ๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ํด๋น ๋จ๊ณ๋ฅผ ๊ฑด๋๋ฐ๊ณ ์ฌ์ ํ ํฐํ(pre-tokenization)๋ก ๋ฐ๋ก ์ด๋ํฉ๋๋ค:
tokenizer.pre_tokenizer = pre_tokenizers.ByteLevel(add_prefix_space=False)
์ฌ๊ธฐ์์ ByteLevel
์ ์ถ๊ฐํ ์ต์
์ ๋ฌธ์ฅ ์์ ๋ถ๋ถ์ ๊ณต๋ฐฑ์ ์ถ๊ฐํ์ง ์๋๋ก ํ๋ ์ต์
์
๋๋ค. ์ด์ ๊ณผ ๋์ผํ ์ฌ์ ํ ํฐํ ๊ฒฐ๊ณผ๋ฅผ ์๋์์ ๋ณผ ์ ์์ต๋๋ค:
tokenizer.pre_tokenizer.pre_tokenize_str("Let's test pre-tokenization!")
๋ค์์ ํ์ต์ด ํ์ํ ๋ชจ๋ธ์ ๋๋ค. GPT-2์ ๊ฒฝ์ฐ, ์ ์ผํ ํน์ ํ ํฐ์ ํ ์คํธ ๋(end-of-text) ํ ํฐ์ ๋๋ค:
trainer = trainers.BpeTrainer(vocab_size=25000, special_tokens=["<|endoftext|>"])
tokenizer.train_from_iterator(get_training_corpus(), trainer=trainer)
WordPieceTrainer
์ vocab_size
๋ฐ special_tokens
์ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ํ๋ ๊ฒฝ์ฐ min_frequency
๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ๋๋ ๋จ์ด ๋ ์ ๋ฏธ์ฌ(end-of-word suffix)๊ฐ ์๋ ๊ฒฝ์ฐ(์: </w>
) end_of_word_suffix
์ธ์๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
์ด ํ ํฌ๋์ด์ ๋ ํ ์คํธ ํ์ผ์ ๋ํด์๋ ํ์ตํ ์ ์์ต๋๋ค:
tokenizer.model = models.BPE()
tokenizer.train(["wikitext-2.txt"], trainer=trainer)
์ํ ํ ์คํธ๋ก ํ ํฐํ ํ ์คํธ๋ฅผ ํด๋ณด๊ฒ ์ต๋๋ค:
encoding = tokenizer.encode("Let's test this tokenizer.")
print(encoding.tokens)
๋ค์๊ณผ ๊ฐ์ด GPT-2 ํ ํฌ๋์ด์ ์ ๋ํ ๋ฐ์ดํธ ์์ค(byte-level) ํ์ฒ๋ฆฌ๋ฅผ ์ ์ฉํฉ๋๋ค:
tokenizer.post_processor = processors.ByteLevel(trim_offsets=False)
trim_offsets = False
์ต์
์ ํ์ฒ๋ฆฌ๊ธฐ(post-processor)๊ฐ 'ฤ '๋ก ์์ํ๋ ํ ํฐ์ ์คํ์
์ ๊ทธ๋๋ก ๋์ด์ผ ํจ์ ๋ํ๋
๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์คํ์
์ ์์์ ๋จ์ด์ ์ฒซ๋ฒ์งธ ๋ฌธ์๊ฐ ์๋๋ผ ๋จ์ด ์์ ๊ณต๋ฐฑ์ ๊ฐ๋ฆฌํต๋๋ค. ๊ทธ ์ด์ ๋ ๊ณต๋ฐฑ๋ ๊ธฐ์ ์ ์ผ๋ก ํ ํฐ์ ์ผ๋ถ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฐฉ๊ธ ์ธ์ฝ๋ฉํ ํ
์คํธ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ์ 'ฤ test'
๋ ์ธ๋ฑ์ค 4์ ํ ํฐ์
๋๋ค:
sentence = "Let's test this tokenizer."
encoding = tokenizer.encode(sentence)
start, end = encoding.offsets[4]
sentence[start:end]
๋ง์ง๋ง์ผ๋ก, ๋ฐ์ดํธ ์์ค(byte-level) ๋์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค:
tokenizer.decoder = decoders.ByteLevel()
์ด๊ฒ์ด ์ ๋๋ก ์๋ํ๋์ง ๋ค์ ํ์ธํ ์ ์์ต๋๋ค:
tokenizer.decode(encoding.ids)
์ด์ ์๋ฃ๋์์ผ๋ฏ๋ก, ์ด์ ๊ณผ ๊ฐ์ด ํ ํฌ๋์ด์ ๋ฅผ ์ ์ฅํ๊ณ , ์ด๋ฅผ ๐คTransformers์์ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํ๋ ๊ฒฝ์ฐ์๋ PreTrainedTokenizerFast
๋๋ GPT2TokenizerFast
๋ฅผ ์ด์ฉํ์ฌ ๋ํ(wrapping)ํ ์ ์์ต๋๋ค:
from transformers import PreTrainedTokenizerFast
wrapped_tokenizer = PreTrainedTokenizerFast(
tokenizer_object=tokenizer,
bos_token="<|endoftext|>",
eos_token="<|endoftext|>",
)
from transformers import GPT2TokenizerFast
wrapped_tokenizer = GPT2TokenizerFast(tokenizer_object=tokenizer)
์ด์ ๋ง์ง๋ง ์์ ๋ก Unigram ํ ํฌ๋์ด์ ๋ฅผ ์ฒ์๋ถํฐ ๋น๋ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
Unigram ํ ํฌ๋์ด์ ๋ฅผ ์ฒ์๋ถํฐ ๋น๋ฉํ๊ธฐ
์ด์ XLNet ํ ํฌ๋์ด์ ๋ฅผ ๋น๋ํด ๋ณด๊ฒ ์ต๋๋ค. ์ด์ ํ ํฌ๋์ด์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก Unigram ๋ชจ๋ธ๋ก Tokenizer
๋ฅผ ์ด๊ธฐํํ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค:
tokenizer = Tokenizer(models.Unigram())
์ญ์ ์ฌ๊ธฐ์๋, ์ดํ์ง(vocabulary)์ด ์๋ ๊ฒฝ์ฐ ๋ชจ๋ธ์ ์ดํ์ง์ผ๋ก ์ด๊ธฐํํ ์ ์์ต๋๋ค.
์ ๊ทํ(normalization)๋ฅผ ์ํด XLNet์ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ๋์ฒด๊ท์น(relpacements, 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()
์ด์ ์ ์์ ํ ์คํธ์ ๋ํ ์ฌ์ ํ ํฐํ ๊ฒฐ๊ณผ๋ฅผ ํ๋ฒ ๋ณด๊ฒ ์ต๋๋ค:
tokenizer.pre_tokenizer.pre_tokenize_str("Let's test the pre-tokenizer!")
๋ค์์ผ๋ก ๋ชจ๋ธ ํ์ต์ ๋๋ค. XLNet์๋ ๋ช ๊ฐ์ง ํน๋ณํ ํ ํฐ๋ค์ด ์์ต๋๋ค:
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)
UnigramTrainer
์์ ๋ปฌ๋จน์ง ๋ง์์ผ ํ ๋งค์ฐ ์ค์ํ ์ธ์๋ unk_token
์
๋๋ค. ๋ํ ํ ํฐ์ ์ ๊ฑฐํ๋ ๊ฐ ๋จ๊ณ์ ๋ํ shrinking_factor
(๊ธฐ๋ณธ๊ฐ์ 0.75), ๋๋ ์ฃผ์ด์ง ํ ํฐ์ ์ต๋ ๊ธธ์ด๋ฅผ ์ง์ ํ๊ธฐ ์ํ max_piece_length
(๊ธฐ๋ณธ๊ฐ์ 16) ๋ฑ๊ณผ ๊ฐ์ Unigram ์๊ณ ๋ฆฌ์ฆ์ ํนํ๋ ์ถ๊ฐ ๋งค๊ฐ๋ณ์๋ค์ ์ ๋ฌํ ์๋ ์์ต๋๋ค.
์ด ํ ํฌ๋์ด์ ๋ ์ญ์ ํ ์คํธ ํ์ผ์ ๋ํด์๋ ํ์ตํ ์ ์์ต๋๋ค:
tokenizer.model = models.Unigram()
tokenizer.train(["wikitext-2.txt"], trainer=trainer)
์ํ ํ ์คํธ์ ๋ํ ํ ํฐํ ๊ฒฐ๊ณผ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
encoding = tokenizer.encode("Let's test this tokenizer.")
print(encoding.tokens)
XLNet์ ํน์ง์ ํ ํฐ ํ์
ID๊ฐ 2์ธ <cls>
ํ ํฐ์ ๋ฌธ์ฅ ๋์ ์ถ๊ฐํ๋ค๋ ๊ฒ์
๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ข์ธก ํจ๋ฉ์
๋๋ค. BERT์ ๊ฐ์ด ํ
ํ๋ฆฟ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ํน์ ํ ํฐ๊ณผ ํ ํฐ ํ์
ID๋ฅผ ์ฒ๋ฆฌํ ์ ์์ง๋ง ๊ทธ์ ์ ๋จผ์ <cls>
๋ฐ <sep>
ํ ํฐ์ ID๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค:
cls_token_id = tokenizer.token_to_id("<cls>")
sep_token_id = tokenizer.token_to_id("<sep>")
print(cls_token_id, sep_token_id)
ํ ํ๋ฆฟ์ ๋ค์๊ณผ ๊ฐ์ ํํ๋ก ๊ตฌํ๋ฉ๋๋ค:
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)],
)
์ด์ ํ ์์ ๋ฌธ์ฅ์ ๋ํ ์ธ์ฝ๋ฉ์ด ์ ๋๋ก ์๋ํ๋์ง ํ ์คํธํ ์ ์์ต๋๋ค:
encoding = tokenizer.encode("Let's test this tokenizer...", "on a pair of sentences!")
print(encoding.tokens)
print(encoding.type_ids)
๋ง์ง๋ง์ผ๋ก Metaspace
๋์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค:
tokenizer.decoder = decoders.Metaspace()
ํ ํฌ๋์ด์ ๋น๋๋ฅผ ๋๋์ต๋๋ค! ์ด์ ๊ณผ ๊ฐ์ด ํ ํฌ๋์ด์ ๋ฅผ ์ ์ฅํ๊ณ ๐คTransformers ๋ด์์ ์ฌ์ฉํ๋ ค๋ฉด PreTrainedTokenizerFast
๋๋ XLNetTokenizerFast
๋ก ๋ํํ ์ ์์ต๋๋ค. PreTrainedTokenizerFast
๋ฅผ ์ฌ์ฉํ ๋ ํ ๊ฐ์ง ์ฃผ์ํด์ผ ํ ์ ์ ํน์ ํ ํฐ ์ง์ ๊ณผ ๋๋ถ์ด ๐คTransformers ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ์ชฝ์ ์ฑ์ฐ๋๋ก ์ง์(padding_side="left"
)ํด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค:
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",
)
from transformers import XLNetTokenizerFast
wrapped_tokenizer = XLNetTokenizerFast(tokenizer_object=tokenizer)
์ง๊ธ๊น์ง ๋ค์ํ ์์ ๋ชจ๋๋ค์ด ๊ธฐ์กด ํ ํฌ๋์ด์ ๋ฅผ ์๋กญ๊ฒ ๋น๋ํ๋ ๋ฐ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง ๋ณด์์ผ๋ฏ๋ก, ์ด ์ค๋ช ์ ํ์ฉํ์ฌ ๐คTokenizers ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ํ๋ ํ ํฌ๋์ด์ ๋ฅผ ๊ตฌ์ฑํ๊ณ ๐คTransformers์์ ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค.
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ([๐ค ๊ฐ์ข 6.9] ๋ธ๋ก ๋จ์๋ก ํ ํฌ๋์ด์ ๋น๋ฉํ๊ธฐ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@spasis/๊ฐ์ข-6.9-๋ธ๋ก-๋จ์๋ก-ํ ํฌ๋์ด์ -๋น๋ฉํ๊ธฐ์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค