본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] 텍스트 데이터 전처리 5단계 순서와 자연어 처리 해결 방법

by Papa Martino V 2026. 4. 12.
728x90

텍스트 데이터 전처리
텍스트 데이터 전처리

 

자연어 처리(NLP) 프로젝트의 성패는 모델의 복잡도가 아니라 '데이터의 청결도'에서 결정됩니다. 정제되지 않은 텍스트는 컴퓨터에게 그저 의미 없는 노이즈에 불과합니다. 사람이 언어를 이해하듯 기계가 문맥을 파악하게 만들려면, 일정한 규칙에 따른 전처리 파이프라인 구축이 필수적입니다. 본 가이드에서는 파이썬을 활용한 텍스트 데이터 전처리의 표준 순서와 각 단계별 차이를 명확히 구분하여 실무적인 해결 방법을 제시합니다.


1. 텍스트 데이터 전처리 표준 프로세스 및 기법 비교

전처리는 단순히 불필요한 문자를 지우는 작업이 아닙니다. 데이터의 손실을 최소화하면서도 모델이 학습하기 가장 좋은 형태로 벡터화(Vectorization)하기 위한 준비 과정입니다. 가장 효율적인 5단계 순서를 정리했습니다.

텍스트 전처리 단계별 핵심 비교 및 요약

단계 주요 작업 내용 사용 라이브러리 기대 효과
1. 클렌징 (Cleansing) HTML 태그, 특수문자, 이메일 등 제거 re (정규표현식), BeautifulSoup 데이터 노이즈 최소화
2. 토큰화 (Tokenization) 문장을 단어 또는 형태소 단위로 분리 NLTK, SpaCy, KoNLPy 분석 단위 수립
3. 정규화 (Normalization) 대소문자 통합, 어간 추출, 표제어 추출 NLTK (Stemmer, Lemmatizer) 단어의 원형 복원
4. 불용어 제거 (Stopwords) 의미 없는 관사, 조사, 빈번한 단어 제거 NLTK Stopwords List 핵심 키워드 집중
5. 어휘 사전 구축 희소 단어 제거 및 인덱싱 Tensorflow, Scikit-learn 수치형 벡터 변환 준비

2. 실무 즉시 적용 가능한 파이썬 NLP 전처리 Example 7선

다양한 환경에서 마주하게 될 텍스트 노이즈를 해결하기 위한 파이썬 코드들입니다. 각 예제는 실무 파이프라인의 구성 요소로 바로 삽입 가능합니다.

Example 1: 정규표현식을 활용한 노이즈 제거 (Cleaning)

import re

def clean_text(text):
    # HTML 태그 제거
    text = re.sub(r'<[^>]*>', '', text)
    # 이메일 주소 제거
    text = re.sub(r'[a-zA-Z0-9+_.-]+@[a-zA-Z0-9.-]+', '', text)
    # 특수문자 및 숫자 제거 (한글/영문만 남김)
    text = re.sub(r'[^가-힣a-zA-Z\s]', '', text)
    return text.strip()

raw_data = "Contact us at support@example.com! <h1>Hello Python 123</h1>"
print(clean_text(raw_data)) # 결과: "Contact us at Hello Python"

Example 2: NLTK를 이용한 영문 단어 토큰화

import nltk
from nltk.tokenize import word_tokenize
# nltk.download('punkt') # 최초 실행 시 필요

sentence = "Data Science is an exciting field of Python."
tokens = word_tokenize(sentence)
print(tokens) # ['Data', 'Science', 'is', 'an', 'exciting', 'field', 'of', 'Python', '.']

Example 3: 한국어 형태소 분석 (KoNLPy/Okt)

from konlpy.tag import Okt

okt = Okt()
text = "파이썬 전처리는 정말 재미있어요!"
# stem=True 옵션으로 동사 원형 추출 가능
print(okt.morphs(text, stem=True)) 
# ['파이썬', '전처리', '는', '정말', '재미있다', '!']

Example 4: 표제어 추출 (Lemmatization) - 단어 원형 찾기

from nltk.stem import WordNetLemmatizer
# nltk.download('wordnet')

lemmatizer = WordNetLemmatizer()
words = ['rocks', 'corpora', 'better', 'running']
lemmas = [lemmatizer.lemmatize(w, pos='v') for w in words]
print(lemmas) # ['rock', 'corpus', 'good', 'run']

Example 5: 불용어(Stopwords) 제거 해결 방법

from nltk.corpus import stopwords

stop_words = set(stopwords.words('english'))
words = ["This", "is", "a", "sample", "sentence", "with", "unnecessary", "words"]
filtered_sentence = [w for w in words if not w.lower() in stop_words]
print(filtered_sentence) # ['sample', 'sentence', 'unnecessary', 'words']

Example 6: 희소 단어 제거 (Rare Words Filtering)

from collections import Counter

# 빈도수가 1회인 단어는 노이즈일 확률이 높음
corpus = ["apple", "banana", "apple", "cherry", "banana", "unique_word"]
counts = Counter(corpus)
vocab = [w for w, c in counts.items() if c > 1]
print(vocab) # ['apple', 'banana']

Example 7: 정수 인코딩 (Integer Encoding)

from tensorflow.keras.preprocessing.text import Tokenizer

sentences = ['I love python', 'python is easy and great']
tokenizer = Tokenizer()
tokenizer.fit_on_texts(sentences)
encoded = tokenizer.texts_to_sequences(sentences)
print(encoded) # [[1, 2, 3], [3, 4, 5, 6, 7]]

3. 텍스트 전처리 시 주의해야 할 핵심 해결책

  1. 도메인별 특화 사전 활용: 일반적인 불용어 사전 외에도 비즈니스 도메인(예: 의료, 법률, 금융)에서만 통용되는 핵심 키워드가 삭제되지 않도록 사용자 정의 사전을 구축해야 합니다.
  2. 어간 추출(Stemming) vs 표제어 추출(Lemmatization) 선택: 속도가 중요하다면 Stemming을, 단어의 문법적 의미와 정확한 원형 보존이 중요하다면 Lemmatization을 선택하는 것이 방법입니다.
  3. 일관성 있는 정규화: 'Apple', 'apple', 'APPLE'을 다른 단어로 인식하면 모델의 차원이 불필요하게 늘어납니다. 반드시 소문자 변환(Lowercasing)을 선행하십시오.

4. 결론: 깨끗한 데이터가 최고의 알고리즘입니다

전처리는 지루하고 반복적인 작업처럼 보일 수 있지만, 전체 NLP 프로젝트 시간의 80% 이상을 할애해야 하는 가장 가치 있는 과정입니다. 파이썬의 강력한 라이브러리들을 활용하여 데이터의 노이즈를 제거하고 유의미한 패턴을 추출하는 파이프라인을 설계해 보세요. 결국 모델의 성능을 결정하는 것은 하이퍼파라미터 튜닝이 아니라 여러분이 정제한 한 줄의 텍스트 데이터입니다.

 

내용 출처: 1. NLTK Official Documentation (nltk.org)

                2. SpaCy Usage Guides (spacy.io)

                3. Python Machine Learning (Sebastian Raschka)

728x90