Python 튜토리얼

Lv1 전처리 python 파이썬 텍스트 데이터 벡터화 복습

2021.10.08 17:19 2,985 Views

안녕하세요 여러분👩‍🌾👨‍🌾 오늘은 Bag of Words의 개념에 대해 알아보겠습니다.

머신러닝 모델은 텍스트로 된 변수를 바로 사용할 수 없습니다. 텍스트를 특정 의미가 있는 숫자형 값인 벡터 값으로 변환해야 되는데, 이를 피처 벡터화라고 합니다.🏑🏏

텍스트 데이터를 벡터화 하는 방법은 여러가지가 있지만 그중 가장 단순한 방법인 Bag of Words에 대해 알아 보겠습니다.


Bag of Words(BOW) ❓❔

Bag of Words란 단어들의 문맥이나 순서를 무시하고, 단어들에 대한 빈도 값을 부여해 변수를 만드는 방법입니다.


BOW를 이용하여 텍스트 데이터를 숫자형 값으로 변환해 보겠습니다.

문장 1 : 나는 축구 하는 것을 좋아합니다.

문장 2 : 나는 주말에 친구들을 만나 함께 축구 하는 것을 좋아합니다. 그리고 나는 친구들을 만나 축구 보는 것을 좋아합니다.


#1 문장1 과 문장2에 있는 모든 단어(중복을 제거한)에 고유의 인덱스를 부여 합니다.

'나는' : 0 , '축구' : 1, '하는' : 2, '것을' : 3, '좋아합니다' : 4, '주말에' : 5 ,' 친구들을' : 6, '만나' : 7 , '함께' : 8, '그리고' : 9 ,' 보는' :10


#2 개별 문장에서 해당 단어가 나타나는 횟수를 각 단어에 표시합니다.

위와 같은 방식으로 텍스트로 된 변수를 숫자형으로 변환 시킬 수 있습니다.


BOW는 단순히 단어의 발생 빈도에 기반하여 텍스트를 숫자형으로 변환 시켜주지만 문장에서 단어의 특징을 나타 낼 수 있어 여러 분야에서 활용도가 높습니다. 하지만 다음과 같은 단점도 존재 합니다.


  • 문맥 의미를 완벽하게 반영 할 수 없다 : BOW는 단어의 순서를 고려하지 않기 때문에 문맥적인 의미가 완전히 무시 됩니다. 이를 보완하기 위해 n_gram 기법을 활용 할 수 있지만 제한적입니다.
  • 희소 행렬 문제 : 단어가 굉장히 많은 데이터에서 BOW로 텍스트 데이터를 벡터화 하면 행렬 대부분의 값이 0 으로 채워진 희소 행렬 형태로 변환 됩니다. 희소 행렬은 일반적으로 머신러닝의 성능을 떨어뜨립니다.



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

카운트 기반 벡터화(CountVectorizer), TF-IDF(Term Frequency - Inverse Document Frequency) 기반 벡터화 다음 시간에는 카운트 기반 벡터화에 대해 알아보겠습니다.👨‍💻👩‍💻


💫카운트 기반 벡터화(CountVectorizer)

Bag of Words를 설명하면서 텍스트 데이터를 숫자형 데이터로 변환하는 방법에 대해 알아보았습니다. 복습

그와 마찬가지로, 단어에 값을 부여할 때 각 문장에서 해당 단어가 나타나는 횟수

즉, Count를 부여하는 경우를 카운트 벡터화라고 합니다. 카운트 벡터화에서는 값이 높을수록 중요한 단어로 인식됩니다.


💫TF-IDF(Term Frequency - Inverse Document Frequency)기반 벡터화

이전에 설명한 카운트 기반 벡터화는 숫자가 높을 수록 중요한 단어로 인식합니다. 하지만 단순히 단어의 빈도만 고려한다면 모든 문서에서 자주 쓰일 수 밖에 없는 단어들이 중요하다고 인식 될 수 있습니다. 이런 문제를 보완하기 위해 TF-IDF(Term Frequency - Inverse Document Frequency) 벡터화를 사용합니다.


TF-IDF는 개별 문서에서 자주 등장하는 단어에는 높은 가중치를, 모든 문서에서 자주 등장하는 단어에 대해서는 패널티를 주는 방식으로 값을 부여 합니다.

예를 들어 총 5개의 문서가 있다고 가정하면, 딥러닝이라는 단어는 5개 문서에서 모두 등장하고, 머신러닝이라는 단어는 1번문서에서만 빈번히 등장한다고 했을때, TF-IDF의 값은 딥러닝이란 단어는 낮게 부여 되고 머신러닝이라는 단어는 높게 부여 됩니다.


문서의 양이 많을경우 보통 TF-IDF 방식의 벡터화를 사용합니다.