코딩하는코알라/AI

Tokenizers ?!

룰루랄라코알라 2024. 1. 19. 08:09

긴 문자열을 작은 단위, 즉 토큰(token)으로 분리하여 단어 문자 등 자연어 처리(NLP)에 기본적인 역할

 모델은 숫자만 처리할 수 있기 때문에 토크나이저는 텍스트 입력을 수치형 데이터로 변환해야 한다. 

 

그래서 원시 텍스트를 숫자로 바꿀 방법이 토크나이저가 된다. 

 

몇가지 토큰알고리즘을 보면 

  1. 공백 기반 토큰화(Whitespace Tokenization):
    • 가장 간단하고 널리 사용되는 방법 중 하나입니다.
    • 텍스트를 공백(스페이스, 탭, 새 줄)을 기준으로 분할합니다.
    • 이 방법은 구조가 간단한 텍스트에 적합하지만, 복잡한 구조의 텍스트(예: 구두점이 많은 문장)에서는 잘 작동하지 않을 수 있습니다.
  2. 구두점 기반 토큰화(Punctuation-based Tokenization):
    • 공백과 함께 구두점(예: 마침표, 쉼표, 물음표)을 토큰의 경계로 사용합니다.
    • 이 방법은 구두점이 중요한 역할을 하는 텍스트(예: 문장)에서 유용합니다.
  3. 정규 표현식 기반 토큰화(Regex-based Tokenization):
    • 정규 표현식을 사용하여 매우 유연한 토큰화 규칙을 정의할 수 있습니다.
    • 사용자는 특정 패턴을 매칭하거나 제외하기 위해 정규 표현식을 사용하여 토큰화 규칙을 세밀하게 조정할 수 있습니다.
  4. 서브워드 토큰화(Subword Tokenization):
    • 단어를 더 작은 의미 단위로 분할합니다. 이 방식은 언어의 어휘가 크거나 미리 정의되지 않은 경우 효과적입니다.
    • BPE(Byte Pair Encoding): 가장 빈번하게 등장하는 바이트 쌍을 반복적으로 병합하여 어휘를 구축합니다.
    • WordPiece: BPE와 유사하지만, 어휘를 구축할 때 토큰화의 품질을 최적화합니다.
    • SentencePiece: 언어에 구애받지 않고, 미리 정의된 어휘 없이도 텍스트를 토큰화할 수 있습니다.
  5. 트리 구조 기반 토큰화(Tree-based Tokenization):
    • 구문 분석(parser)를 사용하여 문장의 구조를 분석하고, 이 구조에 따라 텍스트를 분할합니다.
    • 예를 들어, 구문 트리(syntax tree)에서 각 구(phrase)나 절(clause)을 토큰으로 간주할 수 있습니다.

1. 에대 해서는 

등이 있다. 우선 공백 토큰화는 예로 파이썬의 split() 함수를 이용해 공백 기준으로 텍스트 나누어 쓸수있고 

이렇게 되면 큰 단어사전정도의 점보를 얻을수있다. 

이렇게 얻은 단어들은 예로 영어에 단어들과 ID 를 매핑하여 추적할수있고  만약 없는단어라면 

. “unknown” 토큰으로 알려진 이 토큰은 ”[UNK]“이나 ”<UNK>“로 표현 되고 이런 Unknown 은 매우 불필요 한 부분으로 가능한 unknow 을 적게되도록 해야한다. 

 

적게 하기 위한 방법으로 문자기반 토큰화를 사용한다. 

  • 단어 사전이 간결해진다.
  • 모든 단어는 문자로 이루어졌기 때문에 out-of-vocabulary (unknown) 토큰의 수가 훨씬 적다.

위와 같은 장점이 부각된다 .

 

위 두가지 장점을 활용한 방법이 4번의 서브워드 토큰화(Subword Tokenization) 이다 .

알고리즘은 자주 사용되는 단어는 더 작은 서브워드로 나누면 안되지만, 희귀한 단어는 의미 있는 서브워드로 나눠야 한다는 규칙

 

예를 들면 “annoyingly”는 흔하지 않은 단어로 여겨질 수 있고 “annoying”과 “ly”로 분해할 수 있을 것입니다. 둘다 독립적인 서브워드로 자주 등장할 가능성이 있는 반면에 “annoyingly”는 “annoying”과 “ly”의 합성으로만 의미가 유지됩니다

 

 

 이 방식을 통해 크기가 작은 단어 사전으로도 많은 토큰을 표현할 수 있고 unknown 토큰도 거의 없어진다.

 

다양한 토큰화 기법이 존재하는데 확인해볼 필요가 있다. 

  • GPT-2에서 사용된 Byte-level BPE
  • BERT에서 사용된 WordPiece

 

토크나이저에 대한 간단한 설명은 아래 내용을 보면 쉽게 이해가 된다. 

  1. 텍스트 분할(Text Segmentation):
    • 토크나이저는 원본 텍스트를 토큰이라는 더 작은 단위로 분할합니다. 예를 들어, 문장 "Hello, World!"를 단어 단위로 토큰화하면 ["Hello", ",", "World", "!"]와 같이 될 수 있습니다.
  2. 서브워드 토크나이징(Subword Tokenizing):
    • 많은 언어에서 단어는 더 작은 의미 단위로 나눌 수 있으며, 이를 위해 서브워드 토크나이징이 사용됩니다. 예를 들어, "unbelievable"은 "un-", "believe", "-able"로 나눌 수 있습니다.
    • 이 방식은 어휘가 매우 크거나 미리 정의되지 않은 언어에서 효과적이며, BPE(Byte Pair Encoding)나 SentencePiece와 같은 알고리즘이 이에 해당합니다.
  3. 텍스트 전처리(Text Preprocessing):
    • 토크나이저는 텍스트를 정규화하는 과정에서도 중요합니다. 예를 들어, 대소문자를 통일하거나, 불필요한 공백을 제거하거나, 특수 문자를 처리하는 등의 작업을 포함합니다.
  4. 텍스트 인코딩(Text Encoding):
    • 토크나이징 과정 후에, 각 토큰은 모델이 이해할 수 있는 형태, 즉 숫자로 변환되어야 합니다. 이 과정을 인코딩이라고 하며, 일반적으로 각 토큰에 고유한 ID를 할당합니다.
  5. 모델과의 호환성(Model Compatibility):
    • 다양한 NLP 모델들은 특정 형태의 입력을 요구합니다. 토크나이저는 이러한 모델의 요구사항에 맞게 텍스트 데이터를 준비하는 데 도움을 줍니다. 예를 들어, 트랜스포머 기반 모델은 특정 길이의 입력을 요구하며, 토크나이저는 이를 위해 패딩(padding) 또는 잘라내기(truncation)를 수행할 수 있습니다.

 

기본적으로 불러오기 / 저장하기  기본으로 알아야 model 을 불러다 쓰기 편하다. 

//먼저  Transformers 라이브러리로 학습된 토크나이저를 쉽게 불러 올수있다. 
//설치 진행 
pip install transformers

from transformers import AutoTokenizer

# 예시로 BERT 모델의 토크나이저를 불러오는 코드
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

//from_pretrained 메서드는 모델에 맞는 토크나이저를 자동으로 다운로드하고 캐시

# 토크나이저를 파일 시스템에 저장
tokenizer.save_pretrained("/path/to/directory")

save_pretrained 메서드는 지정된 디렉토리에 토크나이저 관련 파일들을 저장합니다. 이 디렉토리는 나중에 from_pretrained 메서드를 통해 다시 불러올 수 있습니다.

#저장된 토크나이저 불러오기 
tokenizer = AutoTokenizer.from_pretrained("/path/to/directory")
반응형