BOW (Bag of Word) : 문서가 가지는 모든 단어를 문맥이나 순서를 무시하고 일괄적으로 단어에 대해 빈도 값을 부여해 피처 값을 추출하는 모델

 

 

- 원리 

문장 1 : 'My wife likes to watch baseball games'

문장 2 : 'My wife likes to play baseball'

 

두 문장을 단어로 잘라 중복을 제거한 칼럼형태로 나타냅니다.

  my wife likes to watch play baseball games
문장1 1 1 1 1 1   1 1
문장2 1 1 1 1   1 1  

 

 

- 장점 : 쉽고 빠른 구축

- 단점 : 문맥 의미 반영이 부족( 순서를 고려하지 않기 때문에 문맥의 의미가 무시됨

           희소 행렬 문제 (피처 벡터화를 수행하면 희소행렬 형태의 데이터 세트가 만들어지는데 매우 많은 칼럼이 만들어지기 때문에 수행 시간과 예층 성능이 떨어질 수 있음)

 

 

 

 

- BOW 피처 벡터화

: 머신러닝 알고리즘은 일반적으로 숫자형 피처를 데이터로 입력받아 동작하기 때문에 텍스트와 같은 데이터는 머신러닝 알고리즘에 바로 입력할 수 없다. 그렇기 때문에 벅터화 과정이 필요

- 모든 문서에서 모든 단어를 칼럼 형태로 나열하고 각 문서에서 해당 단어의 횟수나 정규화된 빈도를 값으로 부여하는 데이터 세트 모델로 변경하는 것이다.

 

1. 카운트 기반의 벡터화 : 단어 피처에 값을 부여할 때 각 문서에서 해당 단어가 나타나는 횟수 부여

 

2. TF-IDF(Term Frequency - Inverse Document Frequency) 기반의 벡터화 : 자주 나타나는 단어에 높은 가중치를 주되, 모든 문서에서 전반적으로 자주 나타나는 단어에 대해서는 패널티를 주는 방식으로 값을 부여

 

- sklearn 의 CountVectorizer, TfidfVectorizer 를 통하여 사용할 수 있다.

- 위 두방식을 이용하면 CSR 형태의 희소행렬로 나타남

 

 

* COO vs CSR

 

- COO : 0이 아닌 데이터만 별도의 데이터 배열에 저장하고, 그 데이터가 가리키는 행과 열의 위치를 별도의 배열로 저장하는 방식

 

예)  original = [ [ 3, 0, 1], [ 0, 2, 0 ] ]

data =  [ 3, 1, 2 ]   -> original 에서 0이 아닌 값을 가진 데이터 

각 데이터에 대한 위치 값을 받아 오면 ( 0 , 0 ), ( 0, 2 ) , ( 1, 1 ) -> [ 0 , 0, 0 ], [ 0 , 2, 1 ] ( 행과 열로 나누 수 있음) 

scipy의 sparse.coo_matrix를 이용하면 희소 행렬 객체를 반환하게 된다.

 

 

 - CSR : COO 형식이 행과 열의 위치를 나타내기 위해서 반복적인 위치 데이터를 사용해야하는 문제점을 해결한 방안으로, 행의 시작 위치를 알려주는 형태이다. 

 

예 ) original = [ [ 0,  0,  1] , [ 1, 4, 0 ] , [ 0, 4, 1] ]

data = [ 1, 1, 4, 4, 1 ]

각 데이터에 대한 위치 값을 받아 오면 ( 0, 2 ), ( 1 , 0 ), ( 1 , 1 ), ( 2 , 1), ( 2 , 2) 로 -> [ 0, 1, 1, 2, 2] , [ 2, 0, 1, 1, 2 ] 으로 행과 열을 나타내는 배열을 만들 수 있다.

행 위치 배열이 [ 0, 1, 1, 2, 2 ] 에서 중복된 값(같은 행)을 없애는 방식으로 첫번째 데이터 시작 인덱스가 0, 두번째 데이터(1) 시작 인덱스 1, 세번째 데이터(2) 시작 인덱스 3 이므로 [ 0, 1, 4, 총 길이 수 = 5] 로 나타날 수 있다.

 

 

 

 

- 두 방식을 사용한 소스입니다.

from scipy import sparse

dense2 = np.array([[0,0,1,0,0,5],
             [1,4,0,3,2,5],
             [0,6,0,3,0,0],
             [2,0,0,0,0,0],
             [0,0,0,7,0,8],
             [1,0,0,0,0,0]])

# 0 이 아닌 데이터 추출
data2 = np.array([1, 5, 1, 4, 3, 2, 5, 6, 3, 2, 7, 8, 1])

# 행 위치와 열 위치를 각각 array로 생성 
row_pos = np.array([0, 0, 1, 1, 1, 1, 1, 2, 2, 3, 4, 4, 5])
col_pos = np.array([2, 5, 0, 1, 3, 4, 5, 1, 3, 0, 3, 5, 0])

# COO 형식으로 변환 
sparse_coo = sparse.coo_matrix((data2, (row_pos,col_pos)))

# 행 위치 배열의 고유한 값들의 시작 위치 인덱스를 배열로 생성
# ## - row_pos에서 0은 0 색인에서 시작, 1은 2에서 시작, 2는 7에서 시작, 3은 9, 4는 10, 5는 12, 전체수는 13
row_pos_ind = np.array([0, 2, 7, 9, 10, 12, 13])

# CSR 형식으로 변환 
sparse_csr = sparse.csr_matrix((data2, col_pos, row_pos_ind))

print(sparse_coo.toarray())
print(sparse_csr.toarray())

 

- 참고 : 파이썬 머신러닝 완벽 가이드

'머신러닝 in Python' 카테고리의 다른 글

[Python] k-nearest neighbor 예제  (0) 2019.08.26
[Python]k-nearest neighbor  (0) 2019.08.26
텍스트 분석_텍스트 전처리 2  (0) 2019.08.14
텍스트 분석_텍스트 전처리1  (0) 2019.08.13
텍스트 분석이란?  (0) 2019.08.13

+ Recent posts