728x90
반응형
텍스트 전처리 (Preprocessing)
- 텍스트를 모델이 이해할 수 있는 형태로 변환하는 과정
- 텍스트를 정제하여 학습 데이터 불균형을 방지하고 성능 저하를 막음
- 학습과 테스트 과정 모두 사용
- 모델을 평가할 때, 학습 데이터와 동일한 방식으로 전처리해야 일관된 결과가 나옴
- 딥 러닝 모델 사용 여부에 따라 전처리 정도가 달라질 수는 있으나, 전통적인 NLP 방식과 딥 러닝 기반의 NLP 방식 모두에서 전처리는 중요한 과정
텍스트 전처리의 주요 단계
- 텍스트 정제 (Cleaning)
- HTML 태그, 이모지, 특수문자 제거
- ex. "<p>Hello!</p>" → "Hello!"
- 토큰화 (Tokenization)
- 문장을 단어 또는 서브워드 단위로 분리
- ex. "I love NLP!" → ["I", "love", "NLP", "!"]
- 정규화 (Normalization)
- 소문자 변환, 특수문자 제거, 숫자 변환, Stemming & Lemmatization 포함
- 불용어 제거 (Stopword Removal)
- "is", "the", "in" 같은 의미 없는 단어 제거
- ex. "I am a student" → "student"
- 어휘 사전 구축 (Vocabulary Construction)
- 중복을 제거한 고유 단어 리스트 생성
- 인코딩 및 변환 (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 등) 으로 측정
- 어절 개수 (한국어): 한국어에서는 띄어쓰기 단위의 어절 개수로 크기를 측정하기도 함
- ex.
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
반응형