위클리페이퍼(10) 텍스트 전처리, FastText, Word2Vec, Attention, Seq2Seq, Transformer?

윤승호·2025년 6월 22일

◆ Q & A 요약

Q1. 텍스트 데이터를 모델에 적용하기 전에 어떤 전처리 과정을 거치나요?
A1. 정제(특수문자), 토큰화(의미 분리), 정규화(대소문자&어간&표제어), 불용어 제거(조사&관사&전치사), 벡터화(숫자 연산)

Q2. FastText가 Word2Vec과 다른 점은 무엇이며, 어떤 장점이 있나요?
A2. Word2Vec은 word단위(ex. preorder)로 구분하고 FastText는 subword단위(ex. pre, order) 단위로 구분. 더 작은 단위로 학습을 하기에 처음 보는 단어, 신조어, 오타에 강건.

Q3. Attention 메커니즘이 Seq2Seq 모델의 어떤 문제를 해결하는 데 도움이 되나요?
A3. 정보 병목 문제. 이는 벡터화 압축 때문. Attention은 매 단계마다 입력 문장 전체를 다시 훑어보고 현재 가장 필요한 정보에 집중할 수 있게 하여 이 문제를 해결.

Q4. Transformer 모델은 Seq2Seq 구조와 어떤 점에서 근본적으로 다른가요?
A4. Seq2Seq는 단어를 하나씩 순서대로 처리하는 순차(Sequential) 방식. Transformer는 문장의 모든 단어를 한 번에 처리하는 병렬(Parallel) 방식. 'Self Attention' 기술 덕분.


1. 텍스트 데이터를 모델에 적용하기 전에 어떤 전처리 과정을 거치나요?

(1) 내용

  • 모델에 텍스트 데이터를 적용하기 전, 데이터를 정제하고 모델이 학습 가능한 형태로 가공하는 '전처리' 과정을 거침. 이 과정은 크게 ① 정제, ② 토큰화, ③ 정규화, ④ 불용어 제거, ⑤ 벡터화 단계로 구성됨.
  • 전처리 과정은 요리사가 최상의 요리를 만들기 위해 신선한 재료를 손질하는 과정에 비유할 수 있음. 흙 묻은 채소를 깨끗이 씻고(정제), 요리에 맞게 썰고(토큰화), 비슷한 재료끼리 모아두며(정규화), 맛에 불필요한 부분은 덜어내고(불용어 제거), 마지막으로 레시피에 맞게 정확히 계량(벡터화)하는 것과 같음.

(2) 단계 분석

  • A. 1단계: 정제 (Cleaning) - '재료의 불순물 제거'
    • 목표: 텍스트의 본질적인 의미와 관련 없는 각종 노이즈를 제거하여 분석의 방해 요소를 없애는 과정임.
    • 제거 대상 예시:
      • HTML 태그: 웹 크롤링으로 수집한 데이터에 포함된 <div>, <p> 등의 태그.
      • 특수 문자 및 기호: 문장의 의미를 구성하지 않는 @, #, $ 등의 기호.
      • URL 및 이메일 주소: 'https://...' 형태의 웹 주소 또는 'user@example.com' 형태의 이메일 주소.
      • 불필요한 공백: 여러 개의 연속된 공백이나 문장 앞뒤의 공백.
  • B. 2단계: 토큰화 (Tokenization) - '재료를 알맞게 썰기'
    • 목표: 연속된 문자열을 모델이 처리할 수 있는 의미 있는 최소 단위 '토큰(Token)'으로 분할하는 과정임.
    • 주요 전략:
      • 단어 토큰화: 공백, 구두점 등을 기준으로 단어 단위로 분할함.
      • 서브워드 토큰화 (Subword Tokenization): 현대 NLP의 핵심. 단어를 더 작은 의미 단위인 '서브워드'로 분리하여 OOV(어휘 집합에 없는 단어) 문제를 근본적으로 해결함. BPE, WordPiece 등이 대표적인 알고리즘임.
  • C. 3단계: 정규화 (Normalization) - '비슷한 재료는 한 바구니에'
    • 목표: 표현은 다르나 의미는 같은 단어들을 하나의 표준 형태로 통일하여 모델의 학습 효율을 높이는 과정임.
    • 주요 기법:
      • 대소문자 통일: 'Apple'과 'apple'을 모두 'apple'로 통일하여 같은 단어로 처리함.
      • 어간 추출 (Stemming): 단어의 어미를 규칙 기반으로 강제 제거하여 어간을 추출함. (예: studiesstudi). 속도는 빠르나 정교함이 떨어짐.
      • 표제어 추출 (Lemmatization): 단어의 품사를 고려하여 사전적 원형을 찾아냄. (예: are, isbe). 정교하지만 더 많은 계산이 필요함.
  • D. 4단계: 불용어 제거 (Stopword Removal) - '불필요한 장식 덜어내기'
    • 목표: 문장에서 자주 등장하지만 문맥 파악에 큰 도움이 되지 않는 단어(조사, 관사, 전치사 등)를 제거하는 것임.
    • 주의점: 감성 분석 등에서 'not'과 같이 의미에 중요한 영향을 미치는 단어는 제거하지 않도록 주의해야 함.
  • E. 5단계: 벡터화 (Vectorization) - '재료를 숫자로 계량하기'
    • 목표: 전처리를 마친 토큰들을 컴퓨터가 연산할 수 있는 숫자 벡터로 변환하는 최종 단계임.
    • 대표 기법:
      • TF-IDF: 특정 문서에서 단어의 빈도(TF)와, 전체 문서에서 그 단어의 희소성(IDF)을 곱하여 단어의 중요도를 계산하는 방식.
      • 워드 임베딩: 단어의 의미를 다차원 공간의 밀집 벡터로 표현하는 방식. (2번 항목에서 심층 해설)

(3) 요약

단계목표 (하는 일)비유주요 기법 / 고려사항
정제노이즈 데이터 제거재료 씻기HTML 태그, 특수 문자, URL 제거
토큰화의미 단위로 분할재료 썰기단어 토큰화, 서브워드 토큰화(BPE 등)
정규화표현 형태 통일비슷한 재료 모으기대소문자 통일, 표제어/어간 추출
불용어 제거불필요한 단어 제거장식 덜어내기문맥에 따라 신중하게 적용
벡터화숫자 데이터로 변환숫자로 계량하기TF-IDF, 워드 임베딩

(4) 코드 예시

def preprocess_text(text):
    # 1. 정제
    text = text.lower()
    text = re.sub(r'[^a-z\s]', '', text)

    # 2. 토큰화
    tokens = word_tokenize(text)

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

    # 4. 표제어 추출
    lemmatizer = WordNetLemmatizer()
    lemmatized_tokens = [lemmatizer.lemmatize(token) for token in tokens]

    return " ".join(lemmatized_tokens)

2. FastText가 Word2Vec과 다른 점은 무엇이며, 어떤 장점이 있나요?

(1) 비교

  • Word2Vec과 FastText의 가장 근본적인 차이점은 단어를 인식하는 단위에 있음. Word2Vec은 단어를 더 이상 쪼갤 수 없는 '통단어'로 인식하지만, FastText는 단어를 여러 '글자 조각(subword)'의 조합으로 인식함. 이로 인해 FastText는 처음 보는 단어(OOV)의 의미도 유추할 수 있다는 결정적인 장점을 가짐.
  • Word2Vec: 사람을 '얼굴 통째로' 외우는 방식. 앨범에 사진이 없는 처음 보는 사람은 전혀 알아보지 못함. (OOV 문제 발생)
  • FastText: 사람의 '특징(눈, 코, 입, 안경 등)을 분해해서' 외우는 방식. 처음 보는 사람이라도 '안경'이라는 익숙한 특징이 있다면, 그 특징을 통해 어느 정도 유추가 가능함. (OOV 문제 해결)

(2) FastText 장점

  • A. 신조어 및 희귀 단어 처리 (OOV 문제 해결)
    • FastText의 가장 핵심적인 장점. '핵인싸' 같은 신조어가 등장해도, '핵'과 '인싸'라는 글자 조각(subword)을 통해 그 의미를 추론할 수 있음.
  • B. 오타에 대한 강건성 (Robustness)
    • 사용자가 'language'를 'langage'로 잘못 입력해도, 두 단어가 공유하는 lan, ang, age 등의 글자 조각이 많으므로 유사한 의미의 벡터를 생성해낼 수 있음.
  • C. 형태학적 특징 반영
    • '먹다', '먹었다', '먹으니' 등은 모두 '먹-'이라는 공통된 형태소(의미 단위)를 가짐. FastText는 이 공통된 글자 조각을 통해 이 단어들이 모두 '먹는 행위'와 관련 깊음을 자연스럽게 학습함. 이는 특히 어미 변화가 복잡한 한국어와 같은 교착어에서 매우 강력한 성능을 발휘함.

(3) 요약

항목Word2VecFastText
기본 처리 단위단어 (Word)내부 단어 (Character n-grams)
OOV 처리불가능. Unknown 토큰으로 처리하거나 무시함.가능. n-gram 벡터 합으로 새로운 단어 벡터 유추.
형태소 정보반영하지 못함.반영함. 단어 내부 구조를 학습.
오타/신조어취약함.강건함 (Robust).
메모리 사용량상대적으로 적음.n-gram 정보로 인해 훨씬 많음.

(4) 코드 예시

# 샘플 문장 데이터
sentences = [['i', 'love', 'deep', 'learning'], ['i', 'love', 'nlp']]

# 모델 학습
w2v_model = Word2Vec(sentences, vector_size=100, window=2, min_count=1)
ft_model = FastText(sentences, vector_size=100, window=2, min_count=1)

# OOV 단어 테스트
# Word2Vec은 학습한 적 없는 'loving'에 대한 벡터를 얻을 수 없음
try:
    w2v_vector = w2v_model.wv['loving']

# FastText는 글자 조각으로 'loving' 벡터를 유추함
ft_vector = ft_model.wv['loving']
print("FastText: ft_vector.shape)

# 유사도 비교
ft_model.wv.similarity('love', 'loving')

3. Attention 메커니즘이 Seq2Seq 모델의 어떤 문제를 해결하는 데 도움이 되나요?

(1) 내용

  • Attention 메커니즘은 Seq2Seq 모델의 고질적인 '정보 병목(Information Bottleneck)' 문제를 해결함. 이는 긴 문장을 하나의 고정된 크기 벡터로 압축할 때 발생하는 정보 손실(단기 기억상실증) 문제임. Attention은 번역이나 요약의 매 단계마다 입력 문장 전체를 다시 훑어보고 현재 가장 필요한 정보에 '집중' 할 수 있게 함으로써 이 문제를 해결함.
  • Seq2Seq (without Attention): 긴 문장을 딱 한 번만 듣고 모든 것을 암기해서 통역해야 하는 '기억력 나쁜 통역사'. 문장 앞부분의 중요한 세부사항을 쉽게 잊어버림.
  • Seq2Seq (with Attention): 원문을 모두 받아 적은 '메모 수첩'을 가진 통역사. 통역하는 매 순간마다 수첩을 다시 훑어보고, 지금 말할 내용과 가장 관련 깊은 부분에 형광펜을 칠하며(집중하며) 정확하게 통역함.

(2) Attention 작동 방식

  • A. 작동 방식
    • 스코어 계산: 디코더가 특정 단어를 예측하려는 시점에서, 자신의 현재 상태와 인코더에 기록된 모든 입력 단어들의 상태를 하나씩 비교하여 '관련도 점수'를 매김.
    • 가중치 변환: 이 점수들을 Softmax 함수를 통해 총합이 1인 '집중도 가중치(확률)'로 변환함. 점수가 높을수록 가중치가 커짐.
    • 컨텍스트 벡터 생성: 이 가중치를 각 입력 단어의 정보에 곱한 뒤 모두 더하여, 현재 시점만을 위한 '맞춤형 컨텍스트 벡터'를 동적으로 생성함.
    • 예측: 이 맞춤형 컨텍스트 벡터를 활용하여 최종 단어를 예측함.
  • B. 주요 효과
    • 성능 향상: 긴 문장에서도 정보 손실 없이 정확한 번역 및 요약이 가능해짐.
    • 장기 의존성 문제 해결: 문장의 맨 앞과 맨 뒤처럼 멀리 떨어진 단어 간의 관계도 효과적으로 포착함.
    • 해석 가능성(Interpretability) 제공: 집중도 가중치를 시각화(히트맵)하여, 모델이 어떤 단어를 생성할 때 어떤 입력 단어에 집중했는지 확인할 수 있음.

(3) 요약

구분Seq2Seq (without Attention)Seq2Seq (with Attention)
정보 전달 방식고정된 크기의 단일 컨텍스트 벡터 (병목)동적이고 유연한 어텐션 컨텍스트 벡터
정보 손실긴 문장에서 정보 손실 심각입력 시퀀스 전체를 직접 참조하여 정보 손실 최소화
해석 가능성어려움 (블랙박스)어텐션 가중치 시각화로 판단 근거 추론 가능

4. Transformer 모델은 Seq2Seq 구조와 어떤 점에서 근본적으로 다른가요?

(1) 내용

  • Transformer와 Seq2Seq의 가장 근본적인 차이점은 데이터 처리 방식에 있음. Seq2Seq는 단어를 하나씩 순서대로 처리하는 순차(Sequential) 방식인 반면, Transformer는 문장의 모든 단어를 한 번에 처리하는 병렬(Parallel) 방식임. 이는 Transformer가 순차 처리의 병목을 유발하는 RNN을 완전히 제거하고, '셀프 어텐션(Self-Attention)'이라는 기술만을 사용하기에 가능함.
  • Seq2Seq (RNN 기반): 1번 작업이 끝나야 2번 작업으로 넘어가는 '컨베이어 벨트 공장'. 한 번에 한 단계씩만 진행되어 속도가 느림.
  • Transformer: 모든 부품을 작업대에 펼쳐놓고 여러 전문가가 동시에 소통하며 조립하는 '미래형 공동 작업실'. 모든 관계를 한 번에 파악하여 속도가 극도로 빠름.

(2) Transformer 핵심 기술

  • A. Self Attention: 문장 스스로 관계 파악
    • Transformer의 심장. 하나의 문장 내에서, 모든 단어가 다른 모든 단어와 직접 관계를 맺고 "누가 나와 가장 관련이 깊지?"를 동시에 파악하는 메커니즘임.
  • B. Multi Head Attention: 다양한 관점으로 관계 파악
    • 셀프 어텐션을 한 번만 수행하는 것이 아니라, 여러 개의 '헤드(관점)'를 두고 독립적으로 병렬 수행하는 방식. 이를 통해 어떤 헤드는 주어-동사 관계를, 다른 헤드는 수식 관계를 파악하는 등, 문장의 다양한 문법적/의미적 관계를 동시에 학습할 수 있음.
  • C. Positional Encoding: 잃어버린 순서 정보 확인
    • 단어를 병렬로 처리하면서 사라진 '순서' 정보를 모델에 다시 알려주기 위해, 각 단어의 위치에 대한 고유한 벡터 값을 입력 임베딩에 더해주는 장치임.

(3) 요약

항목Seq2SeqTransformer
핵심 아키텍처순환 신경망 (RNN)셀프 어텐션 (Self-Attention)
데이터 처리순차적 (Sequential)병렬적 (Parallel)
속도느림 (병렬화 한계)매우 빠름 (GPU 활용 극대화)
순서 정보 처리RNN 구조 자체에 내재포지셔널 인코딩을 별도로 추가해야 함
대표 모델초창기 번역/요약 모델BERT, GPT, T5 등 현대 모든 LLM

(4) 코드 예시

# Transformer의 인코더 구조를 사용하는 BERT 모델 로드
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')

text = "The transformer architecture allows for parallel processing."

# 토큰화 및 텐서 변환
inputs = tokenizer(text, return_tensors="pt")

# 모델 실행
with torch.no_grad():
    outputs = model(**inputs)

# 모든 토큰에 대한 문맥적 임베딩 결과
contextual_embeddings = outputs.last_hidden_state


◆ 해설

1. 텍스트 데이터를 모델에 적용하기 전에 어떤 전처리 과정을 거치나요?

텍스트 데이터를 모델에 적용하기 전에 반드시 전처리 과정을 거쳐야 합니다. 텍스트는 구조화되지 않은 형태로 존재하기 때문에, 이를 수치적으로 처리 가능한 형태로 변환해주는 것이 전처리의 핵심 목적입니다.

가장 기본적인 전처리는 불필요한 문자 제거입니다. 예를 들어, HTML 태그, 특수 문자, 숫자, 이모지 등을 제거하거나 필요한 경우에만 유지하는 식으로 데이터를 정리합니다.

그다음으로는 소문자 변환을 많이 사용합니다. 대소문자를 통일함으로써 'Apple'과 'apple'을 같은 단어로 취급하게 되어 불필요한 중복을 줄일 수 있습니다.

또한, 불용어 제거도 중요한 과정입니다. 불용어는 '의', '이', '가', 'the', 'is', 'and'처럼 자주 등장하지만 분석에 큰 의미가 없는 단어들로, 이들을 제거하면 모델이 더 중요한 단어에 집중할 수 있습니다.

토큰화(Tokenization)도 핵심 과정 중 하나입니다. 문장을 단어, 형태소, subword 단위 등으로 나누는 과정이며, 사용하는 언어와 목적에 따라 다양한 방식이 적용됩니다.
그 외에도 어간 추출(Stemming)이나 표제어 추출(Lemmatization)을 통해 단어의 기본 형태를 통일할 수도 있고, 중복 공백 제거, 이상값 필터링, 맞춤법 교정 등의 세부적인 정제 작업도 포함될 수 있습니다.

이러한 전처리 과정을 통해 텍스트를 모델이 학습할 수 있는 일관된 입력 형태로 정리함으로써, 학습 효율과 성능을 향상시킬 수 있습니다.


2. FastText가 Word2Vec과 다른 점은 무엇이며, 어떤 장점이 있나요?

FastText는 Word2Vec과 비슷한 방식으로 단어 임베딩을 학습하는 모델이지만, 단어를 더 작은 단위인 서브워드(Subword)로 분해해서 학습한다는 점에서 차이가 있습니다.

Word2Vec은 단어 전체를 하나의 단위로 보고 벡터를 학습합니다. 예를 들어 'apple'이라는 단어가 있다면, 이 단어 자체에 대한 벡터만 학습됩니다. 반면 FastText는 'app', 'ppl', 'ple' 같은 n-gram 단위의 조각으로 단어를 분해하고, 이 조각들의 임베딩을 평균내거나 합쳐서 단어 벡터를 구성합니다.

이 방식의 장점은 특히 형태가 유사한 단어들 간의 관계를 잘 반영할 수 있다는 점입니다. 예를 들어 'run', 'running', 'runner'처럼 비슷한 형태를 가진 단어들은 공통된 서브워드를 공유하므로, FastText는 이들 간의 의미적 유사성을 자연스럽게 학습할 수 있습니다.

또 하나의 큰 장점은 OOV(Out-of-Vocabulary) 문제를 완화할 수 있다는 점입니다. Word2Vec은 학습 데이터에 없는 단어는 임베딩할 수 없지만, FastText는 서브워드 단위로 처리하기 때문에 처음 보는 단어라도 그 조각들을 이용해 벡터를 생성할 수 있습니다.

결과적으로 FastText는 희귀 단어, 신조어, 오타 등이 포함된 데이터셋에서도 더 강건한 성능을 보일 수 있고, 특히 형태소 기반 언어나 언어 자원이 부족한 상황에서도 유용하게 활용될 수 있는 모델입니다.


3. Attention 메커니즘이 Seq2Seq 모델의 어떤 문제를 해결하는 데 도움이 되나요?

Attention 메커니즘은 Seq2Seq(Sequence-to-Sequence) 모델이 가지는 중요한 한계를 해결하는 데 큰 도움을 줍니다.

기본적인 Seq2Seq 모델은 입력 시퀀스를 인코더가 하나의 고정된 벡터로 요약하고, 디코더는 이 벡터만을 바탕으로 전체 출력을 생성합니다. 그런데 입력 문장이 길어질수록, 인코더가 모든 정보를 하나의 벡터에 압축하는 데 한계가 생기고, 그로 인해 디코더는 필요한 문맥 정보를 충분히 받지 못하게 됩니다. 이로 인해 성능이 떨어지거나 문장의 앞부분은 잘 예측하면서도 뒷부분은 틀리는 문제가 자주 발생합니다.

이때 Attention 메커니즘을 적용하면, 디코더는 인코더의 전체 hidden state 중에서 매 시점에 필요한 부분에 '집중(attend)'해서 정보를 가져올 수 있게 됩니다. 즉, 입력 시퀀스 전체를 한꺼번에 압축하는 대신, 각 출력 단어를 생성할 때마다 입력 시퀀스의 특정 위치에 더 많은 가중치를 두고 참고할 수 있습니다.

이 덕분에 모델은 긴 문장에서도 필요한 문맥 정보를 유연하게 반영할 수 있고, 장기 의존성 문제(long-term dependency)를 완화할 수 있습니다. 결과적으로 번역, 문장 생성, 질의응답 같은 자연어 처리 과제에서 Seq2Seq 모델의 성능이 크게 향상됩니다.


4. Transformer 모델은 Seq2Seq 구조와 어떤 점에서 근본적으로 다른가요?

Transformer 모델은 Seq2Seq 구조와 비교했을 때, 가장 큰 근본적인 차이점은 RNN을 사용하지 않고, 전적으로 Attention 메커니즘만으로 시퀀스를 처리한다는 점입니다.

전통적인 Seq2Seq 모델은 RNN, LSTM, GRU 같은 순환 신경망 구조를 사용하여 입력 시퀀스를 시간 순서대로 처리합니다. 이 구조는 시간 흐름을 따라 정보를 전달할 수 있지만, 병렬 연산이 어렵고, 긴 시퀀스일수록 학습 속도가 느려지며, 장기 의존성 문제가 발생할 수 있습니다.

반면 Transformer는 모든 입력 토큰 간의 관계를 한 번에 계산할 수 있는 Self-Attention 메커니즘을 기반으로 동작합니다. 덕분에 각 단어가 문장 내 다른 단어들과 어떻게 연결되는지를 병렬적으로 학습할 수 있으며, 연산 속도가 빠르고, 긴 문장에서도 정보 손실 없이 문맥을 반영할 수 있습니다.

또한 Transformer는 Positional Encoding이라는 기법을 사용해 입력 토큰의 순서 정보를 보완합니다. 이는 RNN처럼 순차적으로 데이터를 처리하지 않기 때문에 발생할 수 있는 순서 정보 손실 문제를 해결하는 방식입니다.

결과적으로 Transformer는 Seq2Seq보다 병렬 처리 효율이 뛰어나고, 긴 문장에서도 더 안정적인 성능을 보이며, 기계 번역, 텍스트 요약, 문장 생성 등 다양한 자연어처리 과제에서 기존 Seq2Seq을 대체하고 있습니다.

profile
나는 AI 엔지니어가 된다.

0개의 댓글