본문 바로가기
머신러닝 with Python

[머신러닝 with Python] Bag of Words란? (BoW)

by CodeCrafter 2024. 12. 1.
반응형

 

 Bag of Words는 텍스트 데이터를 벡터 형태로 변호나하여 머신러닝과 자연어 처리 모델에 사용할 수 있도록 하는 기본적인 텍스트 표현 기법입니다.  간단하면서도 다양한 텍스트 처리 작업에 유용하게 활용되며, 특히 문서 분류, 감성 분석, 정보 검색 등에서 널리쓰이는 방법입니다.

 

1. Bag of Words란?

 Bag of Words는 주어진 텍스트에서 단어의 등장 여부 또는 빈도를 기반으로 숫자 벡터를 생성하는 방법입니다.

 텍스트 데이터를 정형 데이터로 변환하는 가장 기본적인 방법으로, 텍스트 분석의 입문 단계에서 활용되는 방법입니다.

 

 Bag of Words에서 주요 기본개념은 아래와 같습니다.

 1) 어휘(Vocabulary) : 텍스트에 등장하는 고유 단어들의 집합을 말합니다. 

 2) 벡터화(Vecotrization) : 각 문장을 어휘의 크기만큼의 벡터로 변환하며, 단어가 문장에 등장하면 해당 위치에 값을 기록합니다.

 3) 순서 무시 : 단어의 순서는 고려하지 않고, 단어의 등장 여부와 횟수만 반영하는 방법입니다.

 

 이러한 Bag of Words의 장점과 단점에 대해서 알아보면

 1) 장점

  - 구현의 용이성 : 알고리즘이 단순하며, 텍스트 데이터를 숫자로 변환하기 쉽습니다.

  - 빠른 처리 속도 : 단어 빈도만 계산하기 때문에 비교적 빠르게 실행됩니다.

  - 다양한 응용 가능성 : 문서 분류, 감성 분석, 검색 엔진 등에서 쉽게 활용이 가능합니다.

 

 2) 단점 

  - 문맥 정보 손실 : 단어의 순서를 고려하지 않기때문에 문맥을 반영하기 어렵습니다.

  - 희소 행렬 문제 : 많은 단어가 문서에 등장하지 않아 큰 어휘 크기에서 메모리 낭비가 심할 수 있습니다.

  - 동의어 처리 부족 : 비슷한 의미의 단어를 구분하지 못하고 별도로 처리하게 됩니다.

 

2. Python을 활용한 Bag of Words 구현 

아래는 파이썬의 Scikit learn 라이브러리를 사용해 한글 텍스트 데이터를 BoW로 변환하는 간단한 구현 코드입니다.

 

활용할 함수는 CountVecotrizer이고 이를 활용해서 BoW를 구현하겠습니다.

 

from sklearn.feature_extraction.text import CountVectorizer

# 샘플 한글 텍스트 데이터
documents = [
    "나는 자연어 처리가 좋다",
    "자연어 처리는 재미있다",
    "나는 좋은 처리를 좋아한다"
]

# CountVectorizer 초기화
vectorizer = CountVectorizer()

# BoW로 변환
bow_matrix = vectorizer.fit_transform(documents)

# 단어 어휘 출력
print("어휘:", vectorizer.vocabulary_)

# BoW 행렬 출력
print("BoW 행렬:\n", bow_matrix.toarray())

# 단어와 인덱스 확인
for word, index in vectorizer.vocabulary_.items():
    print(f"단어: {word}, 인덱스: {index}")

 

위 과정을 요약하면 아래와 같습니다.

 

문서에 등장하는 모든 고유 단어를 모아 어휘를 생성하고 각 문서를 어휘 크기만큼의 벡터로 변화후 단어 빈도를 채우는 형식입니다. 

 

첫번째 문장인 "나는 자연어 처리가 좋다" 는

"나는" "자연어" "처리가" "좋다"라고 어휘 기준으로 나뉘게 되고

 

전체 문서에서 이러한 고유 어휘들에 각각의 인덱스를 부여한 뒤 한 문장의 단어를 순서대로 해당하는 인덱스에 매칭 시키는 것입니다.

 

"나는" "자연어" "처리가" "좋다" -> [1,1,0,1,0,0,1,0,0]

 

 

반응형

댓글