자연어 처리 기초부터 Word2Vec까지

이원준·2026년 3월 15일

NLP

목록 보기
1/9

1. 자연어 처리(NLP)란?

💡 한 줄 정의: NLP(Natural Language Processing)는 컴퓨터가 사람의 언어를 이해하고 처리하게 만드는 기술입니다.

🔑 핵심 개념

구분정의예시
자연 언어사람들이 자연스럽게 사용하는 언어한국어, 영어, 일본어
인공 언어목적에 맞게 설계된 언어Python, Java, 에스페란토어
자연어 처리자연언어를 컴퓨터가 해독·이해하는 기술번역, 챗봇, 감성분석

🎯 NLP 적용 분야

자연어 이해 (NLU, Natural Language Understanding)

  • 감성분석 — "이 영화 진짜 재미없었어" → 🔴 부정으로 판단
  • 주제분류 — 뉴스 기사를 정치 / 스포츠 / 과학으로 자동 분류
  • 형태소 분석 — "먹었다" → 먹(동사어근) + 었(과거) + 다(어미)
  • 개체명 인식(NER) — "삼성전자가 반도체를 생산했다" → 삼성전자 = 기업명
  • 철자법 교정 — "안녀하세요" → "안녕하세요"
  • 스팸 탐지 — 이메일이 spam인지 ham(정상)인지 구분

자연어 생성 (NLG, Natural Language Generation)

  • 문장 생성 — 주제를 주면 자동으로 글 작성
  • 기계 번역 — 한국어 → 영어 자동 번역
  • 대화 — 챗봇, 고객 응대 자동화

📈 NLP 발전 단계

단계기법해결된 문제진행 중인 문제
전통 기법규칙기반, 통계기반스팸분류, 품사결정, 개체명인식, 기본 문서생성
딥러닝 기법Word2Vec, BERT, GPT감성분석, 구문분석, 기계번역, 정보추출, 요약복잡한 Q&A, 의역, 대화, 창의적 문서 생성

⚠️ 핵심 포인트: 대부분의 NLP 문제는 결국 분류(Classification) 문제입니다.

"긍정인가 부정인가?", "스팸인가 아닌가?" 등 카테고리로 분류하는 것이죠.


🔄 접근 방법: 기존 방식 vs 딥러닝

구분기존 방식 (2010년대 이전)딥러닝 방식 (최근)
핵심 기술규칙기반 + 통계 머신러닝Word Embedding + 신경망
데이터언어 전문가가 만든 고품질 샘플대용량 말뭉치 자동 학습
전문가 필요✅ 언어학자 필수❌ 불필요
주요 모델통계 번역(SMT)BERT, GPT, Transformer

2. NLP의 기본 재료

🍳 요리에 재료가 필요하듯, NLP에도 기본 재료와 도구가 있습니다.


📚 Corpus (말뭉치)

NLP 학습을 위해 모아 놓은 문서 집합입니다.

  • 단순 Corpus: 소설, 신문 등 문서를 그냥 모아 놓은 것
  • 구조화된 Corpus: 품사, 형태소 등 보조 정보가 태깅된 것

💡 비유: Word2Vec은 10억~100억 단어 규모의 Corpus로 학습합니다. 요리사가 다양한 식재료를 많이 접할수록 실력이 늘듯, NLP 모델도 많은 문장을 볼수록 언어를 잘 이해합니다.


🔤 Token & Tokenization

Token: 텍스트를 분석하기 위해 작게 나눈 조각 (단어, 형태소, 구 등)

Tokenization: 긴 문자열을 여러 Token으로 쪼개는 작업

예시 — 영어 토큰화

입력: "I love Natural Language Processing"
출력: ["I", "love", "Natural", "Language", "Processing"]

특수 Token 종류

Token역할
<START>문장의 시작을 표시
<EOS>문장의 끝 (End of Sentence)
<UNK>사전에 없는 미등록 단어
<PAD>문장 길이를 맞추기 위한 빈 칸

Python 토큰화 도구

도구특징
str.split()공백 기준 단순 분리
nltk.word_tokenize영어에 최적화, 구두점 처리
nltk.sent_tokenize문장 단위 분리
Hugging Face tokenizersBPE, WordPiece, SentencePiece 지원 (최신 LLM용)

🇰🇷 한글 NLP의 특별한 어려움

영어는 단어를 공백으로 구분하면 되지만, 한국어는 다릅니다.

어려움설명예시
교착어조사가 띄어쓰기 없이 바로 붙음"학교에서" → 학교 + 에서
띄어쓰기잘 지켜지지 않음"밥먹었어" → "밥 먹었어"
어순 자유어순이 달라도 의미 통함"나는 밥을 먹었다" = "밥을 나는 먹었다"

🛠 해결책: KoNLPy(코엔엘파이) — Komoran, Mecab, Okt 등 한국어 형태소 분석기 내장. 카카오의 Khaiii도 활용 가능.


📝 불용어 (Stop-words)

분석에 큰 의미가 없는 단어들로, 보통 처리 전에 제거합니다.

  • 영어 예: the, is, a, an, of, in, ...
  • 한국어 예: 이, 그, 저, 을, 를, 이다, 있다, ...

3. 단어·문장의 숫자 표현

🔢 컴퓨터는 문자를 직접 이해하지 못합니다. 단어를 숫자(벡터)로 변환해야 합니다.

3가지 주요 방법: BOW → TF-IDF → Word Embedding (점점 발전)


📦 방법 1: BOW (Bag of Words)

각 문장에서 단어가 몇 번 등장하는지 count하여 벡터로 만드는 방법.

작동 방식

문서 1: "고양이가 뛰어 놀았다"
문서 2: "강아지가 뛰어 놀았다"

어휘 사전: [고양이, 강아지, 뛰어, 놀았다]

문서 1 벡터: [1, 0, 1, 1]
문서 2 벡터: [0, 1, 1, 1]

Python 사용법

from sklearn.feature_extraction.text import CountVectorizer

corpus = ["고양이가 뛰어 놀았다", "강아지가 뛰어 놀았다"]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)

BOW의 한계 ⚠️

  1. 단어 순서 무시: "phone is working"과 "phone is not working"을 같은 의미로 봄
  2. 빈도 미정규화: the, is, a 같은 흔한 단어가 항상 높은 수치
  3. 단어 관계 파악 불가: 비슷한 의미의 단어도 완전히 다른 벡터

🔗 n-gram: 단어 순서를 부분적으로 해결

단어 하나 대신 인접한 N개의 단어를 하나의 토큰으로 처리합니다.

종류설명예시
1-gram (unigram)단어 1개["not"], ["working"]
2-gram (bigram)인접 2개["not working"], ["is working"]
3-gram (trigram)인접 3개["not an issue"]

⚠️ 한계: N이 커질수록 feature(특징) 개수가 기하급수적으로 증가하여 메모리·연산 비용 폭증


📊 방법 2: TF-IDF (Term Frequency - Inverse Document Frequency)

BOW의 단순 빈도 문제를 해결합니다. "흔한 단어는 낮게, 특정 문서에서만 자주 쓰이는 단어는 높게" 가중치를 줍니다.

구성 요소

개념의미특징
TF (단어 빈도)특정 문서에서 단어가 얼마나 자주 등장하는가높을수록 해당 문서에서 중요
DF (문서 빈도)전체 문서에서 그 단어가 얼마나 흔한가the, is, a → DF 높음
IDF (역문서 빈도)DF의 역수흔할수록 낮아짐
TF-IDFTF × IDF높으면 그 문서에서만 특별한 단어

직관적 이해 예시

신문기사 분석 시 "의원이 발의한 법안"에서:

• "법안" → 이 기사에만 자주 등장      → TF-IDF 높음 ✅ (중요한 단어)
• "의원" → 정치 기사에 자주 등장      → TF-IDF 보통
• "했다, 있다" → 모든 기사에 등장    → TF-IDF 낮음 ❌ (의미 없는 단어)

Python 사용법

from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)

🎯 방법 3: One-Hot Encoding

사전(Vocabulary)에 있는 단어마다 고유한 번호를 부여하고, 해당 위치만 1, 나머지는 0으로 표현합니다.

예시 (어휘 사전 크기 = 10,000개)

어휘 사전: {apple: 1, aaron: 2, ..., king: 4914, ..., queen: 7157, ..., zebra: 9999}

king  → [0, 0, ..., 1, ..., 0]  (4914번째만 1)
queen → [0, 0, ..., 1, ..., 0]  (7157번째만 1)
apple → [1, 0, 0, ..., 0]       (1번째만 1)

한계 ⚠️: king과 queen이 얼마나 비슷한지 전혀 알 수 없습니다. 모든 단어 쌍의 코사인 유사도가 0으로 동일합니다.


📏 Padding

신경망은 모든 입력의 길이가 동일해야 합니다. 짧은 문장에 <PAD> 토큰을 채워 길이를 맞춥니다.

["나는", "학생"]          → [나는, 학생, <PAD>, <PAD>, <PAD>]
["나는", "밥을", "먹었다"] → [나는, 밥을, 먹었다, <PAD>, <PAD>]

4. Word Embedding & Word2Vec

🌌 One-Hot의 한계를 극복하는 핵심 기술. 단어를 다차원 공간의 벡터(실수값)로 표현하여, 비슷한 단어는 가까운 위치에 놓습니다.


💡 핵심 아이디어

"비슷한 맥락에서 등장하는 단어는 비슷한 의미를 갖는다"

예) "이사금께 충성을 맹세하였다."
    "왕에게 충성을 맹세하였다."

→ "이사금"이 무슨 뜻인지 모르더라도,
  주변 단어 패턴이 비슷하므로 "왕"과 비슷한 의미일 것이라고 추론 가능

Word Embedding의 3대 장점

  1. 단어 간 유사성 계산 가능 — king ↔ queen의 관계를 수치로 표현
  2. 의미·문법 정보 함축 — 300차원 안에 언어의 구조를 압축
  3. 전이학습 가능 — 한 번 학습한 벡터를 다른 NLP 작업에 재사용

🎭 Word Embedding의 마법: King - Man + Woman = Queen

단어 벡터는 의미적 관계를 연산으로 표현할 수 있습니다.

4차원 벡터 예시

단어성별귀족나이음식
King-1.00.950.700.02
Queen+1.00.970.600.03
Man-1.00.010.500.05
Woman+1.00.010.500.04
King - Man + Woman ≈ Queen  ✅
Paris - France + Japan ≈ Tokyo  ✅  (수도-국가 관계도 학습!)

🔲 Embedding Layer (투영 행렬)

One-Hot 벡터(희소, 매우 큰 차원)에 Embedding Matrix를 곱하여 작은 차원의 dense 벡터를 얻습니다.

어휘 사전 크기 = 10,000개
One-Hot 벡터  = 10,000차원 (거의 다 0)
          ↓ Embedding Layer
임베딩 벡터   = 300차원 (실수값으로 가득)

💡 실제로는 Embedding Matrix의 k번째 행을 그냥 조회(lookup)하는 것과 동일합니다. 행렬 곱셈보다 훨씬 빠릅니다.


🤖 Word2Vec

구글이 2013년 발표한 Word Embedding 방법. 얕은 신경망(은닉층 1개)을 사용하며, 대규모 비지도학습으로 단어 벡터를 자동 학습합니다.

두 가지 학습 방법

방법설명특징
Skip-gram중심 단어 → 주변 단어 예측드문 단어에 강함, 느린 학습
CBOW주변 단어들 → 중심 단어 예측빠른 학습

Skip-gram 학습 예시 (window size = 2)

입력 문장: "I love king of Korea"

중심 단어: king
예측 대상: [I, love, of, Korea]  ← 앞뒤 2개씩

→ "king"의 주변에 자주 등장하는 단어들을 학습하면서
  "king"의 벡터 표현이 점점 정교해짐

📐 코사인 유사도 (Cosine Similarity)

두 단어 벡터 사이의 각도를 이용해 유사도를 측정합니다.

코사인 유사도 = (A · B) / (|A| × |B|)
의미예시
≈ 1.0매우 유사king ↔ queen
≈ 0.5관련 있음king ↔ castle
≈ 0.0관련 없음king ↔ pizza
≈ -1.0반대 의미good ↔ bad

🏆 Word2Vec 학습 결과

king – queen ≈ man – woman     (성별 관계 학습 ✅)
Paris – France ≈ Tokyo – Japan  (수도-국가 관계 학습 ✅)
good – better ≈ bad – worse    (비교급 관계 학습 ✅)

🔗 시각화 데모: https://ronxin.github.io/wevi/


📌 전체 개념 정리

방법단어 순서단어 유사성의미 파악특징
BOW단순, 빠름
n-gram부분 ✅feature 폭증 문제
TF-IDF중요도 가중치 반영
One-Hot차원 폭발 문제
Word Embedding현재 표준, 전이학습 가능

🎯 마무리 퀴즈

Q1. "phone is working"과 "phone is not working"을 같은 의미로 처리하는 방법은?

정답: BOW (Bag of Words) — 단어 순서를 무시하고 단순 빈도만 카운트하기 때문

Q2. 전체 문서에서 흔하게 등장하는 단어(the, is, a)의 TF-IDF 값은?

정답: 낮다 — IDF가 낮아지기 때문 (역문서 빈도이므로 흔할수록 IDF↓ → TF-IDF↓)

Q3. Word2Vec에서 중심 단어로 주변 단어를 예측하는 방법은?

정답: Skip-gram

Q4. "king - man + woman = ?"의 결과는?

정답: queen — Word Embedding이 단어 간 의미적 관계를 벡터로 학습했기 때문

0개의 댓글