1. 토큰과 단어사전
1.1. 코퍼스
코퍼스(Corpus) 는 자연어처리(Natural Language Processing, NLP) 분야에서 사용되는 특정 언어, 문체, 주제 등을 포괄하는 텍스트 자료의 집합을 의미합니다. 이러한 코퍼스는 자연어 연구와 애플리케이션 개발에 필수적인 데이터 집합으로, 일반적으로 '말뭉치'라고도 불립니다. 코퍼스는 원시 텍스트 데이터에서 얻어진 정보를 시스템적으로 분석하고, 이를 통해 언어의 구조적, 기능적 특성을 탐색하는 데 사용됩니다.
1.2. 토큰
토큰(Token) 은 텍스트 데이터를 의미론적 또는 구문론적으로 분석 및 처리할 때 기초가 되는 가장 작은 단위입니다. 각 토큰은 하나의 단어, 구, 또는 문장 등으로 나타날 수 있으며, 텍스트 내의 의미를 포착하는 데 중요한 역할을 합니다. 토큰은 텍스트의 의미를 해석하고 분석하는 과정에서 기본적인 구성 요소로 작용합니다.
토큰화(Tokenization) 는 코퍼스를 구성하는 텍스트를 이러한 토큰으로 분리하는 과정입니다. 토큰화는 자연어처리 시스템에서 데이터를 전처리하는 초기 단계로, 효율적인 데이터 분석과 처리를 위해 매우 중요합니다. 이 과정은 기계학습 모델이나 다른 텍스트 분석 도구가 처리할 수 있는 형태로 데이터를 조직하는 데 필수적입니다.
예를 들어, 한국어 문장 "나는 자연어처리를 공부한다'를 토큰화할 때, 표준적인 접근 방식에 따르면 ['나는', '자연어처리를", "공부한다"]와 같이 분리될 수 있습니다. 이러한 토큰화 과정은 언어의 구조적 및 문법적 규칙을 반영하여 수행되며, 결과적으로 언어의 의미론적 특성을 더욱 명확히 이해할 수 있게 합니다.
토큰화의 방법은 대상 언어의 특성에 따라 달라질 수 있으며, 구체적인 토큰화 알고리즘은 언어의 문법적, 의미적 요소를 고려하여 선택됩니다. 따라서, 토큰화 과정은 자연어처리 시스템의 전반적인 성능에 직접적인 영향을 미치는 중요한 단계입니다.
1.3. 단어사전
단어사전(Vocabulary) 은 모델이 인식하고 처리할 수 있는 모든 단어 또는 토큰의 집합입니다. 이 사전은 일반적으로 각 단어나 토큰을 고유한 정수 인덱스에 매핑하는 구조로 표현 되며, 이를 통해 텍스트 데이터를 숫자 데이터로 변환하여 모델이 처리할 수 있도록 합니다.
실제 어휘집 구축 시, [PAD], [UNK], [CLS], [SEP], [MASK] 등의 특수 토큰을 추가하는 것이 일반적입니다. 이 토큰들은 특정 NLP 모델에서 요구하는 구조적 요소를 제공합니다.
- [PAD]: 입력 시퀀스의 길이를 일정하게 맞추기 위해 사용
- [UNK]: 훈련 데이터에서 미처 학습되지 않았거나 단어사전에 없는 단어를 대체하는 토큰
- [CLS]: 입력의 시작 부분에 위치한 토큰
- [SEP]: 두 개 이상의 시퀀스를 구분하는 데 사용
- [MASK]: 입력 시퀀스에서 일부 토큰을 가리는 데 사용
2. 토큰화 종류
토큰화는 텍스트를 의미론적, 구문론적 단위로 분할하는 과정으로 자연어처리(NLP)에서 필수적인 전처리 단계입니다. 이 과정은 텍스트를 다루는 특정 목적에 따라 다양한 방법으로 수행될 수 있어, 상황에 맞는 방법을 선택해 사용하면 되겠습니다. 주로 사용되는 토큰화 방법은 다음과 같습니다.
2.1. 어휘 토큰화 (Lexical Tokenization)
어휘 토큰화는 텍스트를 공백, 구두점, 특수 문자 등을 기준으로 분리하여 토큰을 생성합니다. 이 방식은 가장 기본적인 토큰화 방법으로, 간단하게 구현할 수 있지만, 언어의 복잡한 구조를 완전히 파악하기에는 한계가 있습니다. 예를 들어, "New York'이라는 구를 두 개의 독립된 단어로 분리하는 오류를 범할 수 있습니다.
2.2. 문장 토큰화 (Sentence Tokenization)
문장 토큰화는 텍스트를 문장 단위로 분리합니다. 이 방식은 문서 내에서 개별 문장을 식별하고 분석하는데 유용하며, 문맥적 분석이나 기계 번역 등의 작업에 적합합니다. 문장 토 큰화는 종종 구두점(마침표, 느낌표, 물음표 등)을 기준으로 수행되지만, 축약형이나 명칭 등에서 발생할 수 있는 예외 상황을 처리하는 것이 중요합니다.
2.3. 형태소 토큰화 (Morphological Tokenization)
형태소 토큰화는 단어를 더 작은 의미 있는 단위인 형태소로 분리하는 과정입니다. 이 방법은 특히 굴절 언어(예: 한국어, 러시아어)에서 유용하며, 단어의 뿌리, 접미사, 접두사 등을 식별하여 토큰화합니다. 형태소 분석은 언어의 깊은 구조적 특성을 이해하는 데 필수적이며, 품사 태깅과 밀접하게 연관되어 있습니다.
2.4. 서브워드 기반 토큰화 (Subword Tokenization)
서브워드 기반 토큰화는 단어를 더 작은 단위로 나누는 기법으로, 단어 내에서 공통적으로 등장하는 문자 시퀀스를 기반으로 합니다. 이 접근 방식은 언어의 풍부한 내부 구조를 활용 하여, 새로운 단어나 희귀 단어에 대해서도 효과적으로 처리할 수 있는 장점을 가지고 있습니다.
서브워드 토큰화는 특히 희귀 단어나 고유명사, 신조어 등을 효과적으로 처리할 수 있는 능력 덕분에, 기계 번역, 텍스트 생성, 음성 인식 등의 분야에서 중요하게 사용됩니다. 예를 들 어, "transformer"라는 단어가 훈련 데이터에 없더라도, "trans"와 "former"로 나누어 처리할 수 있어, 모델이 미처 학습하지 못한 단어를 보다 잘 처리할 수 있습니다.
서브워드 기반 토큰화는 텍스트의 세밀한 분석을 가능하게 하며, 언어의 다양성과 복잡성을 효과적으로 포착할 수 있도록 도와줍니다. 이러한 방식으로, 언어 처리 시스템은 더욱 정 확하고 유연하게 다양한 언어적 현상을 다룰 수 있습니다.
서브워드 기반 토큰화에는 여러 종류가 있습니다.
- Byte Pair Encoding (BPE): BPE는 원래 데이터 압축 기술에서 유래했으며, 자연어 처리에서는 단어를 반복적으로 등장하는 문자 쌍으로 분해합니다. 이 과정은 빈번하게 등장하 는 쌍을 하나의 새로운 단위로 병합하는 방식으로 진행되며, 이를 통해 언어의 다양한 변형을 효과적으로 모델링할 수 있습니다.
- WordPiece: 구글에서 개발한 WordPiece는 주어진 어휘에 대해 가능한 한 많은 단어를 표현할 수 있는 서브워드 집합을 생성합니다. 이 방식은 BPE와 유사하지만, 각 서브워드가 최종 어휘에서 얼마나 유용한지에 따라 병합을 결정합니다.
- Unigram Language Model: Unigram 모델은 가능한 서브워드 후보군을 생성하고, 이 후보들을 기반으로 단어의 확률 모델을 구축합니다. 이 모델은 각 서브워드 후보의 확률을 계산하여 가장 효율적인 토큰 집합을 선택합니다.
3. 규칙 기반 토크나이저(Rule-Based Tokenizer)
이 토크나이저는 공백이나 구두점과 같은 명확한 기준을 사용하여 텍스트를 토큰으로 분리합니다. 특정 언어의 구문적이나 형태적 특징을 고려하지 않기 때문에 언어에 독립적으로 사용될 수 있습니다.
3.1 공백 기반 토크나이저
def tokenizer(text):
# 공백을 기준으로 분리
tokens = text.split()
return tokens
# 텍스트 입력
text = "tv future in the hands of viewers with home theatre systems plasma high-definition tvs and digital video recorders moving into the living room the way people watch tv will be radically different in five years time."
# 공백을 기준으로 텍스트 토크나이징
tokens = tokenizer(text)
# 토큰 출력
print(tokens)
['tv', 'future', 'in', 'the', 'hands', 'of', 'viewers', 'with', 'home', 'theatre', 'systems', 'plasma', 'high-definition', 'tvs', 'and', 'digital', 'video', 'recorders', 'moving', 'into', 'the', 'living', 'room', 'the', 'way', 'people', 'watch', 'tv', 'will', 'be', 'radically', 'different', 'in', 'five', 'years', 'time.']
3.2 정규 표현식 토크나이저
import re
def tokenizer(text):
# 정규 표현식을 사용하여 단어가 아닌 문자를 기준으로 텍스트를 분리합니다.
pattern = r'\b\w+\b'
tokens = re.findall(pattern, text)
return tokens
# 테스트 코드
text = "Hello, world! This is a test sentence. Let's see how it tokenizes."
tokens = tokenizer(text)
print(tokens)
['Hello', 'world', 'This', 'is', 'a', 'test', 'sentence', 'Let', 's', 'see', 'how', 'it', 'tokenizes']
4. 학습이 필요한 토크나이저
이 유형의 토크나이저는 특정 데이터셋에 맞춰 어휘를 구축하기 위한 학습 과정을 필요로 합니다. 데이터에 대한 분석을 통해 어휘를 구축하고, 이를 기반으로 토크나이징을 수행합니다.
tokenizers 라이브러리에서는 여러 종류의 토크나이저 모델을 지원하며, 이 중 일부는 학습을 통해 사용자의 특정 데이터셋에 맞게 어휘(vocabulary)를 구축할 수 있습니다.
4.1 BPE 토크나이저
from tokenizers import Tokenizer
from tokenizers.models import BPE
from tokenizers.trainers import BpeTrainer
# BPE 토크나이저 생성
tokenizer = Tokenizer(BPE())
# 트레이너 설정: vocab_size와 min_frequency 조정 가능
trainer = BpeTrainer(vocab_size=10000, min_frequency=10)
# 훈련 파일 목록: 파일 경로를 리스트로 제공
train_files = ['pride_and_prejudice.txt']
# 훈련 실행
tokenizer.train(train_files, trainer)
# 텍스트 토크나이징 예제
text = "It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife."
output = tokenizer.encode(text)
print(output.tokens)
['It ', 'is a ', 'truth ', 'uni', 'vers', 'ally ', 'acknowledg', 'ed, ', 'that ', 'a s', 'ing', 'le ', 'man ', 'in ', 'posses', 'sion ', 'of a ', 'good ', 'fortune', ', ', 'must be ', 'in ', 'want of ', 'a ', 'wife', '.']
4.2 WordPiece 토크나이저
- pre_tokenizer는 토크나이저의 초기 설정을 정해줍니다.
- Whitespace는 공백을 기준으로 텍스트를 분리합니다.
- [UNK]는 "Unknown Token"을 의미하는 특수 토큰입니다. 자연어 처리에서 토크나이저가 학습 데이터셋에서 미리 정의된 어휘(vocabulary)에 없는 단어를 만났을 때, 이를 대체하는 데 사용됩니다.
from tokenizers import Tokenizer
from tokenizers.models import WordPiece
from tokenizers.pre_tokenizers import Whitespace
from tokenizers.trainers import WordPieceTrainer
# WordPiece 모델 생성 및 [UNK] 토큰 추가
tokenizer = Tokenizer(WordPiece(unk_token="[UNK]"))
tokenizer.pre_tokenizer = Whitespace()
# WordPiece 트레이너 생성
trainer = WordPieceTrainer(vocab_size=20000, min_frequency=2)
# 훈련 파일 목록: 파일 경로를 리스트로 제공
train_files = ['pride_and_prejudice.txt']
# 훈련 실행
tokenizer.train(train_files, trainer)
text = "It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife."
output = tokenizer.encode(text)
print(output.tokens)
['It', 'is', 'a', 'truth', 'universally', 'acknowledged', ',', 'that', 'a', 'single', 'man', 'in', 'possession', 'of', 'a', 'good', 'fortune', ',', 'must', 'be', 'in', 'want', 'of', 'a', 'wife', '.']
5. 사전 학습된 토크나이저
사전 학습된 토크나이저(Pre-trained Tokenizers)는 특정 언어 데이터셋에서 미리 학습되어, 어휘집합과 토크나이징 규칙이 이미 설정된 상태로 제공됩니다. 이러한 토크나이저는 복잡한 설정이나 추가 학습 과정 없이 바로 이를 활용하여 텍스트를 토크나이징할 수 있습니다.
사전학습된 토크나이저를 사용하려는 경우, transformers라이브러리를 사용할 수 있습니다.
from transformers import GPT2Tokenizer
# GPT-2 사전학습된 토크나이저 로드
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
# 테스트 텍스트
text = "The quick brown fox jumps over the lazy dog"
# 텍스트를 토크나이징
encoded_input = tokenizer.encode(text)
tokens = tokenizer.convert_ids_to_tokens(encoded_input)
print("Encoded Input:", encoded_input)
print("Tokens:", tokens)
Encoded Input: [464, 2068, 7586, 21831, 18045, 625, 262, 16931, 3290]
Tokens: ['The', 'Ġquick', 'Ġbrown', 'Ġfox', 'Ġjumps', 'Ġover', 'Ġthe', 'Ġlazy', 'Ġdog']
'딥러닝 > 딥러닝: 자연어 처리' 카테고리의 다른 글
임베딩(Embedding) (0) | 2025.02.25 |
---|---|
AlexNet (2012) (0) | 2025.02.25 |
LeNet-5 (1998) (0) | 2025.02.24 |
자연어 데이터 전처리 (0) | 2025.02.13 |
자연어 처리 개요 (1) | 2025.02.13 |