Bag-of-Word(BoW) Model
기계학습 알고리즘(MLA)을 자연어 처리 테스크에 사용할 때, 입력값인 텍스트는 그 자체로는 사용할 수 없다. 이산적인(discrete)한 텍스트 즉, 문자열을 연속적인(continuous) 모델이 연산할 수 있도록 숫자로 바꾸어주는 과정이 필요하다.
만약 문서 분류 작업(document classification task)을 수행한다고 했을 때, 각 문서는 예측 알고리즘의 input 값에 해당하며 분류 즉, 클래스 레이블이 output값이다. 알고리즘은 input값을 숫자로 이루어진 벡터들로 받으며, 따라서 문서를 고정된 크기의 벡터로 변환하는 작업이 필요하다
기계학습을 위해 텍스트로 이루어진 문서들을 백터화하는 간단하고 효과적인 방법은 Bag-of-Words Model(BoW)이다. BoW는 단어들의 순서는 전혀 고려하지 않고, 단어들의 출현 빈도에만 집중하는 텍스트 데이터의 수치화 표현 방법이다.
아래와 같이 두 문장이 있을 때 Bow를 만드는 과정은 다음과 같다.
sentence1 = ["This","is","a","first","document"]
sentence2 = ["And","this","is","a","second","document"]
1. 문장안의 각 단어에 고유한 정수 인덱스를 부여한다
cnt = [{"This":0},{"is":1},{"a":2},{"first":3},{"document":4},
{"And":5},{"second":6}]
2. 각 인덱스의 위치에 단어 토큰의 등장 횟수를 기록한 벡터를 만든다
#index : This/is/a/first/document/And/second
s1_Bow = [1,1,1,1,1,0,0]
s2_Bow = [1,1,1,0,,1,1,1]
BoW 패키지: CountVectorizer
- ScikitLearn에서 제공하는 클래스로, 단어의 빈도를 Count하여 Vector로 만드는 CountVectorizer 클래스로 영어에 한해서 손쉽게 BoW를 만들 수 있음
- 사용예제
from sklearn.feature_extraction.text import CountVectorizer
sentence = ["This is a first document And this is a second document"]
vector = CountVectorizer()
# 문장으로부터 각 단어의 빈도수를 기록
print(vector.fit_transform(corpus).toarray())
# 각 단어의 인덱스가 어떻게 부여되었는지를 출력
print(vector.vocabulary_)[[2,2,1,2,1,1]]
{"This":0,"is":1,"first":2,"document":2,"And":4,"second":5}
- 사용예제에서 확인할 수 있듯이 기본적으로 길이가 2이상인 문자에 대해서만 토큰으로 인식한다
BoW 단점
- 단지 띄어쓰기만을 기준으로 단어를 자르는 낮은 수준의 토큰화를 진행해 BoW를 만듦.
- 단어 단위로 띄어쓰기가 명확한 영어의 경우 BoW가 괜찮은 방식이나 띄어쓰기 개념이 없는 중국어, 일본어에는 적용하기 힘듦
- 또한 띄어쓰기가 단어 단위로 명확하지 않고, 조사 등의 이유로 한국어 역시 적응하기 힘듦
'인공지능(AI) > 자연어처리(NLP)' 카테고리의 다른 글
[NLP] 워드투벡터(Word2Vec) (2) | 2021.10.13 |
---|---|
[NLP] 단어 표현 방법(Word Representation) (0) | 2021.10.13 |
[논문리뷰] Transformer(Attention is All you Need) 이해하기 (0) | 2021.05.07 |
[NLP 개념] 언어모델(Language Model) (0) | 2021.05.03 |
01 자연어처리 소개 (0) | 2020.12.17 |