본문 바로가기
AI

자연어 처리 : 카운트 기반의 단어 표현 : Bag of Words + DTM

by 월곡동로봇팔 2020. 3. 6.

1. Bag of words 란?

(1) 정의

단어들의 출현 빈도에만 집중하는 text data 수치화 표현방법이다.

문장을 숫자로 표현, 가방 안에 순서 상관없이 문자를 모두 넣는다고 생각하자.

 

bag of words

(2) BoW 만드는 과정

문장을 입력하면, 단어들이 모두 포함된 단어들을 list 화 한 후, key 값에 맞는 단어들의 value를 증가해준다. 

예를 들면, not good, not bad 경우에는 not이 2개, bad 1개, good 1개 로 [0, 0, 0, 0, 2, 1, 1] 이다.

 

이런식으로 여러 문장들의 단어 집합 리스트를 만들어서 test 문장을 하나씩 비교해보면 유사도 측정이 가능하다.

유사도 비교

(3) 유사도 비교

위 문장에서 awesome thank you, great thank you의 bag of words로 유사도를 비교할 것이다.

이는 논리연산자처럼 겹치는 부분이 1, 아닌 부분을 0으로 해서 

숫자가 높을수록 유사도가 높고, 숫자가 낮을수록 유사도가 낮다.

 

bag of words 적용

Bag of words는 단어를 수치화 한 것이다.

따라서 우리는 이를 머신러닝의 입력값으로 사용가능하다.

bag of words로 우리는 머신러닝의 모델을 쉽게 구현이 가능하다.


2. CounterVectorizer Class 이용해서 BoW 만들기

from sklearn.feature_extraction.text import CountVectorizer
corpus = ['you know I want your love. because I love you.']
vector = CountVectorizer()
print(vector.fit_transform(corpus).toarray()) # 코퍼스로부터 각 단어의 빈도 수를 기록한다.
print(vector.vocabulary_) # 각 단어의 인덱스가 어떻게 부여되었는지를 보여준다.

"""
[[1 1 2 1 2 1]]
{'you': 4, 'know': 1, 'want': 3, 'your': 5, 'love': 2, 'because': 0}
"""

특징

  • 길이가 2인 문자에 대해서만 token으로 인식한다. (스스로 전처리를 해버림.)
  • 띄어쓰기만을 기준으로 단어를 자름. -> 한국어에 적용할 때는 전처리 확실하게 해야 성능이 좋아짐.

3. StopWords 를 제거한 BoW 만들기

(1) 사용자 정의

from sklearn.feature_extraction.text import CountVectorizer

text=["Family is not an important thing. It's everything."]

vect = CountVectorizer(stop_words=["the", "a", "an", "is", "not"])

print(vect.fit_transform(text).toarray()) 
print(vect.vocabulary_)

(2) CounterVectorizer 제공하는 StopWords

from sklearn.feature_extraction.text import CountVectorizer

text=["Family is not an important thing. It's everything."]

vect = CountVectorizer(stop_words="english")

print(vect.fit_transform(text).toarray()) 
print(vect.vocabulary_)

(3) NLTK에서 지원하는 StopWords

from sklearn.feature_extraction.text import CountVectorizer
from nltk.corpus import stopwords

text=["Family is not an important thing. It's everything."]
sw = stopwords.words("english")
vect = CountVectorizer(stop_words=sw)

print(vect.fit_transform(text).toarray()) 
print(vect.vocabulary_)

4. 문서 단어 행렬 (Documentation-Term Matrix, DTM)

단순히 각 문서나 문장에 대한 BoW 표현들을 결합한 표현 방법이다.

 

DTM의 표기법

문서1 : 먹고 싶은 사과
문서2 : 먹고 싶은 바나나
문서3 : 길고 노란 바나나 바나나
문서4 : 저는 과일이 좋아요

 

문서들이 존재할 때, DTM은 아래와 같다.

DTM


5. 단점

  • sparsity : 엄청나게 많은 데이터에서는 벡터가 백만으로 넘어가기 때문에, 0이 엄청 많다. (이를 희소 표현, Sparse Representation) -> 계산을 많이하게 되고 이는 메모리를 많이 잡고있는다.
  • 반복되는 단어의 갯수가 크면, 이는 output의 결과의 많은 영향을 끼친다.
  • 단어의 순서를 무시한다. 문맥을 파악하기 힘들다 : 왜냐하면 단어의 개수를 세기 때문에, ex) home runs vs runs home
  • Out of Vocabulary : 오타, 줄임말을 찾기가 어렵다.
  • 한글일 때 "물가상승률과" 와 "물가상승률을" 은 다른 단어이기 때문에 다른 index를 가질 확률이 높다. -> 전처리가 굉장히 중요하다.

댓글