Skip to content
PART 6 · 34장

자연어처리와 순환신경망

기계가 언어를 이해하는 법

기계에게 텍스트는 어떻게 보이는가

스팸 필터, 번역기, 챗봇 -- 모두 기계가 글을 '이해'해야 합니다. 하지만 컴퓨터는 숫자만 처리할 수 있습니다. "오늘 날씨가 좋다"라는 문장을 컴퓨터에게 전달하려면 먼저 텍스트를 숫자로 변환해야 합니다.

이 과정은 세 단계로 이루어집니다. 텍스트 -> 토큰 -> 숫자(인코딩) -> 벡터(임베딩). 그리고 언어에는 순서가 중요합니다. "개가 사람을 물었다"와 "사람이 개를 물었다"는 단어가 같지만 의미가 전혀 다릅니다.

이 장에서는 텍스트 전처리부터 단어 벡터, 감성 분류, 그리고 순서를 기억하는 RNN까지 자연어처리의 핵심 기법을 실습합니다.

토큰화: 텍스트를 조각으로 나누다

텍스트를 처리하는 첫 단계는 토큰화(tokenization)입니다. 문장을 의미 있는 단위(토큰)로 쪼개는 작업입니다. 한국어는 영어와 달리 공백만으로 단어를 구분하기 어려워, 형태소 분석이나 서브워드 분할이 자주 사용됩니다.

쉽게 말하면 -- 문장을 단어(또는 글자)로 쪼개기: 레고 블록을 조립하려면 먼저 블록 하나하나를 분리해야 합니다. 토큰화는 문장이라는 "완성품"을 의미 있는 조각(토큰)으로 분리하는 작업입니다. "나는 학생입니다"를 어떻게 쪼갤 것인가? 세 가지 방식이 있습니다.

글자 단위: 각 글자를 하나의 토큰으로. 어휘가 작지만 의미 파악이 어렵다.
단어 단위: 공백/형태소 기준. 직관적이지만 어휘가 폭증할 수 있다.
서브워드 (BPE): 자주 나오는 글자 조합을 묶어 토큰으로. 현대 NLP의 표준.

실습 1: 한국어 토크나이저

한국어 문장을 입력하면 세 가지 토큰화 방식의 결과를 비교합니다. 토큰 수가 어떻게 달라지는지 관찰하세요.

글자 단위

단어(공백) 단위

서브워드(유사 BPE)

글자 토큰 수
-
단어 토큰 수
-
서브워드 토큰 수
-
직접 해보기: (1) "나는 학생입니다"를 입력하세요. 단어 단위는 3개, 글자 단위는 훨씬 많습니다. (2) "인공지능"처럼 복합어를 넣으면 서브워드가 어떻게 분할하는지 관찰하세요. (3) 영어 문장을 넣어보고 한국어와의 차이를 비교하세요.

Bag of Words와 TF-IDF

토큰화된 텍스트를 벡터(숫자 목록)로 바꾸는 고전적 방법 두 가지를 배웁니다.

Bag of Words (BoW): 각 단어의 등장 횟수를 세서 벡터로 만듭니다. "사과 바나나 사과"는 {"사과": 2, "바나나": 1}이 됩니다. 간단하지만 단어 순서를 완전히 무시합니다.
TF-IDF (Term Frequency-Inverse Document Frequency): 모든 문서에 자주 나오는 단어("은", "는", "이")는 중요도를 낮추고, 특정 문서에만 나오는 단어는 중요도를 높입니다. BoW의 한계를 상당 부분 보완합니다.
TF-IDF(t, d) = TF(t, d) x IDF(t)
TF = 문서 d에서 단어 t의 빈도
IDF = log(전체 문서 수 / 단어 t를 포함하는 문서 수)
흔한 단어는 IDF가 낮아져 가중치가 줄어든다

실습 2: BoW vs TF-IDF 비교

두 문장을 입력하면 BoW 행렬과 TF-IDF 행렬을 나란히 비교합니다. 공통 단어(조사 등)가 TF-IDF에서 어떻게 억제되는지 관찰하세요.

Bag of Words

단어문서 1문서 2

TF-IDF

단어문서 1문서 2
핵심 관찰: "오늘"은 두 문서 모두에 나타나므로 TF-IDF 값이 0입니다. 반면 "공원"은 문서 1에만 나타나므로 TF-IDF가 높습니다. 이것이 TF-IDF의 핵심: 특정 문서를 구별하는 단어에 높은 가중치를 부여합니다.

단어 임베딩: 의미를 벡터에 담다

BoW와 TF-IDF는 단어 간의 의미적 관계를 포착하지 못합니다. "왕"과 "여왕"이 관련 있다는 것을 모릅니다. 단어 임베딩(Word Embedding)은 각 단어를 저차원 벡터로 표현하되, 의미가 비슷한 단어는 벡터 공간에서 가까이 위치하도록 학습합니다.

쉽게 말하면 -- 단어를 숫자 좌표로 변환하되, 비슷한 뜻의 단어는 가까운 위치에: 지도에서 서울과 인천은 가깝고, 서울과 부산은 멀리 떨어져 있습니다. 단어 임베딩은 모든 단어를 이런 "의미의 지도" 위에 배치합니다. "사과"와 "배"는 가까이(둘 다 과일), "사과"와 "자동차"는 멀리 있습니다. 놀랍게도 이 지도에서는 방향도 의미를 가집니다. "왕"에서 "남자" 방향을 빼고 "여자" 방향을 더하면 "여왕" 근처에 도달합니다. 컴퓨터는 이 좌표(벡터)를 사용하여 단어 간의 의미적 거리를 계산합니다.
벡터 산술의 예:
vec("왕") - vec("남자") + vec("여자") ≈ vec("여왕")
vec("서울") - vec("한국") + vec("일본") ≈ vec("도쿄")

실습 3: 단어 임베딩 탐색기

50개 한국어 단어가 2D 공간에 배치되어 있습니다. 의미가 비슷한 단어끼리 클러스터를 이루는 것을 관찰하세요. 벡터 산술도 시도할 수 있습니다.

범례: 음식 감정 직업 가족 장소
- + = ?
직접 해보기: (1) 음식 단어들이 모여있는 영역을 찾아보세요. (2) "왕 - 남자 + 여자"를 계산해보세요. (3) "서울 - 한국 + 일본"을 시도해보세요. 이런 관계가 벡터 공간에서 자연스럽게 나타나는 것이 임베딩의 힘입니다.

실습 4: 한국어 감성 분류기

한국어 문장을 입력하면 긍정/부정을 분류합니다. 키워드 기반 모델이 어떤 단어에 반응하는지 하이라이트로 확인하세요. 실제 딥러닝 모델은 문맥까지 고려하지만, 여기서는 단어 감성 사전 기반의 간단한 모델을 사용합니다.

긍정 키워드 예시: 좋다, 훌륭하다, 재미있다, 감동, 최고, 사랑, 행복, 만족, 추천, 대박
부정 키워드 예시: 나쁘다, 최악, 실망, 지루하다, 별로, 짜증, 불만, 후회, 싫다, 화나다
키워드 기반의 한계: "이 영화는 재미없지 않다"는 실제로 긍정이지만, "재미없다"라는 부정 키워드에 반응하여 오분류될 수 있습니다. 문맥과 부정어 처리를 위해 RNN이나 Transformer 같은 순차 모델이 필요합니다.

RNN: 순서를 기억하는 신경망

일반 신경망은 각 입력을 독립적으로 처리합니다. 하지만 언어와 시계열 데이터는 순서가 핵심입니다. 순환신경망(RNN)은 이전 단계의 정보를 "숨겨진 상태(hidden state)"에 저장하고, 다음 단계에 전달합니다.

RNN의 핵심 수식:
h(t) = tanh(W_h * h(t-1) + W_x * x(t) + b)
h(t) = 현재 숨겨진 상태, h(t-1) = 이전 숨겨진 상태, x(t) = 현재 입력
쉽게 말하면 -- 순서대로 읽으며 기억을 유지하는 모델: 사람이 소설을 읽을 때, 각 문장을 이해하면서 이전 내용의 요약을 머릿속에 유지합니다. 새 문장을 읽으면 기존 요약과 합쳐 업데이트합니다. RNN의 숨겨진 상태(hidden state)가 바로 이 "머릿속 요약"입니다. 일반 신경망은 각 입력을 독립적으로 처리하지만, RNN은 "방금 전에 무엇을 읽었는가"라는 기억을 다음 단계에 전달합니다. 그래서 "나는 프랑스에서 태어났다"를 읽고 나면, 이후에 "그래서 나는 __어를 잘 한다"에서 빈칸을 채울 수 있습니다.
장기 의존성 문제: 기본 RNN은 문장이 길어지면 초반 정보를 잊어버립니다. "나는 프랑스에서 태어났다. ... (100단어) ... 그래서 나는 __어를 잘 한다." 여기서 "프랑스"를 기억해야 하지만 기본 RNN은 이를 놓칩니다. 이 문제를 해결하기 위해 LSTM(Long Short-Term Memory)이 개발되었습니다.
LSTM -- 중요한 것은 오래 기억하고 불필요한 것은 잊는 메모리: LSTM은 RNN에 "메모장"을 추가한 것입니다. 이 메모장에는 세 가지 문(gate)이 있습니다. 입력 문: "이 정보는 중요하니 메모장에 적어둬." 망각 문: "이 정보는 이제 필요 없으니 지워." 출력 문: "메모장에서 이것만 꺼내서 다음에 전달해." 이 세 문 덕분에 LSTM은 문장이 길어져도 중요한 정보(예: 주어가 "프랑스")를 수백 단어 뒤까지 유지할 수 있습니다.

실습 5: RNN 시퀀스 처리 시각화

숫자 시퀀스(예: 온도 변화)를 RNN이 한 단계씩 처리하는 과정을 관찰합니다. 각 시점에서 숨겨진 상태가 어떻게 변하는지, 그리고 다음 값을 어떻게 예측하는지 확인하세요.

입력 시퀀스와 예측

숨겨진 상태 변화

"처리 시작"을 눌러 RNN의 단계별 처리 과정을 관찰하세요.
현재 시점
0
현재 입력
-
숨겨진 상태
-
예측값
-
관찰 포인트: 사인파처럼 규칙적인 패턴은 RNN이 잘 예측합니다. 계단 함수처럼 갑작스러운 변화에는 숨겨진 상태가 급변합니다. 랜덤 데이터는 패턴이 없으므로 예측이 부정확합니다. 이것은 RNN(그리고 모든 모델)의 근본적 한계를 보여줍니다: 데이터에 패턴이 없으면 학습할 것도 없다.
이 장의 핵심
  • 텍스트는 토큰화 -> 인코딩 -> 임베딩의 과정을 거쳐 숫자 벡터로 변환된다.
  • BoW는 단어 빈도, TF-IDF는 문서 특이적 중요도를 반영한다.
  • 단어 임베딩은 의미적 관계를 벡터 공간에 표현하여 유사 단어를 가까이 배치한다.
  • RNN은 숨겨진 상태를 통해 시퀀스의 순서 정보를 유지한다.
  • 기본 RNN은 장기 의존성 문제가 있으며, LSTM이 이를 개선한다.

다음 장 예고: RNN은 순서대로 처리하므로 병렬화가 어렵고 긴 문맥에 약합니다. 다음 장에서는 이 한계를 극복한 Transformer와, 이를 거대하게 확장한 GPT 같은 대규모 언어모델(LLM)을 배웁니다.