자연어처리

Bag of Words(단어장)에 의한 feature vector 생성

coding art 2022. 7. 1. 17:30
728x90

Bag of Words 란 일종의 숫자형 라벨을 붙인 단어장을 뜻한다. 영어 단어들로 구성된 문장들이 있으면 그 문장에서 사용된 단어들을 추려낼 수 있을 것이다. 만약에 “The”가 여러 번 사용되었다 해도 그 사용된 횟수가 아니라 그 단어 자체를 한번 단어장에 ID 숫자 번호를 매겨 등록할 필요가 있을 것이다. 학습해야 할 문장들이 많이 있다면 이 단어장은 결국 특정 텍스트 뭉치들에 대한 하나의 단어 사전(Corpus)이 될 수 있을 것이다. 일반 사전을 의미하는 Dictionary 와는 의미가 다르다. Dictionary는 모든 글과 말에 대한 표준적인 단어장으로서 Corpus 처럼 제한된 의미의 단어장과는 의미 차이가 크다.

 

아울러 특수한 단어장이 만들어지고 숫자명이 부여되었으면 각 문장들은 이 단어장에 unique 하게 등록된 숫자를 사용하여 특징 벡터(feature vector)를 구성할 수 있게 된다. 아래의 3개의 문장이 포함된 파이선 코드를 실행하고 셸(Shell)에서 print 문을 실행하면 3개의 문장에서 사용된 단어들을 추려내어 class 명으로서 부여한 숫자를 관찰할 수 있을 것이며 아울러 이 숫자들을 사용하여 문장을 특징 벡터(feature vector) 형태로 표현할 수 있다.

 

리스트 데이타 형태로 처리된 특징 벡터에서 tf(t,d)(문서 d에서 단어 t 의 출현 횟수:the number of times a term t occurs in a document d)를 정의하자. 즉 전체 문장에서 특정 단어의 출현횟수는 대단히 중요한 역할을 한다.

 

단어장 모델에서 출현하는 개별 단어들을 체크했는데 이를 1-gram 모델이라고도 한다. 반면에 Natural Language Processing 에서는 개별 단어 말고도 복수개의 단어들이라든지 또는 글자들이나 기호들도 있을 수 있는데 이들에 대한 모델을 n-grams 모델이라고 한다. 특히 크기가 3∼4인 n-grams 모델의 경우 이메일에서 스팸메일을 걸러내는데 우수한 성능을 발휘한다는 연구가 보고되어 있다.

 

특히 scikit-learn 라이브러리 모듈에서 제공하는 class 명령인 CountVectorizer는 ngram_range 파라메터를 사용하여 다양한 크기의 n-grams 모델 사용을 지원한다.

 

#CountVectorizer

import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer

 

count = CountVectorizer()
docs = np.array([
        'The sun is shining',
        'The weather is sweet',
        'The sun is shining, the weather is sweet, and one and one is two'])
bag = count.fit_transform(docs)
print(count.vocabulary_)
print(bag.toarray())