텍스트 마이닝 - 희소행렬
Page content
공지
- 해당 포스트는 취업 준비반 대상 강의 교재로 파이썬 머신러닝 완벽가이드를 축약한 내용입니다.
- 매우 좋은 책이니 가급적 구매하시기를 바랍니다.
개요
- 피처 벡터화에 있어서의 희소행렬에 대해 배운다.
- BOW 형태를 가진 언어 모델의 피처 벡터화는 대부분 희소 행렬이다.
희소행렬
- 희소 행렬은 너무 많은 불필요한 0 값이 메모리 공간에 할당되어 메모리 공간을 많이 차지하는데 있다.
- 다음 그림을 살펴보자.
- 이러한 희소 행렬을 물리적으로 적은 메모리 공간을 차지할 수 있도록 변환해야 하는데, 이 때, COO와 CSR 형식이 존재한다.
(1) 희소 행렬 - COO
- COO(Coordinate: 좌표) 형식은 0이 아닌 데이터만 별도의 데이터 배열(Array)에 저장하고, 그 데이터가 가리키는 행과 열의 위치를 별도의 배열로 저장
- 희소행렬 변환 위해
Scipy
를 활용한다.
import numpy as np
dense = np.array([[3, 0, 1], [0, 2, 0]])
dense
array([[3, 0, 1],
[0, 2, 0]])
- Scipy의
coo_matrix
클래스를 이용해COO
형식의 희소 행렬로 변환한다.
from scipy import sparse
# 0이 아닌 데이터 추출
data = np.array([3, 1, 2])
# 행 위치와 열 위치를 각각 배열로 생성
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]])
- 다시 원래의 데이터 행렬로 추출됨을 알 수 있음.
(2) 희소 행렬 - CSR 형식
CSR(Compressed Sparse Row)
형식은COO
형식이 행과 열의 위치를 나타내기 위해서 반복적인 위치 데이터를 사용해야 하는 문제점을 해결한 방식
from numpy import array
from scipy.sparse import csr_matrix
# 매트릭스
A = array([[1, 0, 0, 1, 0, 0], [0, 0, 2, 0, 0, 1], [0, 0, 0, 2, 0, 0]])
print(A)
# CSR method
S = csr_matrix(A)
print(S)
# reconstruct dense matrix
B = S.todense()
print(B)
[[1 0 0 1 0 0]
[0 0 2 0 0 1]
[0 0 0 2 0 0]]
(0, 0) 1
(0, 3) 1
(1, 2) 2
(1, 5) 1
(2, 3) 2
[[1 0 0 1 0 0]
[0 0 2 0 0 1]
[0 0 0 2 0 0]]
COO
와CSR
이 어떻게 희소 행렬의 메모리를 줄일 수 있는지 예제를 통해서 살펴보았다.- 간단하게 정리를 하면 다음과 같다.
from numpy import array
from scipy import sparse
dense = array([[1, 0, 0, 1, 0, 0], [0, 0, 2, 0, 0, 1], [0, 0, 0, 2, 0, 0]])
coo = sparse.coo_matrix(dense)
print(coo)
(0, 0) 1
(0, 3) 1
(1, 2) 2
(1, 5) 1
(2, 3) 2
csr = sparse.csr_matrix(dense)
print(csr)
(0, 0) 1
(0, 3) 1
(1, 2) 2
(1, 5) 1
(2, 3) 2
옵션
- 사이킷런의
CountVectorizer
나TfidfVectorizer
클래스로 변환된 피처 벡터화 행렬은 모두Scipy
의CSR
형태의 희소 행렬이다.
‘This implementation produces a sparse representation of the counts using scipy.sparse.csr_matrix.’ from https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html
-
따라서, 희소행렬의 문제점을 해결 할 때에는
CSR
방식을 써주는 것이 좋다. -
희소행렬에 대한 문제점에 대해 상세한 설명은 다음 글을 참고한다.
Reference
- 권철민. (2020). 파이썬 머신러닝 완벽가이드. 경기, 파주: 위키북스