귀퉁이 서재

NLP - 5. Bag of Words (BOW) 본문

자연어 처리 (NLP)

NLP - 5. Bag of Words (BOW)

Baek Kyun Shin 2020. 2. 13. 19:16

이번 장에선 Bag of Words에 대해 알아보겠습니다. 이전과 마찬가지로 파이썬 머신러닝 완벽 가이드 (권철민 저), 딥 러닝을 이용한 자연어 처리 입문(유원주 저)을 요약정리했습니다.

Bag of Words란 단어들의 문맥이나 순서를 무시하고, 단어들에 대해 빈도 값(frequency)을 부여해 피쳐 값을 만드는 모델입니다. Bag of Words는 직역하자면 단어들의 가방입니다. 문서 내 모든 단어를 한꺼번에 가방(Bag) 안에 넣은 뒤에 흔들어서 섞는다는 의미로 Bag of Words(BOW) 모델이라고 합니다. 

출처: https://ldabook.com/word-representations.html

BOW를 기반으로 피처 추출하기

아래의 두 문장이 있다고 가정하고 이 문장을 BOW 기반으로 피처 추출해보겠습니다.

문장1: 'My wife likes to watch baseball games and my daughter likes to watch baseball games too'

문장 2: 'My wife likes to play baseball'

1) 문장1과 문장 2에 있는 모든 단어에서 중복을 제거하고 각 단어를 칼럼 형태로 나열합니다. 그런 다음 각 단어에 고유의 인덱스를 아래와 같이 부여합니다.

'and':0, 'baseball':1, 'daughter':2, 'games':3, 'likes':4, 'my':5, 'play':6, 'to':7, 'too':8, 'watch':9, 'wife':10

2) 개별 문장에서 해당 단어가 나타나는 횟수(frequency)를 각 단어(단어 인덱스)에 기재합니다. 예를 들어 baseball은 문장 1,2에서 총 2번 나타나며, play는 문장 2에서만 1번 나타납니다.

index 0 1 2 3 4 5 6 7 8 9 10
  and baseball daughter games likes my play to too watch wife
문장1 1 2 1 2 2 2 0 2 1 2 1
문장2 0 1 0 0 1 1 1 1 0 0 1

이는 문자로 된 피처를 숫자 형태로 변환해준 역할을 합니다. 기본적으로 머신러닝 모델은 문자를 인식하지 못합니다. 그래서 카테고리형 데이터도 라벨 인코딩을 하거나 원-핫 인코딩을 합니다. 마찬가지로 BOW 기반으로 피처를 만드는 것은 문서 내의 단어(더 정확히 말하면 토큰)를 숫자형 데이터로 바꾸는 것이라고 보시면 됩니다. BOW는 단순히 단어의 발생 빈도에 기반하지만, 텍스트의 특징을 잘 나타낼 수 있어 여러 분야에서 활용도가 높습니다. 다만 다음과 같은 단점도 있습니다.

Bag of Words(BOW)의 단점

- 문맥 의미(Semantic Context) 반영 부족: BOW는 단어의 순서를 고려하지 않기 때문에 문맥적인 의미가 무시됩니다. 이를 보완하기 위해 n_gram기법을 활용할 수는 있지만, 제한적인 부분에 그칩니다.

- 희소 행렬 문제: BOW로 피처 벡터화하면 희소 행렬 형태의 데이터가 만들어집니다. 문장이 굉장히 많은 문서에서 BOW 피처 벡터화를 하면 칼럼이 매우 많아집니다. 문서마다 서로 다른 단어로 구성되기에 단어가 문서마다 나타나지 않는 경우가 훨씬 많습니다. 따라서 대부분의 칼럼은 0으로 채워지게 됩니다. 이와 같이 상당히 많은 칼럼으로 구성되어 있는 행렬에서 대부분의 값이 0으로 채워진 행렬을 희소 행렬(Sparse Matrix)라고 합니다. 반대로 대부분의 값이 0이 아닌 값으로 채워진 행렬을 밀집 행렬(Dense Matrix)라고 합니다. 희소 행렬은 일반적으로 머신러닝의 성능을 떨어뜨리기 때문에 희소 행렬을 위한 별도의 처리 기법이 있습니다.

BOW 피처 벡터화 (BOW Feature Vectorization)

머신러닝 모델은 문자로 된 피처를 바로 사용할 수 없습니다. 따라서 위에서 설명한 것처럼 BOW를 활용해 문자를 숫자화할 수 있습니다. 이처럼 텍스트를 특정 의미가 있는 숫자형 값인 벡터 값으로 변환해야 하는데, 이를 피처 벡터화(Feature Vectorization)라고 합니다. BOW 모델에서 피처 벡터화를 한다는 것은 모든 문서에서 모든 단어를 칼럼 형태로 나열하고 해당 단어에 빈도 값을 부여하는 것을 뜻합니다. 예를 들어 M개의 문서가 있고 이 문서에서 모든 단어를 추출해 나열했을 때 N개의 단어가 있다고 가정해봅시다. BOW기반의 피처 벡터화를 하면 M X N개의 피처로 구성된 행렬이 나옵니다. 

BOW의 피처 벡터화는 다음과 같이 두 가지 방식이 있습니다.

카운트 기반 벡터화(CountVectorizer), TF-IDF(Term Frequency - Inverse Document Frequency) 기반 벡터화

이에 대해서는 다음 장에서 배워보도록 하겠습니다.

References

Reference1: 파이썬 머신러닝 완벽가이드 (권철민 저)

Reference2: 딥 러닝을 활용한 자연어 처리 입문 (Bag of Words)

Comments