정제와 정규화, 텍스트 전처리를 가르는 갈림길

코퍼스 노이즈를 없애는 정제와 표현이 다른 동의어를 하나로 묶는 정규화를 어간 추출·표제어 추출·정규표현식 예제로 정리한다

2026-08-14 · 최초 발행 2025-05-23

텍스트 데이터 분석과 자연어 처리에서 분석 품질을 가르는 것은 대개 모델이 아니라 전처리다. 정제(Cleaning)와 정규화(Normalization)는 그 전처리에서 가장 먼저 거치는 두 단계이자, 결과의 일관성을 결정짓는 단계다.

노이즈를 걷어내는 정제

정제는 코퍼스(말뭉치)에서 분석에 방해가 되는 노이즈 데이터를 제거하는 과정이다. 정제 대상에는 !@#$%^&*() 같은 분석에 불필요한 특수문자, 'the', 'is', 'at', 'which'처럼 의미 분석에 크게 기여하지 않는 불용어(Stopwords), 전체 코퍼스에서 등장 빈도가 특정 임계값 이하인 저빈도 단어, 영어 기준 2-3자 이하의 짧은 길이 단어가 포함된다.

정제 작업은 주로 정규표현식(Regular Expression)을 활용해 수행한다.

import re

# 특수문자 제거 예시
text = "Hello, World! This is a sample text with special characters: @#$%."
cleaned_text = re.sub(r'[^\w\s]', '', text)
print(cleaned_text)  # "Hello World This is a sample text with special characters"

# 불용어 제거 예시
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize

stop_words = set(stopwords.words('english'))
tokens = word_tokenize(cleaned_text)
filtered_tokens = [word for word in tokens if word.lower() not in stop_words]
print(filtered_tokens)  # ['Hello', 'World', 'sample', 'text', 'special', 'characters']

금융 시장 분석을 위해 뉴스 기사 텍스트를 처리하는 경우를 보면 정제의 효과가 분명하다.

원본 텍스트: "삼성전자(005930)는 오늘 신제품을 출시했다. 이에 주가가 3.5% 상승했다!!!"
정제 후: "삼성전자 오늘 신제품 출시 주가 3.5 상승"

증권코드, 조사, 특수문자 등 불필요한 정보를 제거하면 핵심 정보만 남는다.

표현은 달라도 뜻이 같은 것을 정규화로 묶는다

정규화는 표현 방법이 다르지만 본질적으로 같은 의미를 가진 단어들을 하나의 표준 형태로 통합하는 과정이다. USA, U.S.A., US처럼 표기법이 다른 동일 개체를 하나로 통일하는 표기 통합(예: 삼성전자, 삼성 전자, 삼성 → 삼성전자), 고유명사를 제외하고 텍스트를 소문자로 변환하는 대소문자 통합이 기본이다.

text = "New York Times reported that Apple Inc. has launched a New Product."
normalized_text = text.lower()
print(normalized_text)  # "new york times reported that apple inc. has launched a new product."

여기서 한 걸음 더 들어가면 어간 추출(Stemming)과 표제어 추출(Lemmatization)이 나온다. 어간 추출은 단어의 어간(stem)만 추출해 다양한 변형을 기본 형태로 축소한다.

from nltk.stem import PorterStemmer

stemmer = PorterStemmer()
words = ["jumping", "jumps", "jumped", "jump"]
stemmed_words = [stemmer.stem(word) for word in words]
print(stemmed_words)  # ['jump', 'jump', 'jump', 'jump']

표제어 추출은 단어의 기본 사전형(lemma)으로 변환하며, 어간 추출보다 언어학적으로 정확한 결과를 준다.

from nltk.stem import WordNetLemmatizer

lemmatizer = WordNetLemmatizer()
words = ["better", "running", "says", "mice"]
lemmatized_words = [lemmatizer.lemmatize(word) for word in words]
print(lemmatized_words)  # ['better', 'running', 'say', 'mouse']

감성 분석·클러스터링·검색에서 정제와 정규화가 하는 일

감성 분석(Sentiment Analysis)은 텍스트에서 감정을 추출하는 NLP 기술이다. 정제와 정규화가 제대로 수행되지 않으면 정확도가 떨어진다.

원본 텍스트: "I LOVED this movie!!! It's sooooo good... The actors were AMAZING!!!" 정제 및 정규화 후: "love movie good actor amazing"

이러한 처리를 거치면 감성 분석 알고리즘이 긍정적 감정을 더 정확하게 검출할 수 있다.

유사한 문서를 그룹화하는 문서 클러스터링에서도 정제와 정규화는 필수 단계다.

원본 데이터정제정규화특성 추출클러스터링 알고리즘결과 분석

검색 엔진 최적화(SEO)에서는 검색어와 웹 페이지 콘텐츠 간의 일치도를 계산할 때 정제와 정규화를 거친다. 검색어 "best running shoes"와 웹 페이지 내용 "Top 10 Best Running Shoes for Marathon Runners"를 정제·정규화하면 "best", "running", "shoes"가 일치함을 확인하고 관련성 점수를 매길 수 있다.

N-gram과 정규표현식으로 더 정교하게

단일 단어가 아니라 연속된 N개 단어 묶음을 기준으로 정규화하면 "New York"과 같은 고유명사를 하나의 단위로 처리할 수 있다.

from nltk import ngrams

sentence = "New York is a beautiful city"
bigrams = list(ngrams(sentence.split(), 2))
print(bigrams)  # [('New', 'York'), ('York', 'is'), ('is', 'a'), ('a', 'beautiful'), ('beautiful', 'city')]

정규표현식은 이메일 주소나 숫자처럼 패턴이 뚜렷한 대상을 추출·정제하는 데 쓴다.

# 이메일 주소 추출
import re
text = "Contact us at support@example.com or admin@example.org"
emails = re.findall(r'[\w\.-]+@[\w\.-]+', text)
print(emails)  # ['support@example.com', 'admin@example.org']

# 한국어 텍스트에서 숫자만 추출
korean_text = "총 비용은 3,450,000원이며, 할인가는 2,760,000원입니다."
numbers = re.findall(r'[\d,]+', korean_text)
print(numbers)  # ['3,450,000', '2,760,000']

도메인이 좁혀지면 정규화 규칙도 도메인에 맞춰야 한다. 의학 분야라면 의학 용어 사전을 활용한 정규화가 필요하다.

# 가상의 의학 용어 정규화 예시
medical_terms = {
    "MI": "myocardial infarction",
    "CAD": "coronary artery disease",
    "HTN": "hypertension"
}

text = "Patient diagnosed with MI and HTN."
for abbr, full_term in medical_terms.items():
    text = text.replace(abbr, full_term)
print(text)  # "Patient diagnosed with myocardial infarction and hypertension."

한국어는 조사와 어미가 변수다

한국어는 영어와 달리 조사, 어미 등의 문법적 요소가 복잡해 정제와 정규화 과정에 추가 고려사항이 붙는다.

# 한국어 불용어 처리
korean_stopwords = ['은', '는', '이', '가', '을', '를', '의', '에', '에서', '으로']
text = "자연어 처리는 컴퓨터 과학의 중요한 분야이다."
tokens = text.split()
filtered_tokens = [word for word in tokens if not any(stop in word for stop in korean_stopwords)]
print(filtered_tokens)  # ['자연어', '처리', '컴퓨터', '과학', '중요한', '분야이다.']

형태소 분석기를 쓰면 정규화도 한 단계 더 들어갈 수 있다.

# 한국어 형태소 분석을 통한 정규화
from konlpy.tag import Okt

okt = Okt()
text = "아버지가 방에 들어가신다."
morphs = okt.morphs(text)
print(morphs)  # ['아버지', '가', '방', '에', '들어가', '신다', '.']

pos = okt.pos(text)
print(pos)  # [('아버지', 'Noun'), ('가', 'Josa'), ('방', 'Noun'), ('에', 'Josa'), ('들어가', 'Verb'), ('신다', 'Suffix'), ('.', 'Punctuation')]

nouns = okt.nouns(text)
print(nouns)  # ['아버지', '방']

정제와 정규화는 분석 성능과 정확도를 가르는 핵심 과정이며, 도메인과 목적에 맞는 전략 선택이 중요하다. 딥러닝 기반 NLP 모델도 전처리 품질에 크게 영향을 받기 때문에, 체계적인 정제·정규화 파이프라인을 갖추는 것이 정확하고 가치 있는 인사이트로 이어진다.

텍스트 정제정규화어간 추출표제어 추출자연어처리