수즐 커뮤니티

Bag of Words(BoW)

개요

Bag of Words란 단어들의 순서는 전혀 고려하지 않고, 단어들의 출현 빈도에만 집중하는 텍스트 데이터의 수치화 표현 방법이다.

BoW 생성 과정

BoW는 만드는 과정은 다음과 같다.

  • 우선, 각 단어에 고유한 인덱스를 부여한다.

  • 각 인덱스의 위치에 단어 토큰의 등장 횟수를 기록한 벡터를 만든다.

가령, 아래와 같은 문서에 대하여 각 단어들을 다음과 같은 BoW로 변환 하고 할 경우 다음과 예제 코드를 통해 BoW를 수행할 수 있다.

문서: 정부가 발표하는 물가상승률과 소비자가 느끼는 물가상승률은 다르다.

BoW: ('정부': 0, '가': 1, '발표': 2, '하는': 3, '물가상승률': 4, '과': 5, '소비자': 6, '느끼는': 7, '은': 8, '다르다': 9)

from konlpy.tag import Okt
import re  
okt=Okt()  
token=re.sub("(\.)","","정부가 발표하는 물가상승률과 소비자가 느끼는 물가상승률은 다르다.") 
token=okt.morphs(token)
word2index={}  
bow=[]  
for voca in token:  
         if voca not in word2index.keys():  
             word2index[voca]=len(word2index)  
             bow.insert(len(word2index)-1,1) 
         else:
            index=word2index.get(voca)
            bow[index]=bow[index]+1
print(word2index)  

BoW는 각 단어가 등장한 횟수를 수치화하는 텍스트 표현 방법이기 때문에, 주로 어떤 단어가 얼마나 등장했는지를 기준으로 문서가 어떤 성격의 문서인지를 판단하는 작업에 주로 사용된다. 즉 이번 프로젝트의 주제와 매우 유사한 방식이라는 것을 알 수 있다.

생성된 BoW를 바탕으로 불용어 전처리

불용어는 자연어 처리에서 별로 의미를 갖지 않는 단어를 뜻한다.

각 단어에 대한 빈도수를 수치화하겠다는 것은 결국 텍스트 내에서 어떤 단어들이 중요한지를 보고 싶다는 의미이며, 이는 주제 분석에 사용되지 않는 불용어를 제외하는 것만으로도 어느 정도의 정확도 개선에 도움이 된다고 볼 수 있다.

불용어 처리의 경우, 사용자가 직접 지정하여 불용어 사전을 만들어 낼 수도 있고, 아래와 같이 nltk와 같은 상용 라이브러리에서 지원하는 사전을 사용할 수도 있다.

from sklearn.feature_extraction.text import CountVectorizer
text=["Family is not an important thing. It's everything."]
from nltk.corpus import stopwords
sw = stopwords.words("english")
vect = CountVectorizer(stop_words =sw)
print(vect.fit_transform(text).toarray()) 
print(vect.vocabulary_)

Last updated