목차
반응형
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)
반응형
'자연어처리' 카테고리의 다른 글
[ChatGPT API] 파이썬으로 실습하기 (2) | 2024.01.01 |
---|---|
[자연어 처리] 프롬프트 튜닝(Prompt Tuning) (2) | 2023.12.06 |
mecab 설치하기 (mac m1) (0) | 2022.12.13 |
konlpy 설치하기 (mac m1) (0) | 2022.12.13 |