AI/NLP

NLP 간단 정리

dragonhyeon 2025. 2. 11. 15:10
728x90
반응형

텍스트 전처리 (Preprocessing)

  • 텍스트를 모델이 이해할 수 있는 형태로 변환하는 과정
  • 텍스트를 정제하여 학습 데이터 불균형을 방지하고 성능 저하를 막음
  • 학습과 테스트 과정 모두 사용
    • 모델을 평가할 때, 학습 데이터와 동일한 방식으로 전처리해야 일관된 결과가 나옴
  • 딥 러닝 모델 사용 여부에 따라 전처리 정도가 달라질 수는 있으나, 전통적인 NLP 방식과 딥 러닝 기반의 NLP 방식 모두에서 전처리는 중요한 과정

텍스트 전처리의 주요 단계

  1. 텍스트 정제 (Cleaning)
    • HTML 태그, 이모지, 특수문자 제거
    • ex. "<p>Hello!</p>" → "Hello!"
  2. 토큰화 (Tokenization)
    • 문장을 단어 또는 서브워드 단위로 분리
    • ex. "I love NLP!" → ["I", "love", "NLP", "!"]
  3. 정규화 (Normalization)
    • 소문자 변환, 특수문자 제거, 숫자 변환, Stemming & Lemmatization 포함
  4. 불용어 제거 (Stopword Removal)
    • "is", "the", "in" 같은 의미 없는 단어 제거
    • ex. "I am a student" → "student"
  5. 어휘 사전 구축 (Vocabulary Construction)
    • 중복을 제거한 고유 단어 리스트 생성
  6. 인코딩 및 변환 (Encoding & Transformation)
    • 텍스트 데이터를 숫자로 변환 (BoW, TF-IDF, Word Embeddings 등)
  • ex.
import re
import nltk
import spacy
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.stem import PorterStemmer
from nltk.stem import WordNetLemmatizer

# NLTK 리소스 다운로드 (최초 실행 시 필요)
nltk.download('punkt')
nltk.download('stopwords')
nltk.download('wordnet')

# 1. 예제 텍스트
text = "I am loving NLP!! It's the best field ever. Running, ran, runs!"

# 2. 소문자 변환
text = text.lower()

# 3. 특수문자 및 구두점 제거
text = re.sub(r"[^\w\s]", "", text)  # 문자와 공백을 제외한 모든 특수문자 제거

# 4. 토큰화 (단어 단위)
tokens = word_tokenize(text)

# 5. 불용어 제거 (Stopwords)
stop_words = set(stopwords.words('english'))
tokens = [word for word in tokens if word not in stop_words]

# 6. 어간 추출 (Stemming)
stemmer = PorterStemmer()
stemmed_tokens = [stemmer.stem(word) for word in tokens]

# 7. 표제어 추출 (Lemmatization)
lemmatizer = WordNetLemmatizer()
lemmatized_tokens = [lemmatizer.lemmatize(word) for word in tokens]

# 8. 결과 출력
print("원본 문장:", text)
print("토큰화:", tokens)
print("어간 추출(Stemming):", stemmed_tokens)
print("표제어 추출(Lemmatization):", lemmatized_tokens)
from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
tokens = tokenizer.tokenize("I am loving NLP!! It's the best field ever. Running, ran, runs!")
print("BERT 토큰화:", tokens)

토큰 (Token)

  • 자연어 문장에서 의미를 가지는 최소 단위
  • 단어, 형태소, 서브워드 등 다양한 기준으로 정의될 수 있음
  • ex. 문장: "I love NLP!"
    • 단어 기반 토큰화: ["I", "love", "NLP", "!"]
    • 서브워드 기반 토큰화 (BPE, WordPiece 등): ["I", "lov", "e", "NLP", "!"]
    • 형태소 분석 기반 토큰화 (한국어): ["나", "는", "NLP", "를", "좋아", "하", "ᆫ다"]

토크나이저 (Tokenizer)

  • 문장을 토큰 단위로 분리하는 역할을 하는 도구

정규화 (Normalization)

  • 텍스트의 형태를 표준화하는 과정
    • 텍스트의 의미를 그대로 유지하면서 일관된 형식으로 변환
    • 같은 의미를 가지는 다양한 표현을 표준화하는 것이 정규화의 핵심 목표
    • 불용어 제거는 단순히 단어를 삭제하는 과정이며, 정규화 (형태 변환) 와는 엄연히 다름
  • 분류:
    • 단순 정규화 (Basic Normalization): 소문자 변환, 특수문자 제거 등
    • 의미 기반 정규화 (Lexical Normalization): Stemming & Lemmatization
      • 보통 Stemming 과 Lemmatization 은 함께 사용하지 않고 둘 중 하나를 선택해서 사용
      • 일부 경우에는 Stemming 을 먼저 적용한 후 Lemmatization 을 수행하는 하이브리드 방법이 사용되기도 함

Stemming & Lemmatization

  Stemming Lemmatization
정의 단어의 어미를 단순히 잘라서 어근 (root) 형태로 변환 문법적, 의미적으로 올바른 기본형 (lemma) 으로 변환
처리 방식 규칙 기반 (어미 제거) 사전 기반 (Lexicon 사용)
정확도 낮음 높음
속도 빠름 상대적으로 느림
예시 "studied" → "studi" (단순 어미 제거, 정확도가 낮음) "studied" → "study" (의미를 반영한 원형 변환, 정확도가 높음)

 

Lemma (표제어) 는 단어의 사전적 원형을 의미합니다. Lemmatization 과정에서는 단순한 어미 제거가 아니라, 품사 및 문맥을 고려하여 단어를 원형으로 변환합니다.

  • Stemming
    • 빠르고 단순한 처리가 필요할 때 사용
    • ex.
      • 대규모 텍스트에서 빠른 검색이나 클러스터링이 필요한 경우
      • 검색 엔진 (검색어 확장, 검색 속도 향상)
      • 단순한 텍스트 마이닝 (키워드 기반 감성 분석 등)
  • Lemmatization
    • 정확한 단어 원형이 필요할 때 사용
    • 기계 번역, 챗봇, 자연어 이해 (NLU) 등에서 의미를 정확히 파악해야 할 때 사용
    • ex.
      • 기계 번역, 문법 교정, 문서 요약
      • 챗봇 및 질의응답 시스템
      • 고품질 텍스트 분석 (문서 분류, 의미 분석)

Corpus

  • 자연어 처리에서 모델 학습이나 연구를 위해 수집된 텍스트 데이터의 집합을 의미
  • 코퍼스의 크기 (Corpus Size) 는 여러 가지 기준으로 측정될 수 있음
    • ex.
      • 토큰 (Token) 개수: 코퍼스에 포함된 모든 토큰 (단어) 의 총 개수를 기준으로 함
      • 단어 유형 (Type) 개수: 서로 다른 단어의 개수를 기준으로 함 (중복 단어 제외)
      • 문장 개수: 텍스트의 총 문장 개수를 기준으로 함
      • 바이트 (Byte) 크기: 텍스트 파일의 총 용량 (예: 100MB, 10GB 등) 으로 측정
      • 어절 개수 (한국어): 한국어에서는 띄어쓰기 단위의 어절 개수로 크기를 측정하기도 함

Token Size vs Vocabulary Size

  • Token Size (토큰 개수): 문장에서 등장한 모든 단어의 총 개수
  • Vocabulary Size (어휘 크기): 중복을 제거한 고유한 단어 개수
  • 일반적으로 Vocabulary Size ≤ Token Size 이며, Token Size 는 문서 길이에 따라 커질 수 있음
  • Herdan’s Law (Heaps’ Law)
    • 문서 내 고유한 단어의 개수 \(\mathbf{V}\) 는 전체 단어 수 \(\mathbf{N}\) 에 따라 증가하지만, 선형이 아니라 거듭제곱 법칙을 따름
    • 수식: \(V(N) = k N^\beta \quad\) (여기서 \(\quad 0 < \beta < 1, \quad k\) 는 상수)
    • 즉, 문서가 길어질수록 새로운 단어가 추가되지만 증가율은 점점 둔화됨

N-gram

  • 연속된 \(\mathbf{n}\) 개의 단어 또는 문자 시퀀스를 의미
  • 문장 길이를 넘는 \(\text{n-gram}\) 은 생성할 수 없음
  • ex. 문장: "I love NLP!" (특수문자를 개별 토큰으로 분리하는 경우)
    • Unigram (1-gram): "I", "love", "NLP", "!"
    • Bigram (2-gram): "I love", "love NLP", "NLP !"
    • Trigram (3-gram): "I love NLP", "love NLP !"
    • 4-gram: "I love NLP !"

Edit Distance

  • 두 문자열 간의 유사도를 측정하는 방법으로, 한 문자열을 다른 문자열로 변환하는 데 필요한 최소한의 편집 연산 횟수를 의미
  • 텍스트 변환, 오류 수정, 유사도 기반 검색 등에 활용
  • Edit Distance 를 최소화하는 변환을 찾거나, 유사도가 가장 높은 문장을 선택하는 데 활용
728x90
반응형