카운트 기반 단어 표현: 국소표현에서 분산표현으로 가는 지도
One-Hot·BoW·DTM·TF-IDF 같은 국소표현과 LSA·GloVe 같은 카운트 기반 분산표현의 차이, 한계, 실제 활용 사례를 정리한다.
2026-08-14 · 최초 발행 2025-05-23
텍스트 데이터를 기계가 이해할 수 있는 수치로 바꾸는 방법 중 가장 기본적이면서도 핵심적인 접근이 카운트 기반 단어 표현(Count-based Word Representation)이다. 단어의 출현 빈도를 기반으로 텍스트를 벡터 공간에 매핑하는 이 기법은 자연어 처리(NLP)의 기초를 이룬다.
국소표현과 분산표현이라는 갈래
단어를 수치로 표현하는 방식은 크게 두 갈래로 나뉜다.
국소표현(Local Representation)은 개별 단어를 독립적인 개체로 취급해 단어 간 의미적 관계나 뉘앙스를 표현하지 못한다. 이산표현(Discrete Representation)이라고도 부르며, One-Hot 인코딩·Bag of Words·DTM·TF-IDF가 여기 속한다.
분산표현(Distributed Representation)은 단어의 의미를 다차원 벡터 공간에 분산해 표현해 단어 간 의미적 유사성과 뉘앙스를 표현할 수 있다. 연속표현(Continuous Representation)이라고도 부르며, Word2Vec·FastText·GloVe·LSA가 여기 속한다.
BoW·DTM·TF-IDF, 빈도를 세는 방식들
카운트 기반 방법론은 단어를 세는 방식에 따라 세 가지로 나뉜다.
Bag of Words(BoW)는 텍스트에 등장하는 단어의 빈도를 카운트해 수치화하는 방식으로, 단어의 순서나 문법적 구조를 무시하는 대신 직관적이고 구현이 간단하다. "나는 사과를 좋아한다. 나는 바나나도 좋아한다."라는 문장은 {"나는": 2, "사과를": 1, "좋아한다": 2, "바나나도": 1}로 바뀐다.
문서-단어 행렬(Document Term Matrix, DTM)은 BoW를 확장한 형태로, 문서 집합(코퍼스)에서 각 문서를 행, 전체 등장 단어를 열로 하는 행렬을 구성한다. 각 셀은 해당 문서에서 단어의 등장 빈도를 나타내며, 대규모 코퍼스에서는 희소 행렬(sparse matrix)이 된다.
TF-IDF(Term Frequency-Inverse Document Frequency)는 단순 빈도수 기반의 BoW·DTM이 갖는 한계를 보완해, 문서 내 단어 빈도(TF)와 문서 빈도의 역수(IDF)를 곱해 단어의 중요도에 따른 가중치를 부여한다. 이 덕분에 모든 문서에 공통적으로 자주 등장하는 단어(예: '그리고', '또한')의 중요도는 낮아지고, 특정 문서에서만 자주 등장하는 단어의 중요도는 높아져 검색 엔진, 문서 분류, 주제 모델링 등에 널리 활용된다.
국소표현이 부딪히는 벽
국소표현은 단어 간 의미적 관계를 파악하지 못한다. 대규모 어휘에서는 고차원 희소 벡터가 만들어지는 희소성(sparsity) 문제가 있고, 동의어(synonyms)를 처리하지 못해 다른 단어로 표현된 동일 개념을 인식하지 못하며, 다의어(polysemy)도 처리하지 못해 같은 단어라도 다른 문맥의 의미를 구분하지 못한다. "bank"(은행 vs 강둑), "apple"(과일 vs 기업)처럼 문맥에 따라 뜻이 갈리는 단어의 의미를 구분할 수 없는 것이 대표적인 예다.
카운트 기반에서도 분산표현으로 가는 길
카운트 기반 방법론 안에서도 분산표현으로 가는 길이 개발됐다.
LSA(Latent Semantic Analysis, 잠재 의미 분석)는 DTM에 특이값 분해(SVD)를 적용해 차원을 축소하고, 단어-문서 간 잠재적 의미 관계를 포착한다. 전체 문서 집합을 활용하는 Full Document 접근법을 쓴다.
GloVe(Global Vectors for Word Representation)는 카운트 기반과 예측 기반의 장점을 결합해, 단어 동시 등장(co-occurrence) 통계와 지역적 문맥 정보를 활용한다. 윈도우(window) 기반 접근법으로 단어 주변 문맥을 고려한다.
Python으로 확인해보는 최소 예제
코드로 확인하면 BoW와 TF-IDF가 같은 문서 집합에서 어떻게 다른 벡터를 만들어내는지 명확해진다.
from sklearn.feature_extraction.text import CountVectorizer
# 예시 문서
corpus = [
"나는 사과를 좋아한다.",
"나는 바나나도 좋아한다.",
"그는 사과를 싫어한다."
]
# CountVectorizer 객체 생성 및 적용
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
# 어휘 사전 확인
print("어휘 사전:", vectorizer.get_feature_names_out())
# BoW 행렬 확인
print("BoW 행렬:\n", X.toarray())
출력 결과:
어휘 사전: ['그는' '나는' '바나나도' '사과를' '좋아한다' '싫어한다']
BoW 행렬:
[[0 1 0 1 1 0]
[0 1 1 0 1 0]
[1 0 0 1 0 1]]
from sklearn.feature_extraction.text import TfidfVectorizer
# 예시 문서
corpus = [
"나는 사과를 좋아한다.",
"나는 바나나도 좋아한다.",
"그는 사과를 싫어한다."
]
# TfidfVectorizer 객체 생성 및 적용
tfidf_vectorizer = TfidfVectorizer()
X_tfidf = tfidf_vectorizer.fit_transform(corpus)
# 어휘 사전 확인
print("어휘 사전:", tfidf_vectorizer.get_feature_names_out())
# TF-IDF 행렬 확인
print("TF-IDF 행렬:\n", X_tfidf.toarray())
카운트 기반 표현이 실제로 쓰이는 곳
문서 분류에서는 스팸 메일 필터링(특정 단어 패턴의 빈도로 스팸 여부 판단), 감성 분석(긍정/부정 단어의 분포로 감성 판단), 주제 분류(단어 분포 기반 카테고리 분류)에 쓰인다. 정보 검색에서는 검색 엔진의 쿼리-문서 유사도 계산에 TF-IDF를 활용하고, 문서 랭킹에서도 연관성에 따라 순위를 매기는 데 쓰인다. 추천 시스템에서는 콘텐츠 기반 필터링(사용자가 선호한 문서와 유사한 단어 분포의 새 문서 추천)과 아이템 유사도 측정(상품 설명글의 단어 분포 기반 유사 상품 추천)에 활용된다. 주제 모델링에서는 LDA(Latent Dirichlet Allocation)가 DTM을 기반으로 문서에 잠재된 주제를 추출하고, 자동 요약에서는 중요 단어와 문장을 추출해 문서를 요약한다.
카운트 기반 방식의 득과 실
장점은 직관적이고 구현이 간단하며, 계산 효율성과 해석 가능성(interpretability)이 높고, 작은 데이터셋에서도 비교적 잘 작동하며, 정보 검색 같은 특정 응용에서는 여전히 강력한 성능을 낸다는 점이다.
단점은 단어의 의미와 문맥을 고려하지 못하고, 단어 순서 정보를 잃으며, 고차원 벡터 공간에서 희소성 문제가 생기고, 학습 시 보지 못한 단어를 처리하지 못하는 OOV(Out-of-Vocabulary) 문제가 있으며, 최신 딥러닝 기반 NLP 모델에 비해 성능이 제한적이라는 점이다.
최신 NLP에서도 카운트 기반이 남아있는 이유
현대 NLP에서는 BERT, GPT와 같은 트랜스포머 기반 모델이 주류를 이루고 있지만, 카운트 기반 단어 표현은 여전히 중요한 위치를 차지한다. 기초 전처리 단계에서 활용되고, 계산 효율성이 중요한 실시간 응용에서 쓰이며, 딥러닝 모델 학습을 위한 초기 특성 추출에도 활용된다. 해석 가능성이 중요한 의료·법률 같은 분야에서는 여전히 선호되고, 텍스트 마이닝의 기본 원리로서 교육적 가치도 유지하고 있다.