Bow(Bag of Words) 는 가방 속의 단어를 무작위로 뽑는 것처럼, 단어의 등장 순서를 고려하지 않는 빈도수(frequency) 기반의 단어 표현 방법이다. 빈도수로 유사도를 구하고 그에 따라 분류하는데 사용될 수 있다. 또한 서로 다른 문서들의 Bow 를 결합한 표현 방법을 문서 단어 행렬(DTM: Document-Term Matrix / TDM) 이라고 하는데, 원-핫 벡터와 같이 단어 집합을 줄이기 위해 불용어 처리가 중요하며, 정작 중요한 단어에 대해서 가중치를 주지 못하는 단점이 있다.
Bow 생성 과정은 단어 토큰화, 중복제거, 인덱스 부여, 빈도수 벡터 생성으로 만들 수 있다.
from konlpy.tag import Okt import re okt = Okt() text = "정부가 발표하는 물가상승률과 소비자가 느끼는 물가상승률은 다르다." token = re.sub("(\.)", "", text) # 기호제거 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[voca] bow[index] += 1 print(word2index) # {'정부': 0, '가': 1, '발표': 2, '하는': 3, '물가상승률': 4, '과': 5, '소비자': 6, '느끼는': 7, '은': 8, '다르다': 9} print(bow) # [1, 2, 1, 1, 2, 1, 1, 1, 1, 1] | cs |
CountVectorizer 로 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()) # [[1 1 2 1 2 1]] print(vector.vocabulary_) # {'you': 4, 'know': 1, 'want': 3, 'your': 5, 'love': 2, 'because': 0} | cs |
CountVectorizer 에 불용어 사용하기
# 불용어 사용자 정의 vector = CountVectorizer(stop_words=["the", "a", "an", "is", "not"]) # CountVectorizer 영문 불용어 사용 vector = CountVectorizer(stop_words="english") # NLTK 영문 불용어 사용 from nltk.corpus import stopwords sw = stopwords.words("english") vector = CountVectorizer(stop_words = sw) | cs |
WRITTEN BY
- 손가락귀신
정신 못차리면, 벌 받는다.
,