Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

what i learned

[ML] Text Classification(2) - Feature Vectorization 본문

Artificial Intelligence/Machine Learning

[ML] Text Classification(2) - Feature Vectorization

햄식이111 2023. 10. 13. 17:06
 

[ML] Text Classification(1) - 텍스트 전처리

텍스트를 분석하기 위해 텍스트 토큰화 작업을 수행하고 feature를 추출한다. 텍스트 분석 수행 프로세스 텍스트 전처리 피처 벡터화/추출 ML 모델 수립 및 학습/예측/평가 이번 글은 전처리만 정

enddl3224.tistory.com

텍스트 전처리 과정이 끝났다면, 가공된 텍스트에서 Feature를 추출하고 벡터 값을 할당하여 모델을 수립하고 예측할 수 있도록 한다.

 

Feature를 추출하여 벡터 값을 할당할 때 대표적인 방법으로 BOW(Bag Of Words)Word2Vec 방법이 있다.

이 중 BOW 방법으로 텍스트를 벡터화하겠다.

 

BOW(Bag of Words)

문서가 가지는 모든 단어들을 문맥이나 순서를 무시하고 일괄적으로 단어의 빈도 값만 가지고 feature를 추출하는 모델이다.

 

예를 들어 다음 두 문장이 있다고 가정해보자.

문장1: My wife likes to watch baseball games and my daughter likes to watch baseball games too
문장2: My wife likes to play baseball

1. 문장 1과 문장 2에 있는 모든 단어에서 중복을 제거하고 각 단어를 칼럼 형태로 나열한 후 각 단어에 고유의 인덱스를 부여한다.

2. 개별 문장에서 해당 단어가 나타나는 횟수를 인덱스에 기재한다.

 

 

단순히 단어의 발생 횟수에 기반하는 BOW 모델은 쉽고 빠르다는 장점이 있지만,

단어의 순서를 고려하지 않고 횟수에만 집중되기 때문에 단어의 문맥적인 의미가 무시된다는 단점이 있다.

또 많은 문서에서 단어를 추출하게 되면 대부분의 데이터가 0으로 채워져 희소행렬이 생성되기 쉽다.

 

💡 희소 행렬(Sparse Matrix) 이란?

행렬에서 대부분의 값이 0으로 채워지는 행렬을 말한다.

 

BOW 방법을 사용할 경우,

희소행렬로 인해 중요하지 않은 값들로 메모리 공간이 할당되는 문제가 발생하기 때문에 COO, CSR 형식을 사용하여 적은 메모리 공간을 사용하도록 변환할 수 있다.

 

 

COO 형식

희소행렬에서 0이 아닌 데이터들을 별도의 데이터 배열에 저장하기 위해 해당 데이터들의 행과 열의 위치를 별도로 저장하는 방식이다.

import numpy as np

dense = np.array( [ [ 3, 0, 1 ], [0, 2, 0 ] ] )

from scipy import sparse

# 0 이 아닌 데이터 추출
data = np.array([3,1,2])

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

# sparse 패키지의 coo_matrix를 이용하여 COO 형식으로 희소 행렬 생성
sparse_coo = sparse.coo_matrix((data, (row_pos,col_pos)))

sparse_coo.toarray()
'''
array([[3, 0, 1],
       [0, 2, 0]])
'''

 

CSR 형식

COO형식의 문제점을 보완한 방식으로, 행 배열(row_pos)의 데이터 반복을 줄여준다.

행 위치(row_pos)내에 있는 고유한 값의 시작 위치만 별도의 위치 배열로 가지는 변환 방식이다.

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_ind = np.array([0, 2, 7, 9, 10, 12, 13])

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

COO 형식을 사용할 경우 행 배열(row_pos)에 0이란 데이터가 2번, 1이란 데이터가 5번, 2라는 데이터가 2번, 4라는 데이터가 2번으로 같은 데이터가 연속적으로 들어간 것을 확인할 수 있다.

이 문제를 해결하기 위해 CSR형식은 0이란 데이터가 시작하는 인덱스 0, 1이라는 데이터가 시작하는 인덱스 2, 2라는 데이터가 시작하는 인덱스 7을 저장하고 맨 마지막에는 행 배열(row_pos)의 길이(13)를 넣어 메모리를 더 효율적으로 사용할 수 있는 형식이다.

 

 

Text Classification을 위해선 텍스트 전처리 과정이 필요하고 가공된 데이터를 수치화하는 과정을 거친 후 예측을 할 수 있다.

이번 글에서는 가공된 데이터를 수치화하는 Feature Vectorization(벡터화)에 대해 학습하였고,

BOW 방법의 단점인 희소행렬 문제를 해결하기 위해 COO, CSR형식을 사용하여 메모리에 데이터를 효율적으로 저장하는 법을 학습하였다.

 

 

해당 깃헙링크 ➡️ github.com/enddl3224

 

 

 

"파이썬 머신러닝 완벽 가이드"를 학습하여 기록한 글입니다.

[참고자료]

[tistory] 희소행렬 - COO 형식, CSR 형식

[wikidocs] Bag of Words


공부한 내용을 기록하는 공간입니다.

잘못된 정보가 있을 경우 댓글로 피드백 주세요.

올바른 지식을 알려주셔서 감사합니다:)