인공지능 개발자 수다(유튜브 바로가기) 자세히보기

자연어처리

[NLP] 토크나이저 (Tokenizer)

Suya_03 2023. 7. 7. 17:00

목차

    반응형

    1. 토크나이저란

    • 토크나이저는 텍스트를 단어, 서브 단어, 문장 부호 등의 토큰으로 나누는 작업을 수행
    • 텍스트 전처리의 핵심 과정

    2. 토크나이저의 종류

    2.1. 공백 기반 토크나이저(Whitespace Tokenizer)

    • 텍스트를 공백으로 구분하여 토크나이징하는 가장 간단한 방법입니다. 이 방법은 영어와 같은 공백으로 단어가 구분되는 언어에서 잘 작동한다.
    • 중국어나 한국어와 같이 공백이 없거나 연결되어 있는 경우에는 적합하지 않습니다.

    2.2. 기본 정규식 토크나이저(Regex Tokenizer)

    • 정규식을 사용하여 텍스트를 분할하는 방식입니다. 사용자가 원하는 기준에 따라 토크나이징할 수 있으며, 공백 외에도 문장 부호 등 다른 문자를 기준으로 텍스트를 분할할 수 있습니다.

    2.3. BPE(Byte Pair Encoding)

    • 서브 워드 토크나이징을 위한 알고리즘으로, 일정한 크기의 보카뷰러리를 만들기 위해 데이터셋에서 가장 많이 발생하는 문자쌍을 병합하는 방식으로 토큰을 생성합니다. BPE는 고정된 크기의 어휘집을 생성하고, OOV(Out-of-Vocabulary) 토큰이 발생할 가능성을 줄입니다.
    • 토크나이징 과정
      • 모든 문자를 기본 토큰으로 설정합니다.
      • 데이터셋에서 가장 빈번하게 등장하는 연속된 문자쌍(바이트 쌍)을 찾습니다.
      • 가장 빈번한 바이트 쌍을 새로운 토큰으로 추가합니다.
      • 설정한 단어집 크기에 도달할 때까지 2번째와 3번째 과정을 반복합니다.

    2.4. WordPiece

    • BPE와 비슷한 방식을 사용하는 토큰화 방법으로, 단어를 더 작은 서브 단어로 분할합니다.
    • 여기서 서브워드란 작은 단위의 단어를 의미하는데, 예를 들면 '자연어처리'는 서브워드 '자연어', '처리'로 나눌 수 있습니다.
    • WordPiece는 일정한 횟수 이상 발생하는 결과물인 서브 워드를 생성하거나, 반복되는 서브 워드를 병합합니다.
    • Transformer 기반 언어 모델에서 자주 사용됩니다. 예를 들어 gpt, bert 등이 있습니다.

    2.5. SentencePiece

    • 텍스트를 처리하기 전에 언어에 구애받지 않고 원시 텍스트를 토큰으로 분할할 수 있는 토큰화 라이브러리입니다.
    • SentencePiece는 다음과 같은 장점이 있습니다:
      • 전처리가 쉽고 빠릅니다. 어휘집 생성과 토크나이징을 한 번의 과정으로 수행할 수 있습니다.
      • 언어에 구애받지 않으며, 언어 간 전이 학습에 효과적입니다. 서브워드 단위의 토큰화로 인해 언어 간의 구조적 공유가 쉬워집니다.
      • 어휘집 크기를 고정하고 OOV 문제를 최소화합니다. 이는 다양한 환경에서 합리적인 토크나이징 성능을 제공할 수 있습니다.
    • BERT, GPT 및 기타 최신 트랜스포머 기반 모델에서 SentencePiece는 토큰화 솔루션으로 널리 사용되고 있습니다.
    • 두가지 토크나이징 방법을 제공합니다.
      • BPE (Byte Pair Encoding): 빈도 기반으로 문자열을 병합하고 토큰을 생성하는 방법을 사용합니다. 이 방식은 고정된 크기의 어휘 집합을 생성하고 OOV 문제를 해결하는 데 효과적입니다.
      • Unigram Language Model: 일변량 언어 모델에 기반한 방식으로, 가능한 토큰 분할 후보들 중에서 가장 높은 확률을 갖는 분할을 선택합니다. 이 방식은 데이터에서 발견된 최선의 토큰 분할 집합을 찾는 데 사용됩니다.

    3. 사용 예시

    3.3. wordPiece

    from transformers import BertTokenizer
    
    # BERT Model에 해당하는 WordPiece tokenizer를 불러옵니다.
    tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
    
    # 원문 텍스트를 tokenizing 해줍니다.
    text = "I love natural language processing using transformers."
    tokens = tokenizer.tokenize(text)
    
    print("Tokens:", tokens)

    4.4. SentencePiece

    import sentencepiece as spm
    import torch
    from torch.utils.data import Dataset
    
    # SentencePiece 학습 (위 예제에서 사용한 것과 동일)
    spm.SentencePieceTrainer.train(input="sample_text.txt", model_prefix="sentencepiece", model_type="unigram", vocab_size=3000)
    sp = spm.SentencePieceProcessor()
    sp.load("sentencepiece.model")
    
    class TextDataset(Dataset):
        def __init__(self, input_file, tokenizer):
            with open(input_file, "r", encoding="utf-8") as f:
                self.text_data = f.readlines()
            self.tokenizer = tokenizer
    
        def __len__(self):
            return len(self.text_data)
    
        def __getitem__(self, idx):
            raw_text = self.text_data[idx].rstrip()
            tokenized_text = self.tokenizer.encode(raw_text, out_type=int)
            token_tensor = torch.tensor(tokenized_text)
            return token_tensor
    
    # 사용자 정의 데이터셋을 사용하는 방법
    my_dataset = TextDataset("sample_text.txt", sp)
    sample_data = my_dataset[0]
    print("Sample tokenized data:", sample_data)
    반응형