hugging face Tokenizer의 tokenize, encode, encodeplus 등의 차이

hugging face 라이브러리를 사용하면 tokenize, encode, encode플러스 등이 자주 혼잡해지기 때문에 다시 정리할게요.

tokenize


언어 모델의vocalbulary에 따라 입력 문자를 공유합니다.
$ pip install transformers[ja]
tokenizer = AutoTokenizer.from_pretrained("cl-tohoku/bert-base-japanese-whole-word-masking")
tokenizer.tokenize("私は元気です。")
또한convert_tokens_to_ids를 사용하면 어휘에 대응하는token id의 배열로 변환할 수 있다.
['私', 'は', '元気', 'です', '。']
tokenizer.convert_tokens_to_ids(['私', 'は', '元気', 'です', '。'])

encode


상기 절차tokenizeconvert_tokens_to_ids를 동시에 진행하여 입력문에서 Token id의 배열로 직접 전환한다.
[1325, 9, 12453, 2992, 8]
tokenizer.encode("私は元気です。")
또한 현재transformers 라이브러리(v4.11.3)에서 이encode에 대한 출력은 기본add_special_tokens 옵션을 통해 배열의 시작과 끝에 특수 영패를 삽입한다(이것은 언어 모델의 사전 학습 때와 같기 때문에 추천 조작).
BERT라면 특수영패는 처음[CLS]과 문장말[SEP]의 영패로 각각 id의 2, 3에 대응한다.
조금 오래된 버전이라면 기본값이기 때문에 add_special_tokens=True의 내용을 매개 변수에 넣어야 합니다.
[2, 1325, 9, 12453, 2992, 8, 3]

encode_plus


상기encode를 제외하고 언어 모델 입력에 필요한 다른 id를 출력합니다.BERT의 경우 Token type id와 attention mask를 함께 출력합니다.
# 古い transformers の場合
tokenizer.encode("私は元気です。", add_special_tokens=True)
tokenizer.encode_plus("私は元気です。")
token type id는 특별한fine-tuning을 하지 않으면 모두 0으로 고려하면 문제없습니다.
attention_mask는 영패의 실제 길이를 정할 때 매우 중요하다.언어 모델을 사용할 때 일반적으로 어느 정도에 최대 영패 수를 결정하지만 최대 영패 수는 모두 입력문에 차지되지 않기 때문에 사용하지 않는 부분에 attention을 붙인다는 뜻이다.
{'input_ids': [2, 1325, 9, 12453, 2992, 8, 3], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1]}
tokenizer.encode_plus("私は元気です。", padding='max_length', max_length=16)
의 예시에서 실질적인 영패만 있는 부분은attention-마스크 값이 1인 거 알지?
그리고 엔코드.plusreturn_tensors='pt' 옵션에서는 언어 모드에 직접 입력할 수 있어 매우 편리합니다.
{'input_ids': [2, 1325, 9, 12453, 2992, 8, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]}
from transformers import AutoModelForMaskedLM, AutoTokenizer
model = AutoModelForMaskedLM.from_pretrained("cl-tohoku/bert-base-japanese-whole-word-masking")
tokenizer = AutoTokenizer.from_pretrained("cl-tohoku/bert-base-japanese-whole-word-masking")

inputs = tokenizer.encode_plus("私はとても[MASK]です。", return_tensors='pt')
outputs = model(**inputs)
tokenizer.convert_ids_to_tokens(outputs.logits[0][1:-1].argmax(axis=-1))

batch_encode_plus


여러 문장을 한 번에 처리할 때 매우 편리하다.
['私', 'は', 'とても', '幸せ', 'です', '。']
from transformers import AutoModelForMaskedLM, AutoTokenizer
model = AutoModelForMaskedLM.from_pretrained("cl-tohoku/bert-base-japanese-whole-word-masking")
tokenizer = AutoTokenizer.from_pretrained("cl-tohoku/bert-base-japanese-whole-word-masking")

sentences = [
  "私はとても[MASK]です。", 
  "昨日とても[MASK]なことがあった。", 
  "それはとても[MASK]な食べ物だね!"
]

inputs = tokenizer.batch_encode_plus(sentences, padding='max_length', max_length=16, return_tensors='pt')
outputs = model(**inputs)

for i in range(3):
    print(tokenizer.convert_ids_to_tokens(outputs.logits[i][1:-1].argmax(axis=-1)))

좋은 웹페이지 즐겨찾기