hugging face Tokenizer의 tokenize, encode, encodeplus 등의 차이
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
상기 절차
tokenize
와 convert_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인 거 알지?그리고 엔코드.plus
return_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)))
Reference
이 문제에 관하여(hugging face Tokenizer의 tokenize, encode, encodeplus 등의 차이), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/hellorusk/articles/7fd588cae5b173텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)