2w: 전처리2(토큰화)

2025. 9. 21. 14:08·자연어처리

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로 표현
  • 고정된 어휘집 크기 유지

알고리즘 (학습 단계)

  1. 초기화: 단어 → 문자 단위 분해
  2. 모든 문자쌍(pair) 빈도 계산
  3. 가장 빈도 높은 쌍 병합
  4. 지정된 횟수만큼 반복 (merge operations = 하이퍼파라미터)
  5. 최종 어휘집 = 문자 집합 + 병합된 subword 집합

➡ 병합 규칙 목록(merge operations) 생성

알고리즘 (토큰화 단계): 새로운 단어를 서브워드로 분해

  1. 초기화: 문자 단위 분해
    1. low → l o w <\w>
  2. 학습된 병합 규칙 순서대로 적용
    1. Greedy하게규칙을적용해가능한긴서브워드를만들어가는과정
    2. l o w e r <\w> → lo w e r <\w> → low e r <\w> → low er <\w> → low er<\w>
  3. 새로운 단어 → 기존 규칙으로 분리
  4. 최악의 경우 문자 단위 처리 (그마저 없으면 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 사용
  • 패턴을 더 잘 반영
  • 접두사/접미사 구분: ## 사용

알고리즘 (학습 단계)

  1. 초기화: 단어 → 문자 단위
  2. 병합후보 탐색: 모든 인접 쌍을 대상으로, 해당 쌍을 병합했을때likelihood 개선정도 계산
  3. Likelihood 높은 쌍 병합
  4. 지정된 횟수만큼 반복 (merge operations 수= 하이퍼파라미터)
  5. 최종어휘집= 문자 집합+ 병합된 서브워드 집합

→ 병합규칙 목록 (merge operations) 정의

코드 예시

from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
tokens = tokenizer.tokenize("unaffordable")
print(tokens)
# ['un','##aff','##ord','##able']

알고리즘 (토큰화 단계): 새로운 단어를 서브워드로 분해

  1. 초기화(Initialization): 모든 단어를 문자단위로 분해
    1. low → l o w
  2. 학습된 병합규칙을 순서대로 적용
    1. Greedy하게 규칙을 적용해 가능한 긴 서브워드를 만들어가는 과정
    2. 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) 한국어 토크나이저

  • 한국어 = 조사/어미 존재 → 토큰화 어려움
  • 접근 방법
    1. 언어학적: 형태소 분석 기반 (Mecab, Komoran, Okt 등)
    2. 데이터 중심: 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)

정의

  • 텍스트 토큰 → 고정 차원 숫자 벡터 변환
  • 자연어 → 수학적 표현 → 모델 입력

아이디어

  • 토큰 각각이 고차원 공간의 벡터로 매핑됨
  • 유사한 의미를 가진 단어는 가까운 벡터로 표현

✅ 최종 요약 암기 포인트

  1. Rule-based: 간단, OOV 문제 심각
  2. Subword
    • BPE: 빈도 기반, GPT 사용
    • WordPiece: likelihood 기반, BERT 사용
    • SentencePiece: 공백 포함, 언어 독립적
    • 한국어: 형태소 분석 + Subword 혼용
  3. 후속 처리: Lemmatization vs Stemming, Stopwords
  4. Regex: 패턴 기반 검색·추출·치환
  5. Vectorization: 숫자 벡터로 변환 → 모델 입력 

'자연어처리' 카테고리의 다른 글

3w-텍스트 전처리 (벡터화)  (0) 2025.09.21
2w: 전처리1(정규화)  (0) 2025.09.21
1w-자연어처리소개  (0) 2025.09.21
'자연어처리' 카테고리의 다른 글
  • 3w-텍스트 전처리 (벡터화)
  • 2w: 전처리1(정규화)
  • 1w-자연어처리소개
samsam031
samsam031
samsam031 님의 블로그 입니다.
  • samsam031
    samsam031 님의 블로그
    samsam031
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 디지털포렌식
      • 드림핵 문제풀이
      • 대외활동
      • 개발 실습
      • 컴퓨터 보안
      • 클라우드
      • 자격증
      • 자연어처리
      • 백엔드
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
samsam031
2w: 전처리2(토큰화)
상단으로

티스토리툴바