0. 전처리 필요성 요약
- 자연어 → 형식 언어 변환 필요
- 과정: 정규화 → 토큰화 → 불용어 제거 → 벡터화
- 인공지능 입력은 결국 숫자 벡터 형태
1. 문장 나누기
- 영어: 띄어쓰기만으로 단어 구분 가능
- 예: "LOL, that was sooo funny 😂" → "laughing out loud that was so funny"
- 한국어: 띄어쓰기만으로 의미 단위 구분 어려움 → 형태소 분석 필요
- 예: "한나는 책을 보았다"
- 자립형태소: 한나, 책
- 의존형태소: 가, 을, 보, 았, 다
- 예: "한나는 책을 보았다"
2. 토큰화(Tokenization) 정의
- 토큰(Token): 자연어 처리에서 집중하는 최소 의미 단위
- 언어학: 최소 의미 단위
- NLP: 연산 단위
- 영어: 띄어쓰기 단위 → 어절 사용
- 한국어: 조사·어미 존재 → 형태소 단위 필요
- 토큰화(Tokenization): 문장·문서를 토큰 단위로 변환하는 과정
3. 토큰화 방법
(1) Rule-based Tokenization
- 개념: 사람이 정의한 명시적 규칙(띄어쓰기, 구두점 등)에 따라 분리
- 예시 규칙
- 공백/띄어쓰기 기준
- 구두점 기준
- 장점
- 구현 간단
- 소규모·구조화된 데이터 적합
- 단점
- 규칙 모두 반영 어려움
- 줄임말·신조어 추가 시 수정 필요
- 한국어처럼 복잡한 언어에는 한계
- OOV(Out-of-Vocabulary) 문제
OOV 문제
- 어휘집에 없는 단어 → unknown 처리
- 예: “서울한강뷰맛집”, “저메추”
- 해결: 사람이 사전 정의하지 말고 데이터 기반 동적 정의
(2) Subword Tokenization
- 제안 동기: OOV 문제 해결 위해 단어보다 작은 단위 분리
- 특징
- 신조어/희귀어도 처리 가능
- 예: Barack Obama → ["Barack","Obama"] → 문자 단위 처리 가능
- 예: Abwasserbehandlungsanlage → 부분 단위 번역
- 예: claustrophobia → 규칙적 철자 대응
- 필요성: 데이터 기반 어휘집 생성 가능
(2-1) BPE (Byte Pair Encoding)
개념
- 빈도 기반 병합 방식
- 데이터 압축 기술에서 유래 (Gage, 1994)
- 자주 등장하는 문자쌍을 병합
- Rule-based가 아닌 Data-driven
핵심 아이디어
- 문자부터 시작해 점진적으로 병합 → 어휘집 구축
- 자주 쓰이는 단어: 짧은 기호 하나
- 드문 단어: 여러 subword로 표현
- 고정된 어휘집 크기 유지
알고리즘 (학습 단계)
- 초기화: 단어 → 문자 단위 분해
- 모든 문자쌍(pair) 빈도 계산
- 가장 빈도 높은 쌍 병합
- 지정된 횟수만큼 반복 (merge operations = 하이퍼파라미터)
- 최종 어휘집 = 문자 집합 + 병합된 subword 집합
➡ 병합 규칙 목록(merge operations) 생성

알고리즘 (토큰화 단계): 새로운 단어를 서브워드로 분해
- 초기화: 문자 단위 분해
- low → l o w <\w>
- 학습된 병합 규칙 순서대로 적용
- Greedy하게규칙을적용해가능한긴서브워드를만들어가는과정
- l o w e r <\w> → lo w e r <\w> → low e r <\w> → low er <\w> → low er<\w>
- 새로운 단어 → 기존 규칙으로 분리
- 최악의 경우 문자 단위 처리 (그마저 없으면 Unknown)
코드 예시
from tokenizers import Tokenizer, models, trainers, pre_tokenizers
tokenizer = Tokenizer(models.BPE()) ##BPE모델정의
tokenizer.pre_tokenizer = pre_tokenizers.Whitespace()
## Pre-tokenization: Whitespace 기준으로쪼갬
trainer = trainers.BpeTrainer(vocab_size=5000, show_progress=True)
tokenizer.train(["corpus.txt"], trainer) ## Lexicon 생성
장점
- 희귀 단어 처리 (OOV 최소화)
- 형태소 분석 불필요
- 압축적 표현 가능: 자주 등장하는 단어는 짧게 표현
- 데이터 기반 학습: 사람의 개입 없음
- GPT 사례: UTF-8 바이트 기반 토큰화
단점
- 형태 기반 분해: 의미 왜곡 가능
- 계산 오래 걸림
- 하이퍼파라미터 의존
- 교착어나 복잡한 형태소 구조 언어(e.g. 한국어)에서 한계 존재
- 사람이 해석하기 어려움
(2-2) WordPiece
핵심 아이디어
- BPE: 단순 빈도
- WordPiece: 언어모델 확률(likelihood) 기반 → BERT 사용
- 패턴을 더 잘 반영
- 접두사/접미사 구분: ## 사용
알고리즘 (학습 단계)
- 초기화: 단어 → 문자 단위
- 병합후보 탐색: 모든 인접 쌍을 대상으로, 해당 쌍을 병합했을때likelihood 개선정도 계산
- Likelihood 높은 쌍 병합
- 지정된 횟수만큼 반복 (merge operations 수= 하이퍼파라미터)
- 최종어휘집= 문자 집합+ 병합된 서브워드 집합
→ 병합규칙 목록 (merge operations) 정의
코드 예시
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
tokens = tokenizer.tokenize("unaffordable")
print(tokens)
# ['un','##aff','##ord','##able']
알고리즘 (토큰화 단계): 새로운 단어를 서브워드로 분해
- 초기화(Initialization): 모든 단어를 문자단위로 분해
- low → l o w
- 학습된 병합규칙을 순서대로 적용
- Greedy하게 규칙을 적용해 가능한 긴 서브워드를 만들어가는 과정
- l o w e r → low, ##er
- 새로운 입력단어가 들어오면, 학습된 규칙을 적용하여 가능한 긴 서브워드 단위로 토큰화 진행
- 최악의 경우 문자단위로 처리가능 (그마저없으면Unknown)
BPE vs WordPiece
- 공통점: 문자 단위 시작 → 자주 등장하는 쌍 병합 → OOV 해결
- 차이점
- BPE: 빈도 기반
- WordPiece: likelihood 기반
- BPE: <\w> (단어 종료)
- WordPiece: ## (subword continuation)
- WordPiece 장점: 접두사/접미사등 언어친화적 단위선호
- 단점: 계산량 ↑, 복잡 → 최근모델에서는 주로BPE 사용
(2-3) SentencePiece
핵심 아이디어
- 기존 BPE/WordPiece: 공백 단어 전처리에 의존
- 단어 단위를 먼저 쪼개고 그 안에서 subword 학습
- 중국어나 일본어 등 공백이 없는 문자에서 문제 발생
- SentencePiece:
- 언어 독립적(language-independent) 토크나이저
- 중국어·일본어 등 공백 없는 언어도 처리 가능
- 공백도 학습 대상에 포함: _로 치환하여 단어 경계를 표현
- Subword 학습 시 단어 경계도 직접 학습
(2-4) 한국어 토크나이저
- 한국어 = 조사/어미 존재 → 토큰화 어려움
- 접근 방법
- 언어학적: 형태소 분석 기반 (Mecab, Komoran, Okt 등)
- 데이터 중심: Subword 기반 (BPE, WordPiece, SentencePiece)

4. 후속 처리
(1) Lemmatization (표제어 추출)
- 정의: 단어의 기본 사전형 의미(표제어: Lemma)로 변환
- 예: am, are, is → be
- 사전 + 품사 정보 활용
- 정확하지만 느림
(2) Stemming (어간 추출)
- 정의: 단어의 의미 핵심(어간: Stem)만 남기기
- 접사 제거, 단순화
- 예: studies → studi, studying → study
- Porter 알고리즘 (1980)
(3) Stemming vs Lemmatization
- Stemming: 의미 고려 없이 접사 자름 → 빠르지만 부정확
- Lemmatization: 사전·품사 기반 → 정확하지만 느림
(4) 한국어 유의점
- 규칙 활용: 어간 일정 → 단순 분리 가능
- 불규칙 활용: 어간 모양 변함 (긋다 → 긋고, 그어라)
(5) Stopwords (불용어 제거)
- 의미 없는 단어 제거 (is, the, 은, 는)
- 자주 등장하지만 분석을 하는데있어 별 도움이 되지않는 단어들
- 효율 ↑, 의미 손실 우려
- 현대 LLM에서는 잘 사용 X

5. 정규표현식 (Regular Expression)
정의
- 문자열에서 특정 패턴 찾고 변환하는 형식 언어
주요 기능
- 검색(Search): 특정 규칙에 맞는 문자열찾기 (e.g. 이메일, URL)
- 추출(Extract): 원하는 부분만 잘라내기 (e.g. 숫자만추출)
- 치환(Replace): 규칙에 맞는 부분을 다른 문자로 바꾸기 (e.g. 전화번호 마스킹)
파이썬 모듈 함수

활용 예시
- 이메일: r'\\w+@\\w+\\.\\w+'
- 숫자 추출: r'[0-9]+'
- 특수문자 제거: re.sub(r'[^A-Za-z0-9 ]+', '', text)
- NLTK RegexpTokenizer: 패턴 기반 토큰화
6. 벡터화 (Vectorization)
정의
- 텍스트 토큰 → 고정 차원 숫자 벡터 변환
- 자연어 → 수학적 표현 → 모델 입력
아이디어
- 토큰 각각이 고차원 공간의 벡터로 매핑됨
- 유사한 의미를 가진 단어는 가까운 벡터로 표현
✅ 최종 요약 암기 포인트
- Rule-based: 간단, OOV 문제 심각
- Subword
- BPE: 빈도 기반, GPT 사용
- WordPiece: likelihood 기반, BERT 사용
- SentencePiece: 공백 포함, 언어 독립적
- 한국어: 형태소 분석 + Subword 혼용
- 후속 처리: Lemmatization vs Stemming, Stopwords
- Regex: 패턴 기반 검색·추출·치환
- Vectorization: 숫자 벡터로 변환 → 모델 입력
'자연어처리' 카테고리의 다른 글
| 3w-텍스트 전처리 (벡터화) (0) | 2025.09.21 |
|---|---|
| 2w: 전처리1(정규화) (0) | 2025.09.21 |
| 1w-자연어처리소개 (0) | 2025.09.21 |