Tokenizers ?!
긴 문자열을 작은 단위, 즉 토큰(token)으로 분리하여 단어 문자 등 자연어 처리(NLP)에 기본적인 역할
모델은 숫자만 처리할 수 있기 때문에 토크나이저는 텍스트 입력을 수치형 데이터로 변환해야 한다.
그래서 원시 텍스트를 숫자로 바꿀 방법이 토크나이저가 된다.
몇가지 토큰알고리즘을 보면
- 공백 기반 토큰화(Whitespace Tokenization):
- 가장 간단하고 널리 사용되는 방법 중 하나입니다.
- 텍스트를 공백(스페이스, 탭, 새 줄)을 기준으로 분할합니다.
- 이 방법은 구조가 간단한 텍스트에 적합하지만, 복잡한 구조의 텍스트(예: 구두점이 많은 문장)에서는 잘 작동하지 않을 수 있습니다.
- 구두점 기반 토큰화(Punctuation-based Tokenization):
- 공백과 함께 구두점(예: 마침표, 쉼표, 물음표)을 토큰의 경계로 사용합니다.
- 이 방법은 구두점이 중요한 역할을 하는 텍스트(예: 문장)에서 유용합니다.
- 정규 표현식 기반 토큰화(Regex-based Tokenization):
- 정규 표현식을 사용하여 매우 유연한 토큰화 규칙을 정의할 수 있습니다.
- 사용자는 특정 패턴을 매칭하거나 제외하기 위해 정규 표현식을 사용하여 토큰화 규칙을 세밀하게 조정할 수 있습니다.
- 서브워드 토큰화(Subword Tokenization):
- 단어를 더 작은 의미 단위로 분할합니다. 이 방식은 언어의 어휘가 크거나 미리 정의되지 않은 경우 효과적입니다.
- BPE(Byte Pair Encoding): 가장 빈번하게 등장하는 바이트 쌍을 반복적으로 병합하여 어휘를 구축합니다.
- WordPiece: BPE와 유사하지만, 어휘를 구축할 때 토큰화의 품질을 최적화합니다.
- SentencePiece: 언어에 구애받지 않고, 미리 정의된 어휘 없이도 텍스트를 토큰화할 수 있습니다.
- 트리 구조 기반 토큰화(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
토크나이저에 대한 간단한 설명은 아래 내용을 보면 쉽게 이해가 된다.
- 텍스트 분할(Text Segmentation):
- 토크나이저는 원본 텍스트를 토큰이라는 더 작은 단위로 분할합니다. 예를 들어, 문장 "Hello, World!"를 단어 단위로 토큰화하면 ["Hello", ",", "World", "!"]와 같이 될 수 있습니다.
- 서브워드 토크나이징(Subword Tokenizing):
- 많은 언어에서 단어는 더 작은 의미 단위로 나눌 수 있으며, 이를 위해 서브워드 토크나이징이 사용됩니다. 예를 들어, "unbelievable"은 "un-", "believe", "-able"로 나눌 수 있습니다.
- 이 방식은 어휘가 매우 크거나 미리 정의되지 않은 언어에서 효과적이며, BPE(Byte Pair Encoding)나 SentencePiece와 같은 알고리즘이 이에 해당합니다.
- 텍스트 전처리(Text Preprocessing):
- 토크나이저는 텍스트를 정규화하는 과정에서도 중요합니다. 예를 들어, 대소문자를 통일하거나, 불필요한 공백을 제거하거나, 특수 문자를 처리하는 등의 작업을 포함합니다.
- 텍스트 인코딩(Text Encoding):
- 토크나이징 과정 후에, 각 토큰은 모델이 이해할 수 있는 형태, 즉 숫자로 변환되어야 합니다. 이 과정을 인코딩이라고 하며, 일반적으로 각 토큰에 고유한 ID를 할당합니다.
- 모델과의 호환성(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")