반응형

CountVectorizer는 문서 안의 단어 등장 횟수를 세어 문자열 목록을 문서-단어 행렬로 바꾸는 scikit-learn 텍스트 벡터화 도구입니다.

이 글은 vocabulary가 단어별 인덱스를 만들고, document-term matrix가 각 문서의 단어 등장 횟수를 벡터로 표현하는 과정을 정리합니다.

 

핵심 정리

CountVectorizer는 문장이나 문서 전체를 숫자 벡터로 바꿉니다. 먼저 전체 문서에서 등장한 단어들을 모아 vocabulary를 만들고, 각 단어에 열 인덱스를 부여합니다. 그 다음 각 문서마다 해당 단어가 몇 번 등장했는지를 세어 행렬을 만듭니다. 따라서 벡터 하나는 단어 하나가 아니라 문서 하나를 표현하며, 각 위치의 값은 해당 단어의 등장 횟수를 뜻합니다.

  • vocabulary는 단어를 열 인덱스에 매핑한 사전입니다.
  • document-term matrix는 문서별 단어 등장 횟수를 담은 행렬입니다.
  • 행은 문서 하나를 의미하고 열은 vocabulary의 단어 하나를 의미합니다.
  • CountVectorizer는 단어 순서보다 등장 횟수에 초점을 둡니다.
  • toarray를 쓰면 sparse matrix 결과를 일반 배열 형태로 볼 수 있습니다.
  • 스팸 분류처럼 텍스트를 머신러닝 입력으로 바꿀 때 기본 출발점으로 쓸 수 있습니다.

원문은 예제 코드가 바로 나오기 때문에 vocabulary와 행렬의 의미를 먼저 잡지 않으면 숫자가 낯설 수 있습니다. 이번 보강은 코드 결과를 해석하는 기준을 앞에 추가했습니다.

이어서 볼 글

 

여기참조

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

문장에서 벡터로 변환하는 방법이 단순하여 실용성은 적다.

하지만 자주 등장하는 단어가 주요하게 쓰이는 경우도 있고, 특징 추출의 기본이기 때문에 알아두어야한다.

반응형

+ Recent posts