티스토리 뷰

728x90
반응형

자연어 처리(NLP) 분야에서 텍스트 데이터를 분석하고 분류하는 데 자주 사용되는 두 가지 기법인 나이브 베이즈(Naive Bayes) 분류기와 Bag of Words (BoW) 모델에 대해 알아보겠습니다. 이 두 가지는 함께 사용되며, 텍스트 분류 문제를 해결하는 데 매우 효과적입니다.

1. Bag of Words (BoW) 모델

Bag of Words 모델은 텍스트 데이터를 수치적으로 표현하는 방법으로, 각 문서에서 단어의 출현 빈도를 기반으로 합니다. BoW는 다음과 같은 특징을 가집니다:

  • 문서 표현: 각 문서는 단어의 빈도를 나타내는 벡터로 변환됩니다. 이때 단어의 순서는 고려되지 않습니다.
  • 특징 벡터: 각 단어는 고유한 인덱스를 가지고, 문서에서 해당 단어가 얼마나 등장했는지를 세어 벡터로 표현합니다.

예시

예를 들어, 두 개의 문서가 있다면:

  • 문서 1: "나는 사과를 좋아합니다"
  • 문서 2: "나는 배를 좋아합니다"

BoW를 사용하여 두 문서를 다음과 같은 벡터로 변환할 수 있습니다:

  • 단어 목록: ["나는", "사과를", "좋아합니다", "배를"]
  • 문서 1: [1, 1, 1, 0]
  • 문서 2: [1, 0, 1, 1]

2. 나이브 베이즈 분류기

나이브 베이즈는 확률 기반의 분류기입니다. 이 알고리즘은 주어진 데이터의 특성이 서로 독립적이라는 가정하에 작동합니다. 각 특성이 클래스에 미치는 영향을 계산하여, 주어진 문서가 특정 클래스에 속할 확률을 추정합니다.

나이브 베이즈의 특징

  • 독립성 가정: 각 특성이 독립적이라고 가정하여 계산의 복잡성을 줄입니다.
  • 빠른 학습 및 예측: 상대적으로 간단한 알고리즘으로, 학습과 예측 속도가 빠릅니다.

3. BoW와 나이브 베이즈의 연결

BoW 모델로 변환된 텍스트 데이터를 나이브 베이즈 분류기에 입력하면, 각 단어의 출현 빈도에 기반하여 문서의 클래스를 예측할 수 있습니다. 이 조합은 텍스트 분류 작업에서 매우 효과적입니다.

4. Python 코드 예제

아래는 Scikit-learn 라이브러리를 사용하여 BoW 모델과 나이브 베이즈 분류기를 구현하는 예제입니다.

코드 구현

python

import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn import metrics

# 예제 데이터
documents = [
    "나는 프로그래밍을 사랑합니다",
    "Python은 데이터 과학에 좋습니다",
    "나는 새로운 알고리즘을 배우는 것을 즐깁니다",
    "데이터 과학은 매력적입니다",
    "나는 코드의 버그를 싫어합니다",
    "디버깅은 재미없습니다"
]

# 레이블 (긍정, 부정)
labels = ['positive', 'positive', 'positive', 'positive', 'negative', 'negative']

# 1. Bag of Words 모델 생성
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(documents)

# 2. 데이터 분할 (훈련/테스트)
X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.3, random_state=42)

# 3. 나이브 베이즈 분류기 학습
model = MultinomialNB()
model.fit(X_train, y_train)

# 4. 예측
y_pred = model.predict(X_test)

# 5. 성능 평가
accuracy = metrics.accuracy_score(y_test, y_pred)
print(f'정확도: {accuracy:.2f}')

# 6. 예측 결과 출력
for doc, pred in zip(X_test, y_pred):
    print(f'문서: {vectorizer.inverse_transform(doc)}, 예측: {pred}')

코드 설명

  1. 데이터 준비: 간단한 문서와 그에 대한 레이블(긍정/부정)을 설정합니다.
  2. BoW 모델 생성: CountVectorizer를 사용하여 문서를 BoW 형태로 변환합니다.
  3. 데이터 분할: 데이터를 훈련 세트와 테스트 세트로 나눕니다.
  4. 모델 학습: MultinomialNB를 사용하여 나이브 베이즈 분류기를 학습시킵니다.
  5. 예측: 테스트 세트에 대해 예측을 수행합니다.
  6. 성능 평가: 정확도를 계산하고 예측 결과를 출력합니다.

5. 결론

이번 포스트에서는 Bag of Words 모델과 나이브 베이즈 분류기의 연결에 대해 알아보았습니다. BoW는 텍스트 데이터를 수치적으로 표현하는 데 유용하고, 나이브 베이즈는 이러한 수치 데이터를 기반으로 확률적 분류를 수행하는 강력한 도구입니다. 이 두 가지 기법을 결합하여 텍스트 분류 문제를 효과적으로 해결할 수 있습니다. Python을 사용한 간단한 예제를 통해 이 과정을 직접 실습해 보시기 바랍니다.

728x90
반응형