Bag of Words: 텍스트 데이터의 수치적 표현 방법
- BoW의 개념 및 특징
- BoW 생성 프로세스
- 실제 구현 예시
- Python을 활용한 BoW 구현
- BoW의 장단점
- BoW의 발전된 형태
- 실제 적용 사례
- 실제 비즈니스 활용 예시
- 결론 및 미래 전망
- Keywords
Bag of Words(BoW)는 자연어 처리(NLP) 분야에서 텍스트 데이터를 수치화하는 가장 기본적인 방법입니다. 단어의 출현 빈도(frequency)에 기반하여 텍스트를 벡터로 변환하는 기법으로, 단어의 등장 순서는 고려하지 않는 특징이 있습니다.
BoW의 개념 및 특징
- 핵심 아이디어: 문서를 단어들의 '가방(bag)'으로 간주하며, 단어의 위치나 순서를 무시하고 오직 출현 빈도만을 계산
- 구조적 특징: 단어의 시맨틱(의미) 관계나 문법적 구조를 고려하지 않음
- 차원: 전체 어휘 집합(vocabulary)의 크기만큼의 차원을 가짐
- 활용 영역: 문서 분류, 감성 분석, 문서 유사도 계산, 스팸 필터링 등
BoW 생성 프로세스
BoW 모델을 구축하는 과정은 일반적으로 다음과 같은 단계로 이루어집니다:
- 토큰화(Tokenization): 문서를 단어 또는 토큰으로 분리
- 어휘 집합 생성: 모든 고유 단어에 인덱스 할당
- 벡터화: 각 문서를 벡터로 변환, 각 인덱스 위치는 해당 단어의 등장 빈도를 나타냄
graph TD
A[텍스트 문서] --> B[토큰화]
B --> C[어휘 집합 생성]
C --> D[인덱스 할당]
D --> E[빈도수 계산]
E --> F[벡터 생성]
실제 구현 예시
예를 들어, 다음과 같은 문장이 있다고 가정해보겠습니다:
"정부가 발표하는 물가상승률과 소비자가 느끼는 물가상승률은 다르다."
1. 토큰화
문장을 단어 단위로 분리합니다:
["정부", "가", "발표", "하는", "물가상승률", "과", "소비자", "가", "느끼는", "물가상승률", "은", "다르다"]
2. 어휘 집합 생성 및 인덱스 할당
고유한 단어들을 추출하고 각각에 인덱스를 부여합니다:
{
'정부': 0,
'가': 1,
'발표': 2,
'하는': 3,
'물가상승률': 4,
'과': 5,
'소비자': 6,
'느끼는': 7,
'은': 8,
'다르다': 9
}
3. 빈도 벡터 생성
각 단어의 출현 빈도를 기록한 벡터를 생성합니다:
[1, 2, 1, 1, 2, 1, 1, 1, 1, 1]
- '정부': 1번 등장
- '가': 2번 등장
- '발표': 1번 등장
- ...
- '물가상승률': 2번 등장
Python을 활용한 BoW 구현
from sklearn.feature_extraction.text import CountVectorizer
# 예시 문서
documents = [
"정부가 발표하는 물가상승률과 소비자가 느끼는 물가상승률은 다르다.",
"소비자는 주로 식품과 에너지 가격 상승을 체감한다."
]
# CountVectorizer 객체 생성
vectorizer = CountVectorizer()
# BoW 모델 학습 및 변환
X = vectorizer.fit_transform(documents)
# 어휘 집합 확인
print("어휘 집합:", vectorizer.get_feature_names_out())
# BoW 벡터 확인
print("BoW 벡터:\n", X.toarray())
BoW의 장단점
장점
- 구현이 간단함: 복잡한 알고리즘 없이 직관적인 방식으로 구현 가능
- 계산 효율성: 벡터 연산이 빠르고 효율적
- 실용성: 문서 분류 및 클러스터링에서 효과적인 성능 발휘
- 해석 용이성: 결과물이 이해하기 쉬움
단점
- 단어 순서 무시: 문장의 의미와 맥락을 완전히 포착하지 못함
- 예: "고양이가 쥐를 쫓는다" vs "쥐가 고양이를 쫓는다" - 동일한 BoW 벡터 생성
- 희소성(Sparsity): 대부분의 값이 0인 고차원 희소 벡터 생성
- 단어 중요도 미반영: 자주 등장하는 불용어(stopwords)가 과도하게 강조될 수 있음
- 새로운 단어 처리 불가: 훈련 데이터에 없는 단어 등장 시 처리 어려움
BoW의 발전된 형태
1. TF-IDF (Term Frequency-Inverse Document Frequency)
단순 빈도수가 아닌 단어의 중요도를 반영하는 가중치 부여 방식
graph LR
A[단어 빈도 TF] --> C[TF-IDF]
B[역문서 빈도 IDF] --> C
C --> D[가중치가 적용된 벡터]
2. N-gram 모델
연속된 N개의 단어를 하나의 토큰으로 처리하여 문맥 정보 일부 보존
유니그램(1-gram): ["정부", "가", "발표", ...]
바이그램(2-gram): ["정부가", "가발표", "발표하는", ...]
트라이그램(3-gram): ["정부가발표", "가발표하는", ...]
3. Word Embeddings
단어를 의미적 관계가 보존되는 밀집 벡터(dense vector)로 표현
- Word2Vec, GloVe, FastText 등의 방법론 존재
실제 적용 사례
텍스트 분류
- 뉴스 기사 카테고리 분류
- 스팸 메일 필터링
- 감성 분석(긍정/부정 분류)
정보 검색
- 문서 유사도 계산
- 검색 엔진의 문서 랭킹
추천 시스템
- 콘텐츠 기반 필터링
- 사용자 리뷰 분석
이상 탐지
- 비정상적인 텍스트 패턴 감지
- 사기 감지 시스템
실제 비즈니스 활용 예시
금융 분야: 뉴스 감성 분석을 통한 주가 예측
# 금융 뉴스 감성 분석 예시
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
# 학습 데이터
news_data = [
"기업 실적 상승으로 주가 상승 전망",
"경기 침체 우려로 투자심리 위축",
# ... 더 많은 뉴스 데이터
]
labels = [1, 0] # 1: 긍정, 0: 부정
# BoW 모델 생성
vectorizer = CountVectorizer()
X_train = vectorizer.fit_transform(news_data)
# 분류기 학습
classifier = MultinomialNB()
classifier.fit(X_train, labels)
# 새로운 뉴스 분류
new_news = ["신제품 출시로 매출 증가 예상"]
X_new = vectorizer.transform(new_news)
prediction = classifier.predict(X_new)
print("뉴스 감성:", "긍정" if prediction[0] == 1 else "부정")
고객 서비스: 민원 자동 분류 시스템
# 민원 자동 분류 예시
complaints = [
"제품이 작동하지 않습니다. 환불해주세요.",
"배송이 지연되고 있어요. 언제 도착하나요?",
"앱이 자꾸 충돌해서 사용할 수 없어요.",
# ... 더 많은 민원 데이터
]
categories = ["환불요청", "배송문의", "기술지원"] # 민원 카테고리
# 위와 유사한 방식으로 분류 모델 구축 가능
결론 및 미래 전망
Bag of Words는 간단하지만 강력한 텍스트 표현 방법으로, 텍스트 마이닝과 자연어 처리의 기본 토대를 제공합니다. 단어의 순서와 문맥을 고려하지 못하는 한계에도 불구하고, 여전히 많은 실용적인 NLP 응용에서 중요한 역할을 담당하고 있습니다.
최근에는 BERT, GPT와 같은 트랜스포머 기반 모델이 등장하면서 BoW의 한계를 극복한 고급 텍스트 표현 방법들이 개발되고 있습니다. 그러나 이러한 복잡한 모델들조차 기본적인 아이디어인 텍스트의 수치적 표현이라는 BoW의 핵심 개념에 기반하고 있습니다.
따라서 NLP를 배우는 초보자나 간단한 텍스트 분석을 수행하는 실무자에게 BoW는 여전히 중요한 출발점이 되며, 더 복잡한 모델을 이해하기 위한 기초 지식으로서 그 가치를 유지하고 있습니다.
Keywords
Bag of Words, 단어 빈도, 텍스트 벡터화, NLP, 문서 분류, TF-IDF, 자연어처리, 텍스트 마이닝, 토큰화, 어휘 집합
'IT Professional Engineering > AI.ML' 카테고리의 다른 글
TF-IDF(Term Frequency-Inverse Document Frequency): 텍스트 분석의 핵심 가중치 기법 (0) | 2025.04.21 |
---|---|
Document-Term Matrix (DTM): 텍스트 분석의 기본 구조와 활용 방법 (0) | 2025.04.21 |
카운트 기반 단어 표현: 텍스트 데이터 수치화 기법의 핵심 (0) | 2025.04.21 |
언어모델(Language Model): 자연어 처리의 핵심 기술 (0) | 2025.04.21 |
Text Preprocessing Tools for Korean Text: 한국어 자연어 처리의 필수 요소 (0) | 2025.04.21 |