관리 메뉴

Bull

[AI::NLP] Bag-of-Words (BoW) 모델 본문

Artificial Intelligence/NLP

[AI::NLP] Bag-of-Words (BoW) 모델

Bull_ 2024. 7. 20. 22:32

Gensim 공식 문서의 내용을 GPT로 정리하였습니다.

https://radimrehurek.com/gensim/auto_examples/tutorials/run_word2vec.html#sphx-glr-auto-examples-tutorials-run-word2vec-py

 

Gensim: topic modelling for humans

Efficient topic modelling in Python

radimrehurek.com

 

Bag-of-Words (BoW) 모델

Bag-of-Words (BoW) 모델은 텍스트 데이터를 수치 데이터로 변환하는 가장 기본적인 자연어 처리 기법 중 하나입니다. BoW 모델은 문서의 단어 빈도에 기반하여 각 단어를 벡터로 표현합니다. 이 글에서는 BoW 모델의 핵심 개념과 장단점을 간단히 설명하고, 파이썬을 사용한 예제를 제공하겠습니다.

Bag-of-Words 모델의 핵심 개념

  1. 단어 빈도: 문서에 등장하는 각 단어의 빈도를 계산합니다.
  2. 벡터화: 각 문서를 단어 빈도 벡터로 변환합니다. 벡터의 각 요소는 특정 단어의 빈도를 나타냅니다.
  3. 순서 무시: BoW 모델은 단어의 순서를 무시하고, 단어의 빈도만을 고려합니다.

장단점

  • 장점:
    • 구현이 간단하고, 빠르게 계산할 수 있습니다.
    • 텍스트 분류, 군집화 등의 기본적인 작업에 효과적입니다.
  • 단점:
    • 단어의 순서를 무시하므로 문장의 문맥 정보를 잃게 됩니다.
    • 희소 행렬(sparse matrix) 문제: 단어가 많아질수록 벡터가 커지고, 많은 0이 포함된 희소 행렬이 됩니다.

예제: 파이썬을 사용한 BoW 모델 구현

파이썬의 CountVectorizer를 사용하여 간단한 BoW 모델을 구현하는 예제를 보여드리겠습니다.

from sklearn.feature_extraction.text import CountVectorizer

# 예제 문장
documents = [
    "John likes to watch movies. Mary likes movies too.",
    "John also likes to watch football games. Mary hates football."
]

# CountVectorizer 객체 생성
vectorizer = CountVectorizer()

# 문서를 BoW 벡터로 변환
X = vectorizer.fit_transform(documents)

# 특성 이름 출력
print("특성 이름:\n", vectorizer.get_feature_names_out())
print()
# 희소 행렬 출력
print("BoW 벡터 (희소 행렬):\n", X)
print()
# BoW 벡터 (밀집 행렬) 출력
print("BoW 벡터 (밀집 행렬):\n", X.toarray())
특성 이름:
 ['also' 'football' 'games' 'hates' 'john' 'likes' 'mary' 'movies' 'to'
 'too' 'watch']

BoW 벡터 (희소 행렬):
   (0, 4)    1
  (0, 5)    2
  (0, 8)    1
  (0, 10)    1
  (0, 7)    2
  (0, 6)    1
  (0, 9)    1
  (1, 4)    1
  (1, 5)    1
  (1, 8)    1
  (1, 10)    1
  (1, 6)    1
  (1, 0)    1
  (1, 1)    2
  (1, 2)    1
  (1, 3)    1

BoW 벡터 (밀집 행렬):
 [[0 0 0 0 1 2 1 2 1 1 1]
 [1 2 1 1 1 1 1 0 1 0 1]]

예제 설명

  1. 입력 데이터: documents는 두 개의 문장으로 구성된 리스트입니다.
  2. CountVectorizer 객체 생성: CountVectorizer는 텍스트 데이터를 BoW 벡터로 변환하는 객체입니다.
  3. fit_transform 메서드: fit_transform 메서드는 문서 목록을 입력으로 받아 BoW 벡터로 변환합니다.
  4. 결과 출력:
    모든 튜플과 리스트는 Feature를 중심으로 설명합니다. 헷갈린다면 Feature 리스트의 순서에 집중하세요.
    • 특성 이름 (Feature Names): 각 단어가 위치한 열을 나타냅니다. 예를 들어, 4는 'john'을 나타내며, 'john'은 첫 번째 문서에서 두 번 등장합니다. 피쳐는 알파벳 순으로 정리됩니다.
    • 희소 행렬 (Sparse Matrix): (0, 4) 1는 첫 번째 문서의 다섯 번째 단어(john)가 1번 등장했음을 의미합니다. 00 열은 문서에서 해당 위치에 해당하는 단어가 등장하지 않기 때문에 표시되지 않습니다.
    • 밀집 행렬 (Dense Matrix): 희소 행렬을 밀집 행렬로 변환한 형태입니다. 첫 번째 행의 첫 번째 열이 0인 이유는 첫 번째 문서에 'also' 단어가 없기 때문입니다.

결과 해석

위의 예제에서, CountVectorizer는 문서에 등장하는 모든 단어의 빈도를 계산하여 BoW 벡터로 변환합니다. 예를 들어, "John also likes to watch football games. Mary hates football."라는 문장은 다음과 같은 BoW 벡터로 변환될 수 있습니다:

[1 2 1 1 1 1 1 1 1 0 1]
== ['also' 'football' 'games' 'hates' 'john' 'likes' 'mary' 'movies' 'to'
 'too' 'watch']의 빈도수

이 벡터는 각 단어의 빈도를 나타내며, 벡터의 각 요소는 특정 단어의 빈도를 나타냅니다. 이 방식으로 BoW 모델은 텍스트 데이터를 수치 데이터로 변환하여 머신 러닝 모델에 사용할 수 있습니다.

BoW 모델의 한계

BoW 모델은 매우 효과적이지만 몇 가지 중요한 한계가 있습니다:

  1. 단어 순서 정보 손실:
    • BoW 모델은 단어의 순서를 무시합니다. 예를 들어, "John likes Mary"와 "Mary likes John"은 동일한 벡터로 변환됩니다.
    • 해결책: N-그램 모델은 단어 구를 길이 n으로 고려하여 로컬 단어 순서를 캡처하지만, 데이터 희소성과 고차원 문제를 겪을 수 있습니다.
  2. 의미 학습 부족:
    • BoW 모델은 단어의 의미를 학습하지 않습니다. 그 결과, 벡터 간의 거리가 항상 의미의 차이를 반영하지 않습니다.
    • 해결책: Word2Vec 모델은 이 문제를 해결하며, 단어의 의미를 학습하여 벡터 간의 유사도를 더 잘 반영합니다.

BoW 모델은 단순하고 구현이 쉬워 많은 기본적인 텍스트 처리 작업에 유용합니다. 그러나 단어 순서 정보를 잃고, 단어의 의미를 학습하지 않는다는 한계가 있습니다. 더 발전된 모델인 Word2Vec은 이러한 한계를 극복하여 더 나은 성능을 제공합니다.

더 많은 정보와 예제를 원하시면 Gensim 공식 문서를 참고하세요.