일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- ML
- BOF
- fastapi를 사용한 파이썬 웹 개발
- C++
- Widget
- Got
- llm을 활용 단어장 앱 개발일지
- 백준
- pytorch
- rao
- Computer Architecture
- Kaggle
- 영상처리
- DART
- Dreamhack
- Image Processing
- system hacking
- study book
- Algorithm
- 파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습
- bloc
- MATLAB
- BFS
- Stream
- BAEKJOON
- PCA
- Flutter
- MDP
- FastAPI
- ARM
- Today
- Total
Bull
[AI::NLP] Bag-of-Words (BoW) 모델 본문
Gensim 공식 문서의 내용을 GPT로 정리하였습니다.
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 모델의 핵심 개념
- 단어 빈도: 문서에 등장하는 각 단어의 빈도를 계산합니다.
- 벡터화: 각 문서를 단어 빈도 벡터로 변환합니다. 벡터의 각 요소는 특정 단어의 빈도를 나타냅니다.
- 순서 무시: 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]]
예제 설명
- 입력 데이터:
documents
는 두 개의 문장으로 구성된 리스트입니다. - CountVectorizer 객체 생성:
CountVectorizer
는 텍스트 데이터를 BoW 벡터로 변환하는 객체입니다. - fit_transform 메서드:
fit_transform
메서드는 문서 목록을 입력으로 받아 BoW 벡터로 변환합니다. - 결과 출력:
모든 튜플과 리스트는 Feature를 중심으로 설명합니다. 헷갈린다면 Feature 리스트의 순서에 집중하세요.- 특성 이름 (Feature Names): 각 단어가 위치한 열을 나타냅니다. 예를 들어,
4
는 'john'을 나타내며, 'john'은 첫 번째 문서에서 두 번 등장합니다. 피쳐는 알파벳 순으로 정리됩니다. - 희소 행렬 (Sparse Matrix):
(0, 4) 1
는 첫 번째 문서의 다섯 번째 단어(john)가 1번 등장했음을 의미합니다.0
행0
열은 문서에서 해당 위치에 해당하는 단어가 등장하지 않기 때문에 표시되지 않습니다. - 밀집 행렬 (Dense Matrix): 희소 행렬을 밀집 행렬로 변환한 형태입니다. 첫 번째 행의 첫 번째 열이 0인 이유는 첫 번째 문서에 'also' 단어가 없기 때문입니다.
- 특성 이름 (Feature Names): 각 단어가 위치한 열을 나타냅니다. 예를 들어,
결과 해석
위의 예제에서, 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 모델은 매우 효과적이지만 몇 가지 중요한 한계가 있습니다:
- 단어 순서 정보 손실:
- BoW 모델은 단어의 순서를 무시합니다. 예를 들어, "John likes Mary"와 "Mary likes John"은 동일한 벡터로 변환됩니다.
- 해결책: N-그램 모델은 단어 구를 길이 n으로 고려하여 로컬 단어 순서를 캡처하지만, 데이터 희소성과 고차원 문제를 겪을 수 있습니다.
- 의미 학습 부족:
- BoW 모델은 단어의 의미를 학습하지 않습니다. 그 결과, 벡터 간의 거리가 항상 의미의 차이를 반영하지 않습니다.
- 해결책: Word2Vec 모델은 이 문제를 해결하며, 단어의 의미를 학습하여 벡터 간의 유사도를 더 잘 반영합니다.
BoW 모델은 단순하고 구현이 쉬워 많은 기본적인 텍스트 처리 작업에 유용합니다. 그러나 단어 순서 정보를 잃고, 단어의 의미를 학습하지 않는다는 한계가 있습니다. 더 발전된 모델인 Word2Vec은 이러한 한계를 극복하여 더 나은 성능을 제공합니다.
더 많은 정보와 예제를 원하시면 Gensim 공식 문서를 참고하세요.
'Artificial Intelligence > NLP' 카테고리의 다른 글
[NLP] TF-IDF(Term Frequency-Inverse Document Frequency) | study book (0) | 2024.09.22 |
---|---|
[NLP] FastText | study book (0) | 2024.09.21 |
[NLP] N-gram | study book (0) | 2024.09.21 |
[NLP] 토큰화 | study book (1) | 2024.09.08 |
[AI::NLP] Word2Vec에 대해 알아보자: 단어의 비밀, 사실은 숫자의 배열이었다! (CBOW, Skip-gram) (2) | 2024.07.21 |