토큰화·벡터화·임베딩의 차이와 텍스트 유사도 실습
출처: https://www.youtube.com/watch?v=9rbm29bCjaQ · 오늘코드todaycode · 33:10 · 2025-04-08
요지
- 토큰화는 텍스트를 단어·형태소·서브워드 등의 처리 단위로 나누는 과정이다.
- 벡터화는 텍스트를 숫자 벡터로 표현하는 넓은 개념이며, BoW·TF-IDF·임베딩은 서로 다른 표현 방법이다.
- BoW와 TF-IDF는 어휘의 등장 횟수와 중요도를 표현하고, 학습된 임베딩은 의미적 관계를 밀집 벡터에 담는다.
- 코사인 유사도는 벡터의 방향을 비교한다. TF-IDF와 임베딩 모두에 적용할 수 있지만, 결과의 의미는 사용한 표현 방식에 달려 있다.
- 고차원 임베딩을 2차원이나 3차원으로 축소하면 관계를 탐색하기 쉬워지지만, 검색 품질은 원래 벡터에서 평가해야 한다.
- 생성한 임베딩을 원문·식별자·모델 정보와 함께 저장하면 유사 문서 검색과 후속 생성 작업에 재사용할 수 있다.
개요
컴퓨터가 텍스트를 비교하고 분류하려면 연산 가능한 숫자 표현이 필요하다. 이 과정에서 등장하는 토큰화, 벡터화, 임베딩은 관련되어 있지만 같은 뜻은 아니다. 토큰화는 입력을 어떻게 나눌지, 벡터화는 무엇을 숫자로 표현할지, 임베딩은 학습된 관계를 어떤 벡터 공간에 담을지에 관한 개념이다.
영상은 도서 제목 50개를 TF-IDF와 임베딩으로 표현하고, 유사도 히트맵과 TensorFlow Embedding Projector로 비교한다. 제목이 비슷한 시리즈와 주제가 가까운 책들이 어떻게 모이는지 관찰하면서 숫자 표현과 의미 비교의 관계를 설명한다. 이 교안의 코드는 같은 학습 목적을 가진 별도 예제이며, 자막의 일부 단순화된 설명은 오해가 없도록 보완했다.
배경 / 사전 지식
문서와 코퍼스. 자연어 처리에서 문서는 반드시 긴 글일 필요가 없다. 도서 제목 하나, 리뷰 하나, 질문 하나도 문서가 될 수 있다. 분석 대상으로 모은 문서 집합을 코퍼스라고 한다. 영상에서는 도서 제목 50개가 코퍼스다.
어휘 사전과 토큰 ID. 토큰을 모아 사전을 만들고 각각에 번호를 붙일 수 있다. 이 번호는 식별자다. 토큰 ID가 10인 단어와 11인 단어가 의미적으로 가깝다는 뜻은 아니다. 신경망에서는 토큰 ID로 임베딩 테이블의 벡터를 찾아 사용하는 방식이 흔하다.
벡터와 차원. 벡터는 여러 숫자를 순서대로 나열한 것이다. [0.2, -0.4, 0.8]은 3차원 벡터다. 문서 N개를 각각 D차원으로 표현하면 전체 데이터의 크기는 N × D가 된다. 영상에서 사용한 임베딩 결과는 50 × 1,536이다.
희소 벡터와 밀집 벡터. 어휘 사전이 크더라도 한 문서에 등장하는 단어는 일부이므로 BoW와 TF-IDF에는 0이 많다. 이를 희소 표현이라고 한다. 임베딩은 여러 차원에 연속적인 값을 담는 밀집 표현을 사용한다. 밀집 벡터에도 0은 존재할 수 있으며, 모든 값이 0이 아니어야 한다는 뜻은 아니다.
핵심 개념
토큰화: 처리 단위로 나누기
토큰화는 목적과 모델에 맞게 텍스트를 나누는 과정이다. 토큰이 반드시 사람이 이해하는 최소 의미 단위와 일치하는 것은 아니다.
| 방식 | 나누는 기준 | 특징 |
|---|---|---|
| 공백 기반 | 띄어쓰기 | 간단하지만 한국어 조사·어미를 분리하지 못한다. |
| 형태소 기반 | 어근·조사·어미 등 | 한국어의 문법적 구조를 활용할 수 있다. |
| 서브워드 기반 | 학습된 부분 문자열 | 드문 단어도 여러 조각으로 표현할 수 있다. |
예를 들어 파이썬으로 데이터를 분석한다를 공백으로 나누면 파이썬으로, 데이터를, 분석한다가 된다. 형태소 분석은 여기에서 조사와 어미 등을 분리할 수 있다. 서브워드 토크나이저의 실제 결과는 학습한 어휘와 알고리즘에 따라 달라진다.
영상은 BPE, WordPiece, SentencePiece를 소개한다. BPE와 WordPiece는 서브워드 분할 방법이며, SentencePiece는 BPE나 Unigram 등을 지원하는 토크나이저 도구다. 서브워드는 사전에 없는 단어인 OOV를 다루는 데 도움이 되지만, 처리 범위는 문자·바이트 처리 방식에도 영향을 받는다.
벡터화: 텍스트를 숫자로 표현하기
벡터화는 숫자 벡터를 만드는 포괄적인 개념이다. 영상은 입문 설명을 위해 벡터화와 임베딩을 대비하지만, 임베딩 역시 벡터화의 한 방법이다.
따라서 토큰화 → TF-IDF → 임베딩을 항상 거쳐야 하는 것은 아니다. 전통적인 분석에서는 토큰화 결과로 TF-IDF를 만들 수 있고, 신경망 모델에서는 토큰 ID를 임베딩 계층에 전달할 수 있다. 문장 임베딩 서비스는 입력 텍스트의 토큰화와 벡터 생성을 내부에서 수행한다.
BoW: 단어의 등장 횟수 표현하기
Bag of Words는 문서에 어떤 단어가 몇 번 등장하는지 표현한다. 어휘 순서가 [파이썬, 데이터, 수학]이면 파이썬 데이터 파이썬은 [2, 1, 0]으로 나타낼 수 있다. 등장 여부만 기록하는 이진 표현도 가능하다.
단어의 순서는 기본적으로 사라진다. 일부 순서 정보를 반영하려면 연속된 토큰을 묶는 n-gram을 사용할 수 있다. 예를 들어 머신 러닝 입문의 단어 bigram은 머신 러닝, 러닝 입문이다.
TF-IDF: 문서 안팎의 빈도로 가중치 부여하기
TF는 해당 문서에서 단어가 얼마나 등장하는지 나타낸다. IDF는 여러 문서에 두루 등장하는 단어보다 적은 문서에 등장하는 단어에 더 큰 가중치를 부여한다. 두 요소를 결합하면 특정 문서를 구분하는 데 유용한 단어를 강조할 수 있다.
직관적인 표현은 TF-IDF = 문서 내 빈도 × 역문서빈도다. 실제 수치는 평활화, 로그 적용, 정규화 등의 설정에 따라 달라진다. 이 점수는 통계적 구별력을 나타내며, 사람이 판단하는 중요도와 언제나 일치하지는 않는다.
임베딩: 학습된 관계를 벡터에 담기
임베딩은 단어·문장·문서 등을 학습된 벡터 공간에 표현한다. 학습 목표와 데이터에 따라 관련 표현이 가까워지도록 학습되므로, 단어가 정확히 겹치지 않아도 의미적 유사성을 포착할 수 있다.
Word2Vec과 GloVe 같은 정적 단어 임베딩은 보통 단어마다 고정된 벡터를 부여한다. ELMo와 BERT 같은 문맥적 표현 모델은 주변 문맥에 따라 단어의 표현을 달리할 수 있다. 문장·문서 임베딩은 텍스트 전체를 비교하기 위한 벡터를 만든다. 모든 문맥 모델의 출력을 그대로 평균 내면 좋은 검색 임베딩이 된다고 보장할 수는 없다.
임베딩을 저차원 표현이라고 부를 때는 대개 큰 어휘 공간과 비교한 것이다. 실제 임베딩은 수백 또는 수천 차원일 수 있고, 작은 코퍼스의 TF-IDF보다 차원이 클 수도 있다. 영상의 1,536차원 임베딩과 시각화용 3차원 좌표는 서로 다른 데이터다.
코사인 유사도와 유클리드 거리
코사인 유사도는 두 벡터의 내적을 각 벡터의 길이로 나눈 값이다.
cosine(a, b) = (a · b) / (||a|| × ||b||)
0이 아닌 벡터에서 정의되며, 값의 범위는 -1부터 1까지다. 방향이 같으면 1이다. 유클리드 거리는 두 점 사이의 직선 거리이며, 작을수록 가깝다.
코사인은 길이 차이를 제거하고 방향을 비교하는 데 적합하다. 두 벡터를 단위 길이로 정규화하면 유클리드 거리² = 2 × (1 - 코사인 유사도)이므로 두 기준의 이웃 순위가 같아진다. 화면을 회전한다고 원래 벡터 사이의 거리나 코사인 유사도가 바뀌는 것은 아니다.
작동 원리
- 비교할 텍스트를 정한다. 영상은 도서 제목 50개를 사용한다. 제목만 입력했으므로 결과는 책 본문 전체의 유사도가 아니라 제목 표현의 유사도다.
- TF-IDF 표현을 만든다. 텍스트를 토큰화하고 어휘 사전을 구성한 뒤 문서별 가중치를 계산한다. 결과 행렬의 행은 책, 열은 어휘에 대응한다.
- 별도로 임베딩을 생성한다. 영상은
text-embedding-3-small을 사용해 각 제목을 1,536차원 벡터로 표현한다. TF-IDF 행렬을 해당 모델에 넣은 것이 아니라 제목 텍스트를 입력한 것이다. - 원래 벡터에서 유사도를 계산한다. 문서끼리 코사인 유사도를 계산하면 50 × 50 행렬을 얻는다. 자기 자신과의 유사도는 1이므로 추천 결과에서는 대각선 항목을 제외한다.
- 히트맵과 이웃 목록을 확인한다. 영상에서는 『밑바닥부터 시작하는 딥러닝』 시리즈가 서로 높은 유사도를 보였다. 수학 관련 제목들도 가까운 관계를 보였다. 이는 해당 표본의 관찰 결과이지 모든 코퍼스에서 보장되는 규칙은 아니다.
- 시각화용으로 차원을 축소한다. PCA 등으로 2차원이나 3차원 좌표를 만든다. 원래 공간의 정보를 일부 잃기 때문에 화면상의 근접성과 원래 벡터의 유사도는 다를 수 있다.
- Projector에서 탐색한다. 벡터를 담은
embeddings.tsv와 제목을 담은metadata.tsv를 준비한다. 두 파일은 같은 행이 같은 문서를 가리켜야 한다. 업로드 후 제목별 이웃과 군집을 살펴본다. - 벡터를 저장하고 재사용한다. 원문, 문서 ID, 임베딩 모델 정보와 함께 저장한다. 검색할 때는 질문도 호환되는 모델로 임베딩하고 가까운 문서를 찾는다. 검색된 원문을 생성 모델의 입력에 포함하면 검색 기반 답변으로 연결할 수 있다.
코드 예시
다음은 API 키 없이 실행하는 TF-IDF 기준선이다. 토큰화 결과, 숫자 표현, 코사인 유사도, 검색 순위를 차례로 확인한다. 영상의 코드를 복원한 것이 아니라 개념 이해를 위한 보충 예제다.
python -m pip install scikit-learn
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
# 공백 토큰화의 효과를 보기 위한 작은 예제 코퍼스
texts = [
"파이썬 데이터 분석 입문",
"파이썬 데이터 분석 실전",
"머신러닝 딥러닝 입문",
"개발자를 위한 수학",
"인공지능을 위한 수학",
]
options = {
"tokenizer": str.split,
"token_pattern": None,
"lowercase": False,
}
print("토큰:", texts[0].split())
bow = CountVectorizer(**options)
counts = bow.fit_transform(texts)
print("어휘:", bow.get_feature_names_out().tolist())
print("첫 문서 BoW:", counts[0].toarray()[0].tolist())
tfidf = TfidfVectorizer(**options)
matrix = tfidf.fit_transform(texts)
print("TF-IDF 행렬 크기:", matrix.shape)
# 첫 문서와 다른 문서 비교: 자기 자신은 제외한다.
scores = cosine_similarity(matrix[0], matrix).ravel()
ranking = sorted(
(i for i in range(len(texts)) if i != 0),
key=lambda i: scores[i],
reverse=True,
)
for i in ranking:
print(f"{scores[i]:.3f} {texts[i]}")
# 새 질문에도 학습 때 만든 동일한 어휘 사전을 사용한다.
query = "파이썬 분석"
query_vector = tfidf.transform([query])
if query_vector.nnz == 0:
print("질문에 어휘 사전의 단어가 없습니다.")
else:
query_scores = cosine_similarity(query_vector, matrix).ravel()
best = int(query_scores.argmax())
print("검색 결과:", texts[best])
fit_transform은 코퍼스에서 어휘와 IDF를 학습하고 문서를 변환한다. 새 질문에는 transform을 사용해야 같은 좌표계로 비교할 수 있다. cosine_similarity는 희소 행렬도 입력받으므로 전체 행렬을 밀집 형태로 변환할 필요가 없다.
첫 두 문서는 공통 단어가 많아 높은 점수를 얻는다. 반면 단어가 겹치지 않는 유사 표현은 TF-IDF만으로 잡기 어렵다. 이것이 임베딩과 비교할 기준선이 된다. 코드의 공백 토큰화는 설명을 위한 선택이며 한국어 조사·어미를 자동으로 분리하지 않는다.
함정·실수
- 토큰화·벡터화·임베딩을 반드시 연속된 세 단계로 생각한다. 임베딩은 벡터화의 한 방법이다. TF-IDF와 임베딩을 대안적인 표현 경로로 이해한다.
- 임베딩이면 의미가 완벽히 보존된다고 믿는다. 짧은 제목은 실제 내용이 달라도 비슷할 수 있다. 도메인, 언어, 입력 길이에 맞는 평가 사례를 준비한다.
- TF-IDF로는 유사도를 계산할 수 없다고 생각한다. TF-IDF도 코사인 비교가 가능하다. 다만 기본적으로 어휘의 겹침을 반영하며, 의미가 비슷한 다른 표현에는 취약할 수 있다.
- 밀집 벡터에는 0이 없다고 정의한다. 밀집은 대부분의 차원에 값이 채워진 표현을 뜻한다. 0의 존재 여부 자체가 기준은 아니다.
- 시각화에서 가까우면 원래 공간에서도 가깝다고 단정한다. 차원 축소는 정보를 잃는다. 원래 벡터의 이웃 목록과 점수로 확인한다.
- 시점을 돌리면 유클리드 거리가 바뀐다고 생각한다. 화면에서 겹쳐 보이는 정도가 바뀔 뿐이다. 회전은 원래 공간의 거리를 바꾸지 않는다.
- Transformer의 어텐션을 코사인 유사도라고 일반화한다. 표준적인 scaled dot-product attention은 Q와 K의 내적을 차원에 따라 조정하고 softmax를 적용한다. 코사인 유사도와 동일한 연산이 아니다.
- 토큰 표시가 깨져 보이면 토큰화가 실패했다고 판단한다. 바이트 단위 조각은 개별 표시에서 불완전한 문자처럼 보일 수 있다. 전체 입력의 인코딩과 디코딩 결과를 함께 확인한다.
- 벡터와 제목 파일의 행 순서를 다르게 저장한다. 엉뚱한 제목이 벡터에 연결된다. 문서 ID를 기준으로 순서를 고정하고 행 수를 검증한다.
베스트 프랙티스
- 작은 기준선부터 만든다. 키워드와 정확한 용어 일치가 중요한 작업은 TF-IDF부터 측정한다. 표현이 달라도 의미가 비슷한 문서를 찾아야 한다면 임베딩과 비교한다.
- 전처리를 모델에 맞춘다. 형태소 분석이나 불용어 제거가 전통적인 분석에 도움이 될 수 있지만, 사전 학습 모델 입력에서는 문맥을 훼손할 수 있다. 일괄 적용하지 말고 결과를 비교한다.
- 평가용 질문과 기대 문서를 준비한다. 같은 시리즈, 같은 주제의 다른 표현, 단어만 비슷한 다른 주제 등을 포함한다. 시각화의 인상보다 상위 검색 결과의 적절성을 우선한다.
- 유사도 점수를 확률로 해석하지 않는다. 코사인 유사도 0.8은 정답 확률 80%가 아니다. 모델과 데이터별로 적절한 기준을 정한다.
- 원래 벡터와 시각화 좌표를 구분해 저장한다. 검색에는 원래 임베딩을 사용하고, PCA 등의 출력은 탐색과 설명에 사용한다.
- 임베딩을 재사용할 수 있게 관리한다. 문서 ID, 원문 또는 원문 위치, 모델 식별자, 차원 수, 전처리 방식, 원문 변경 여부를 함께 기록한다. 텍스트나 모델 설정이 바뀌면 재생성 여부를 판단한다.
- 규모에 맞게 저장소를 선택한다. 작은 데이터는 파일과 메모리 연산으로 시작할 수 있다. 대규모 근접 검색, 메타데이터 필터, 지속적인 갱신이 필요해지면 벡터 검색 기능을 갖춘 저장소를 검토한다.
참고
영상에서 언급한 자료와 도구는 다음과 같다. 정확한 실습 노트북 주소와 도서 제목 50개의 전체 목록은 제공된 자막에 명시되어 있지 않다.
- TensorFlow Embedding Projector: 벡터와 메타데이터를 올려 차원 축소 결과와 이웃을 탐색하는 도구.
- OpenAI Tokenizer 및 tiktoken: 모델별 토큰 분할을 살펴보는 도구.
- OpenAI
text-embedding-3-small: 영상의 도서 제목 임베딩 실습에 사용한 모델. - Google Colab: 실습 실행 환경. 영상은 보안 비밀 저장 기능으로 API 키를 가져온다.
- pandas, NumPy, seaborn, Matplotlib, koreanize-matplotlib: 표 처리, 수치 계산, 시각화와 한글 표시 도구.
- RNN Explainer: 임베딩과 LSTM 기반 감성 분석 흐름을 시각적으로 설명하는 자료.
- KoNLPy, MeCab, Kiwi: 한국어 형태소 분석 관련 도구.
- Hugging Face: 다양한 자연어 처리 모델과 임베딩 모델을 찾아보는 플랫폼.
- 『모두의 한국어 텍스트 분석 with 파이썬』: BoW와 TF-IDF 설명에 활용한 책.
- 『NLP와 LLM 실전 가이드』, 『밑바닥부터 시작하는 딥러닝』 시리즈, 『핸즈온 머신러닝』 등: 제목 유사도 분석에서 언급한 도서.