CountVectorizer는 문서 안의 단어 등장 횟수를 세어 문자열 목록을 문서-단어 행렬로 바꾸는 scikit-learn 텍스트 벡터화 도구입니다.
이 글은 vocabulary가 단어별 인덱스를 만들고, document-term matrix가 각 문서의 단어 등장 횟수를 벡터로 표현하는 과정을 정리합니다.
핵심 정리
CountVectorizer는 문장이나 문서 전체를 숫자 벡터로 바꿉니다. 먼저 전체 문서에서 등장한 단어들을 모아 vocabulary를 만들고, 각 단어에 열 인덱스를 부여합니다. 그 다음 각 문서마다 해당 단어가 몇 번 등장했는지를 세어 행렬을 만듭니다. 따라서 벡터 하나는 단어 하나가 아니라 문서 하나를 표현하며, 각 위치의 값은 해당 단어의 등장 횟수를 뜻합니다.
- vocabulary는 단어를 열 인덱스에 매핑한 사전입니다.
- document-term matrix는 문서별 단어 등장 횟수를 담은 행렬입니다.
- 행은 문서 하나를 의미하고 열은 vocabulary의 단어 하나를 의미합니다.
- CountVectorizer는 단어 순서보다 등장 횟수에 초점을 둡니다.
- toarray를 쓰면 sparse matrix 결과를 일반 배열 형태로 볼 수 있습니다.
- 스팸 분류처럼 텍스트를 머신러닝 입력으로 바꿀 때 기본 출발점으로 쓸 수 있습니다.
원문은 예제 코드가 바로 나오기 때문에 vocabulary와 행렬의 의미를 먼저 잡지 않으면 숫자가 낯설 수 있습니다. 이번 보강은 코드 결과를 해석하는 기준을 앞에 추가했습니다.
이어서 볼 글
- TfidfVectorizer 사용법: 문자열을 TF-IDF 벡터로 변환 - 단어 등장 횟수 벡터화 다음에 IDF 가중치를 더한 방식이다.
- Word2Vec 개념: CBOW와 Skip-gram 차이 - 빈도 기반 벡터화와 학습 기반 단어 임베딩을 비교할 수 있다.
여기참조
from sklearn.feature_extraction.text import CountVectorizer
documents = [
'Hello, how are you? hello',
'I am fine, thank you.'
]
# CountVectorizer 인스턴스 생성
vectorizer = CountVectorizer()
# 문서를 피팅하고 변환
X = vectorizer.fit_transform(documents)
# 결과를 배열로 변환
X_array = X.toarray()
# 어휘 출력
print("Vocabulary: ", vectorizer.vocabulary_)
# 문서-단어 행렬 출력
print("Document-Term Matrix:\n", X_array)
결과
Vocabulary: {'hello': 3, 'how': 4, 'are': 1, 'you': 6, 'am': 0, 'fine': 2, 'thank': 5}
Document-Term Matrix:
[[0 1 0 2 1 0 1]
[1 0 1 0 0 1 1]]
Vocabulary는 단어별로 인덱스를 생성해주는 과정이고,
Document-Term Matrix를 통해 문자열을 벡터화 해준다.
벡터화 방법은 인덱스 위치별 등장횟수를 카운팅하는 단순한 방법이다.
특징
* 단어를 벡터로 표현한게 아니라. 문장(또는 문서) 전체가 하나의 벡터로 표현된다.
CountVector를 통한 스펨메일분류기 만들기
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# 샘플 데이터: 이메일 텍스트와 스팸 여부
emails = ["Free money now!!!", "Hi Bob, how about a game of golf tomorrow?", "Exclusive offer, limited time only"]
labels = [1, 0, 1] # 1: 스팸, 0: 비스팸
# CountVectorizer로 텍스트 벡터화
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(emails)
# 결과를 배열로 변환
X_array = X.toarray()
# 어휘 출력
print("Vocabulary: ", vectorizer.vocabulary_)
# 문서-단어 행렬 출력
print("Document-Term Matrix:\n", X_array)
y = labels
# 데이터를 훈련 세트와 테스트 세트로 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
# 로지스틱 회귀 모델 훈련
model = LogisticRegression()
model.fit(X_train, y_train)
# 스팸 탐지 테스트
print(model.score(X_test, y_test))
결과
Vocabulary: {'free': 3, 'money': 9, 'now': 10, 'hi': 6, 'bob': 1, 'how': 7, 'about': 0, 'game': 4, 'of': 11, 'golf': 5, 'tomorrow': 15, 'exclusive': 2, 'offer': 12, 'limited': 8, 'time': 14, 'only': 13}
Document-Term Matrix:
[[0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0]
[1 1 0 0 1 1 1 1 0 0 0 1 0 0 0 1]
[0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 0]]
1.0
문장에서 벡터로 변환하는 방법이 단순하여 실용성은 적다.
하지만 자주 등장하는 단어가 주요하게 쓰이는 경우도 있고, 특징 추출의 기본이기 때문에 알아두어야한다.
'AI, ML > ML' 카테고리의 다른 글
| TF-IDF 개념: TF와 IDF로 단어 중요도 계산 (0) | 2024.03.12 |
|---|---|
| TfidfVectorizer 사용법: 문자열을 TF-IDF 벡터로 변환 (0) | 2024.03.12 |
| Feature cardinality 개념: 범주값 종류 수와 모델링 영향 (2) | 2024.01.07 |
| Dense Feature vs Sparse Feature: 원핫 인코딩, 임베딩, XGBoost (0) | 2024.01.07 |
| Binning 개념과 데이터 구간화: Label Encoding, One-Hot Encoding (0) | 2023.12.28 |
