본문 바로가기
DNN with Keras/NLP with Hugging Face

Tokenizers

by goatlab 2024. 1. 10.
728x90
반응형
SMALL

Tokenizers

 

 

토큰화는 문장을 토큰이라는 조각으로 잘게 자르는 작업이며, 동시에 구두점과 같은 특정 문자를 버릴 수도 있다. Hugging Face에는 이러한 문장을 단어와 하위 단어로 나눌 수 있는 토큰화 도구가 포함되어 있다. 영어와 일부 다른 언어는 공통된 단어 부분으로 구성되어 있기 때문에 하위 단어를 토큰화한다. 예를 들어, "sleeping"과 같은 동명사 단어는 "sleep"과 "##ing"으로 토큰화된다.

 

먼저, 허깅 페이스 토큰화 도구를 생성한다. 허깅 페이스 허브에서 여러 가지 토큰화 도구를 사용할 수 있다. 이 토큰화 도구는 BERT를 기반으로 하며 대소문자를 구분하지 않는 영어 텍스트를 가정한다.

 

from transformers import AutoTokenizer

model = "distilbert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model)

 

이제 샘플 문장을 토큰화할 수 있다.

 

encoded = tokenizer('Tokenizing text is easy.')
print(encoded)
{'input_ids': [101, 19204, 6026, 3793, 2003, 3733, 1012, 102], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1]}

 

이 토큰화 결과에는 두 가지 요소가 포함된다.

 

  • input_ids : 개별 하위 단어 인덱스, 각 인덱스는 하위 단어를 고유하게 식별
  • attention_mask : input_ids에서 패딩이 아닌 의미 있는 값

 

이 문장에는 패딩이 없으므로 모든 요소의 주의 마스크는 "1"이다. 나중에 출력을 고정 길이로 요청하여 패딩을 도입하고 항상 주의 마스크가 "0"이 되도록 할 것이다. 각 토큰화기는 다르게 구현될 수 있지만, 토큰화기의 어텐션 마스크는 일반적으로 "0" 또는 "1"이다. 하위 단어와 특수 토큰으로 인해 토큰의 수가 소스 문자열의 단어 수와 일치하지 않을 수 있다. 이러한 ID를 다시 문자열로 변환하면 개별 토큰의 의미를 확인할 수 있다.

 

tokenizer.convert_ids_to_tokens(encoded.input_ids)
['[CLS]', 'token', '##izing', 'text', 'is', 'easy', '.', '[SEP]']

 

보시다시피, 각 시퀀스의 시작과 끝에 두 개의 특수 토큰이 배치되어 있다. 곧 이러한 특수 토큰을 포함하거나 제외하는 방법에서 이러한 특수 토큰은 토큰화기마다 다를 수 있지만, [CLS]는 이 토큰화기의 시퀀스를 시작하고 [SEP]는 시퀀스를 끝낸다. 또한, "tokening"라는 동명사가 "token"과 "*ing"으로 나뉘어져 있는 것을 볼 수 있다.

 

이 토큰화기의 경우 특수 토큰은 100에서 103 사이에 발생한다. 대부분의 허깅 페이스 토큰라이저는 특수 토큰에 대해 이 대략적인 범위를 사용된다. 값 0은 일반적으로 패딩을 나타낸다. 이 명령으로 모든 특수 토큰을 표시할 수 있다.

 

tokenizer.convert_ids_to_tokens([0, 100, 101, 102, 103])
['[PAD]', '[UNK]', '[CLS]', '[SEP]', '[MASK]']

 

이 토큰 생성기는 다음과 같은 일반적인 토큰을 지원한다.

- [CLS] : 시퀀스 시작

- [SEP] : 시퀀스 종료

- [PAD] : 패딩

- [UNK] : 알 수 없는 토큰

- [MASK] : 신경망이 예측할 토큰을 마스킹

 

시퀀스 목록을 토큰화할 수도 있다. 한 번에 많은 시퀀스를 토큰화하여 표준 길이를 얻기 위해 시퀀스를 추가하거나 잘라낼 수 있다.

 

text = ["This movie was great!",
        "I hated this move, waste of time!"
        "Epic?"
]

encoded = tokenizer(text, padding=True, add_special_tokens=True)

print("∗∗ Input IDs∗∗")
for a in encoded.input_ids:
  print(a)

print("∗∗ Attention Mask∗∗")
for a in encoded.attention_mask:
  print(a)
∗∗ Input IDs∗∗
[101, 2023, 3185, 2001, 2307, 999, 102, 0, 0, 0, 0, 0, 0]
[101, 1045, 6283, 2023, 2693, 1010, 5949, 1997, 2051, 999, 8680, 1029, 102]
∗∗ Attention Mask∗∗
[1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

 

세 개의 영화 리뷰 텍스트 시퀀스에 대한 input_id를 확인한다. 각 시퀀스는 101로 시작하고 0으로 패딩한다. 패딩 바로 직전에 각 ID 그룹은 102로 끝난다. 관심도 마스크에도 각 패딩 항목에 대해 0이 있다.

 

토큰화 프로세스를 제어하기 위해 토큰화 도구에 두 개의 매개변수를 사용했다. 다른 유용한 매개변수는 다음과 같다.

 

  • add_special_tokens  (기본값 True) : 모델과 관련된 특수한 토큰으로 시퀀스를 인코딩할지 여부
  • padding (기본값 False) : 잘림을 활성화하고 제어
  • max_length (선택 사항) : 잘림 / 패딩 매개변수 중 하나에서 사용할 최대 길이를 제어
728x90
반응형
LIST

'DNN with Keras > NLP with Hugging Face' 카테고리의 다른 글

임베딩 전송 (Transferring Embedding)  (0) 2024.01.11
Embedding Layers  (0) 2024.01.11
Training HUGGING FACE models  (0) 2024.01.11
Hugging Face API (2)  (0) 2024.01.10
Hugging Face API (1)  (0) 2024.01.10