머신러닝 텍스트 데이터 전처리 기법: 깔끔한 텍스트로 모델 성능 향상
머신러닝 모델의 성능을 극대화하려면 데이터 전처리는 필수적인 과정이다. 특히 텍스트 데이터는 잡음이 많고, 다양한 형태로 존재하기 때문에 더욱 세심한 전처리가 요구된다. 이 글에서는 텍스트 데이터 전처리에 사용되는 다양한 기법들을 소개하고, 각 기법의 역할과 실제 적용 예시를 살펴본다.
📚 1. 텍스트 데이터 전처리의 중요성 (The Importance of Text Data Preprocessing)
텍스트 데이터는 이미지, 오디오 데이터와 달리 구조화되지 않은 형태(unstructured data)로 존재한다. 자연어의 다양성, 오타, 불필요한 특수문자, 다양한 언어 표현 방식 등은 머신러닝 모델이 텍스트 데이터를 제대로 이해하는 데 방해 요소로 작용한다. 전처리 과정을 통해 이러한 노이즈를 제거하고, 모델이 학습하기 좋은 형태로 데이터를 변환해야 한다. 텍스트 데이터 전처리는 모델의 정확도(accuracy), 정밀도(precision), 재현율(recall) 등 성능 지표 향상에 직접적인 영향을 미친다.
🛠️ 2. 주요 텍스트 데이터 전처리 기법 (Key Text Data Preprocessing Techniques)
텍스트 데이터 전처리에는 다양한 기법이 존재하며, 문제의 특성과 데이터의 성격에 따라 적절한 기법을 선택해야 한다. 다음은 널리 사용되는 주요 기법들이다.
텍스트 정제 (Text Cleaning): 불필요한 문자, HTML 태그 제거
텍스트 정제는 가장 기본적인 전처리 단계로, 데이터에 포함된 불필요한 요소들을 제거하는 과정이다. 예를 들어, HTML 태그, 특수문자, 이모티콘, 줄 바꿈 문자 등은 모델 학습에 도움이 되지 않으므로 제거해야 한다.import re def clean_text(text): # HTML 태그 제거 text = re.sub('<[^>]+>', '', text) # 특수문자 제거 (영문자, 숫자, 공백 제외) text = re.sub('[^a-zA-Z0-9\s]', '', text) return text example_text = "<h1>안녕하세요!</h1> This is a test. :) \n" cleaned_text = clean_text(example_text) print(cleaned_text) # 출력: 안녕하세요 This is a test
위 예시에서는
re
모듈을 사용하여 HTML 태그와 특수문자를 제거한다. 정규 표현식(regular expression)을 활용하면 복잡한 패턴의 문자들을 효율적으로 제거할 수 있다.- 핵심 용어:
- 정규 표현식 (Regular Expression): 문자열의 패턴을 정의하는 표현식
- 핵심 용어:
토큰화 (Tokenization): 텍스트를 단어 또는 문장 단위로 분리
토큰화는 텍스트를 모델이 이해할 수 있는 최소 단위로 나누는 과정이다. 주로 단어(word) 또는 문장(sentence) 단위로 분리하며, 분리된 각 단어 또는 문장을 토큰(token)이라고 부른다. 토큰화 방법에는 띄어쓰기를 기준으로 분리하는 방법, 형태소 분석기를 사용하는 방법 등이 있다. 한국어의 경우, 띄어쓰기만으로는 정확한 토큰화를 수행하기 어렵기 때문에 형태소 분석기를 사용하는 것이 일반적이다.from konlpy.tag import Okt # 한국어 형태소 분석기 Okt okt = Okt() text = "자연어 처리는 재밌다!" word_tokens = okt.morphs(text) print(word_tokens) # 출력: ['자연어', '처리', '는', '재밌다', '!'] sentence_tokens = okt.sentences(text) print(sentence_tokens) # 출력: ['자연어 처리는 재밌다!']
위 예시에서는
konlpy
라이브러리를 사용하여 한국어 형태소 분석을 수행한다.morphs()
함수는 형태소 단위로 토큰화하고,sentences()
함수는 문장 단위로 토큰화한다.- 핵심 용어:
- 토큰 (Token): 텍스트를 분리한 최소 단위 (단어, 문장 등)
- 형태소 분석 (Morphological Analysis): 단어를 형태소 단위로 분해하는 작업
- 핵심 용어:
불용어 제거 (Stop Word Removal): 의미 없는 단어 제거
불용어는 텍스트 데이터에서 빈번하게 나타나지만, 모델의 성능에 큰 영향을 미치지 않는 단어들을 의미한다. 조사, 접속사, 관사, 대명사 등이 불용어에 해당하며, 모델 학습 전에 제거하여 계산 효율성을 높이고, 중요한 단어에 집중할 수 있도록 한다. 불용어 사전(stop word list)을 활용하여 불용어를 제거한다.from nltk.corpus import stopwords from nltk.tokenize import word_tokenize import nltk nltk.download('stopwords') # 필요한 경우 다운로드 nltk.download('punkt') stop_words = set(stopwords.words('english')) text = "This is a sample sentence, showing off stop words filtration." word_tokens = word_tokenize(text) # 토큰화 filtered_sentence = [w for w in word_tokens if not w.lower() in stop_words] print(filtered_sentence) # 출력: ['This', 'sample', 'sentence', ',', 'showing', 'stop', 'words', 'filtration', '.']
위 예시에서는
nltk
라이브러리를 사용하여 영어 불용어를 제거한다.stopwords.words('english')
를 통해 영어 불용어 사전을 가져오고, 토큰화된 단어들을 불용어와 비교하여 필터링한다. 한국어 불용어 제거를 위해서는 한국어 불용어 사전을 사용해야 한다. 불용어 사전은 필요에 따라 직접 제작하거나, 공개된 자료를 활용할 수 있다.- 핵심 용어:
- 불용어 (Stop Word): 의미 분석에 큰 기여를 하지 않는 단어
- 불용어 사전 (Stop Word List): 불용어들의 목록
- 핵심 용어:
어간 추출 (Stemming) & 표제어 추출 (Lemmatization): 단어의 원형 복원
어간 추출과 표제어 추출은 단어의 형태를 통일하여 텍스트 데이터의 차원을 줄이고, 모델의 일반화 성능을 향상시키는 기법이다. 어간 추출은 단어의 어미를 제거하고, 표제어 추출은 단어의 문맥적 의미를 고려하여 원형 단어를 찾는다. 표제어 추출이 어간 추출보다 정확도가 높지만, 계산 비용이 더 많이 든다.from nltk.stem import PorterStemmer from nltk.stem import WordNetLemmatizer import nltk nltk.download('wordnet') # 필요한 경우 다운로드 stemmer = PorterStemmer() lemmatizer = WordNetLemmatizer() words = ['running', 'flies', 'happier'] stemmed_words = [stemmer.stem(word) for word in words] lemmatized_words = [lemmatizer.lemmatize(word) for word in words] print(f'Stemmed words: {stemmed_words}') # 출력: ['run', 'fli', 'happier'] print(f'Lemmatized words: {lemmatized_words}') # 출력: ['running', 'fly', 'happier']
위 예시에서는
nltk
라이브러리를 사용하여 영어 단어의 어간 추출과 표제어 추출을 수행한다.PorterStemmer
는 어간 추출을,WordNetLemmatizer
는 표제어 추출을 위한 클래스이다. 한국어의 경우, 형태소 분석기를 사용하여 어간 추출과 표제어 추출을 수행할 수 있다.- 핵심 용어:
- 어간 추출 (Stemming): 단어의 어미를 제거하여 어간을 추출하는 과정
- 표제어 추출 (Lemmatization): 단어의 문맥적 의미를 고려하여 표제어를 추출하는 과정
- 핵심 용어:
단어 임베딩 (Word Embedding): 단어를 벡터로 변환
단어 임베딩은 단어를 고정된 차원의 벡터로 표현하는 기법으로, 단어 간의 의미적 유사성을 반영한다. Word2Vec, GloVe, FastText 등이 널리 사용되는 단어 임베딩 모델이다. 단어 임베딩을 통해 텍스트 데이터를 수치화하여 머신러닝 모델에 입력할 수 있으며, 모델의 성능을 향상시킬 수 있다.# 예시: Word2Vec 사용 (gensim 라이브러리 사용) from gensim.models import Word2Vec sentences = [["this", "is", "a", "good", "sentence"], ["this", "is", "another", "sentence"], ["and", "another", "good", "one"]] model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4) # 단어 'good'의 벡터 확인 word_vector = model.wv["good"] print(word_vector) # 벡터 값 출력 (100차원)
위 예시에서는
gensim
라이브러리를 사용하여 Word2Vec 모델을 학습하고, 단어를 벡터로 변환한다.vector_size
는 벡터의 차원,window
는 고려하는 주변 단어의 개수,min_count
는 최소 등장 횟수를 의미한다. 학습된 모델을 통해 단어 간의 유사성을 계산하거나, 다운스트림 태스크(downstream tasks)에 활용할 수 있다.- 핵심 용어:
- 단어 임베딩 (Word Embedding): 단어를 벡터 공간에 표현하는 기법
- Word2Vec: 단어 임베딩 모델 중 하나
- GloVe: 단어 임베딩 모델 중 하나
- FastText: 단어 임베딩 모델 중 하나
- 핵심 용어:
데이터 증강 (Data Augmentation): 데이터 양 늘리기
데이터 증강은 텍스트 데이터의 양을 늘려 모델의 일반화 성능을 향상시키는 기법이다. 동의어 치환, 문장 재구성, 무작위 단어 삽입/삭제, 백 번역(back-translation) 등 다양한 방법이 사용된다.- 핵심 용어:
- 데이터 증강 (Data Augmentation): 기존 데이터를 변형하여 새로운 데이터를 생성하는 기법
- 핵심 용어:
Padding & Truncating: 시퀀스 길이 맞추기
신경망 모델은 입력 시퀀스의 길이가 일정해야 한다. Padding은 짧은 시퀀스에 특정 토큰(일반적으로 0)을 추가하여 길이를 맞추는 방법이고, Truncating은 긴 시퀀스의 일부를 잘라내어 길이를 맞추는 방법이다.
from tensorflow.keras.preprocessing.sequence import pad_sequences sequences = [[1, 2, 3], [4, 5], [6, 7, 8, 9]] padded_sequences = pad_sequences(sequences, maxlen=4, padding='post') # padding='pre' 도 가능 print(padded_sequences) # 출력: [[1 2 3 0] [4 5 0 0] [6 7 8 9]]
- 핵심 용어:
- Padding: 시퀀스 길이를 맞추기 위해 특정 토큰을 추가하는 작업
- Truncating: 시퀀스 길이를 맞추기 위해 일부를 잘라내는 작업
🌈 3. 텍스트 데이터 전처리 과정 요약 (Summary of Text Data Preprocessing Process)
텍스트 데이터 전처리는 다음과 같은 단계를 거쳐 수행될 수 있다. (문제 및 데이터 특성에 따라 순서 및 기법은 달라질 수 있다.)
- 핵심 용어:
데이터 로드 및 확인: 텍스트 데이터를 불러오고, 데이터의 형태, 결측치, 이상치 등을 확인한다.
텍스트 정제: 불필요한 문자, HTML 태그, 특수문자 등을 제거한다.
토큰화: 텍스트를 단어 또는 문장 단위로 분리한다. (한국어의 경우, 형태소 분석기 사용)
불용어 제거: 불용어 사전을 활용하여 의미 없는 단어를 제거한다.
어간 추출 & 표제어 추출 (선택): 단어의 형태를 통일한다.
단어 임베딩 (선택): 단어를 벡터로 변환한다.
Padding & Truncating (필요 시): 시퀀스 길이를 맞춘다.
🚀 4. 결론 (Conclusion)
텍스트 데이터 전처리는 머신러닝 모델의 성능을 결정하는 중요한 과정이다. 다양한 기법들을 이해하고, 문제에 맞는 적절한 기법을 선택하여 적용하는 것이 중요하다. 본 글에서 소개된 기법들을 바탕으로 자신만의 텍스트 데이터 전처리 파이프라인을 구축하고, 모델의 성능을 극대화하기를 바란다.
핵심 용어 정리:
- 텍스트 정제 (Text Cleaning)
- 토큰화 (Tokenization)
- 불용어 제거 (Stop Word Removal)
- 어간 추출 (Stemming)
- 표제어 추출 (Lemmatization)
- 단어 임베딩 (Word Embedding)
- 데이터 증강 (Data Augmentation)
- Padding & Truncating