[ํ ์คํธ ๋ถ์] 2-(3). ํ ์คํธ ์ ์ฒ๋ฆฌ - Stemming๊ณผ Lemmatization
2022.02.20 - [๋จธ์ ๋ฌ๋ | ๋ฅ๋ฌ๋/ํ ์คํธ ๋ถ์] - [ํ ์คํธ ๋ถ์] 2-(2). ํ ์คํธ ์ ์ฒ๋ฆฌ - ๋ถ์ฉ์ด ์ ๊ฑฐ ์ ๋ฒ ๋ถ์ฉ์ด ์ ๊ฑฐ ํฌ์คํ ์ ์ด์ด์ Stemming & Lemmatization์ ๋ํด ์ ์ด๋ณด๋ ค๊ณ ํฉ๋๋ค! 1. Cleansing(ํด๋ ..
xod22.tistory.com
์ ๋ฒ ํฌ์คํ ์ ์ด์ด์ ํ ์คํธ ์ ์ฒ๋ฆฌ ๋ค์ ํ๋ก์ธ์ค์ธ Bag of Words(BOW)์ ๋ํด ๊ณต๋ถํด๋ณด๋ ค๊ณ ํฉ๋๋ค!

Bag of Words - BOW
: BOW ๋ชจ๋ธ์ ๋ฌธ์๊ฐ ๊ฐ์ง๋ ๋ชจ๋ ๋จ์ด๋ค์ ๋ฌธ๋งฅ๊ณผ ์์๋ฅผ ๋ฌด์ํ๊ณ ์ผ๊ด์ ์ผ๋ก ๋จ์ด์ ๋ํ ๋น๋ ๊ฐ์ ๋ถ์ฌํด ํผ์ฒ ๊ฐ์ ์ถ์ถํ๋ ๋ชจ๋ธ์ด๋ค.
๋น์ ์ ์ผ๋ก, ์๋ ๊ฐ์๋ฅผ ์์๋ก ๋ค ์ ์๋ค. ๋ฌธ์์ ์๋ ๋ชจ๋ ๋จ์ด๋ค์ ์ถ์ถํ์ฌ ์๋ ๊ฐ์ ํฉ์ ๋ฃ๊ณ ๋ค์๋ ๊ฒ์ด ์ด์ ๋น์ ๋ ์ ์๋ค. Bag of Words ์์ฒด๊ฐ ์ด๋ฐ ๋น์ ์์ ๋ชจ๋ธ ์ด๋ฆ์ด ์์ฑ๋์๋ค!
BOW ํ๋ก์ธ์ค
๋ง์ผ ๋ฌธ์ฅ1๊ณผ ๋ฌธ์ฅ2๊ฐ ์๋ค๋ฉด ๋ฌธ์ฅ1๊ณผ ๋ฌธ์ฅ2์ ๋ชจ๋ ๋จ์ด๋ค์ ์ค๋ณต์ ์ ์ธํ๊ณ ์ถ์ถํ ํ ์นผ๋ผ(์ด)์ผ๋ก ๋์ดํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ณ ๋ฌธ์ฅ๋ค์ ์ธ๋ฑ์ค(ํ)๋ก ์ค์ ํ๊ณ ๊ฐ ์ธ๋ฑ์ค์์ ์นผ๋ผ์ ๋์ด๋์ด์๋ ๋จ์ด๋ค์ ํ์๋ฅผ value ๊ฐ์ผ๋ก ์ธก์ ํ๋ค.
์ฅ์ : ์ฝ๊ณ ๋น ๋ฅธ ๊ตฌ์ถ์ด ๊ฐ๋ฅ
๋จ์ :
1. ๋ฌธ๋งฅ๊ณผ ์์๋ฅผ ์ ์ธํ๊ณ ํผ์ฒ๊ฐ์ ์ค์ ํ๊ธฐ ๋๋ฌธ์ ๋ฌธ๋งฅํด์์ด ์ด๋ ค์
2. ํฌ์ํ๋ ฌ ๋ฌธ์ ๋ฐ์ : ๋๋ถ๋ถ์ ์นผ๋ผ๊ฐ์ด 0์ผ๋ก ์ฑ์์ง๋ ํ๋ ฌ
-> BOW๋ ์ฌ๋ฌ ๋ฌธ์๋ค์ด ์์ ๋ ๋ชจ๋ ๋ฌธ์๋ค์ ๋จ์ด๋ค์ ์ถ์ถํ์ฌ ์นผ๋ผ(์ด)๋ก ๋์ดํ๋ค. ๊ฐ ๋ฌธ์๋ค์ ์ถ์ถํ ์นผ๋ผ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ ๋ฌธ์์ ๋จ์ด ๋น๋ ํ์๋ฅผ ์นผ๋ผ ๊ฐ์ผ๋ก ์ค์ ํ๋ค. ํ์ง๋ง, ๊ฐ ๋ฌธ์์์ ์ฌ์ฉ๋๋ ๋จ์ด๋ฅผ ์ถ์ถํ์ฌ ์นผ๋ผ์ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ์นผ๋ผ ๊ฐ์๋ ๋ฌด์ํ ๋ง์ง๋ง, ๊ฐ ๋ฌธ์๋ง๋ค ์ฌ์ฉํ๋ ๋จ์ด๋ ๋น์ฐํ ์์ดํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์๋ง๋ค ๊ฐ ์นผ๋ผ ๊ฐ๋ค์ด 0์ผ๋ก ์ฑ์์ง ํ๋ฅ ์ด ๋๋ค. ํฌ์ ํ๋ ฌ์ ์ผ๋ฐ์ ์ผ๋ก ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ์ ํ์ํค๊ธฐ ๋๋ฌธ์ ์ด๋ BOW ๋ชจ๋ธ์ ๋จ์ ์ด๋ผ๊ณ ํ ์ ์๋ค.
BOW ํผ์ฒ ๋ฒกํฐํ
1. ์นด์ดํธ ๊ธฐ๋ฐ์ ๋ฒกํฐํ : ๋น๋ ํ์๊ฐ ๋์ ๋จ์ด๋ฅผ ์ค์๋๊ฐ ๋์ ๋จ์ด๋ก ์ธก์ . ํ์ง๋ง ๋ชจ๋ ๋ฌธ์์์ ๊ณตํต์ ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋๋ ๋จ์ด๋ค์กฐ์ฐจ ์ค์๋๊ฐ ๋์ ๋จ์ด๋ก ์ ์ ๋จ..
2. TF-IDF ๊ธฐ๋ฐ์ ๋ฒกํฐํ : ๋น๋์๊ฐ ๋์ ๋จ์ด๋ฅผ ์ค์๋๊ฐ ๋์ ๋จ์ด๋ก ์ธก์ ํ์ง๋ง, ๋ชจ๋ ๋ฌธ์์์ ๋ณดํธ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋๋ ๋จ์ด์ ๋ํด์๋ ํ๋ํฐ๋ฅผ ๋ถ์ฌํ๋ค.
BOW ํฌ์ํ๋ ฌ ๋ฌธ์ ํด๊ฒฐ : COO / CSR
BOW ๋ฐฉ์์ ํผ์ฒ ๋ฒกํฐํ๊ฐ ํฌ์ํ๋ ฌ(0์ด ๋ง์)์ด๊ธฐ ๋๋ฌธ์, ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ๋ฐ๋ผ์ BOW ๋ฐฉ์์ ๋ฌด์ํ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ๋ ํฌ์ํ๋ ฌ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ฐจ์งํ๊ฒ ์ฒ๋ฆฌํด์ผ๋ง ํ๋ค. ๊ทธ ๋ฐฉ์์ผ๋ก COOํ์๊ณผ CSR ํ์์ด ์กด์ฌํ๋ค.
COO๋ฐฉ์๋ณด๋จ CSR ๋ฐฉ์์ด ํ๋ ฌ์ ๋ํด์ ์ ์ฅํ๊ฑฐ๋ ๊ณ์ฐํ ๋ ๋ ์ ๋ฆฌํ๋ค.
- COOํ์
: COOํ์์ 0์ด ์๋ ๋ฐ์ดํฐ๋ง ๋ณ๋์ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ์ ์ฅํ๊ณ , ๊ทธ ๋ฐ์ดํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ํ๊ณผ ์ด์ ์์น๋ฅผ ๋ณ๋์ ๋ฐฐ์ด๋ก ์ ์ฅํ๋ ๋ฐฉ์์ด๋ค.
->ํ์์น์ ์ด์์น๋ฅผ ๊ฐ๊ฐ ๋ฐฐ์ด๋ก ์์ฑํ๋ ๊ณผ์
0์ด ์๋ ๋ฐ์ดํฐ๋ [3,1,2]์ด๋ฉฐ 0์ด ์๋ ๋ฐ์ดํฐ์ ์์น๋ฅผ (row, col)์ผ๋ก ํํํ๋ฉด (0,0), (0,2), (1,1)์ด ๋ฉ๋๋ค.
row์ column์ ๋ณ๋์ ๋ฐฐ์ด๋ก ์ ์ฅํ๋ฉด row๋ [0,0,1]์ด๊ณ column์ [0,2,1]์ด ๋๊ฒ ๋ฉ๋๋ค.
ํ์ด์ฌ์์๋ ํฌ์ ํ๋ ฌ ๋ณํ์ ์ํด ์ฃผ๋ก ์ฌ์ดํ์ด(Scipy)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
~ํจํค์ง ๋ค์ด~
import numpy as np
from scipy import sparse
~COO๋ฐฉ์~
dense=np.array([[3,0,1], [0,2,0]])
#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)))
print(sparse_coo)
* COO ํ์์ ๋ฌธ์ ์
: COOํ์์ผ๋ก ๋ณํ์ ๋ฐ์ดํฐ ๋ฐฐ์ด์ [1, 5, 1, 4, 3, 2, 5, 6, 3, 2, 7, 8, 1]์ด๊ณ
ํ ์์น ๋ฐฐ์ด์ [0, 0, 1, 1, 1, 1, 1, 2, 2, 3, 4, 4, 5], ์ด ์์น ๋ฐฐ์ด์ [2, 5, 0, 1, 3, 4, 5, 1, 3, 0, 3, 5, 0]์ด ๋ฉ๋๋ค.
ํ ์์น ๋ฐฐ์ด์ ์์ธํ ๋ณด๋ฉด ์์ฐจ์ ์ธ ๊ฐ์ ๊ฐ์ด 0, 0, -> 1, 1, 1, 1,..->2, 2 ์ด๋ฐ์์ผ๋ก ๋ฐ๋ณต์ ์ผ๋ก ๋ํ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
- CSRํ์
: COO์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ ๊ฒ์ด CSR ๋ฐฉ์!
ํ ์์น ๋ฐฐ์ด ๋ด์ ์๋ ๊ณ ์ ํ ๊ฐ์ ์์ ์์น๋ง ๋ค์ ๋ณ๋์ ์์น ๋ฐฐ์ด๋ก ๊ฐ๋ ๋ณํ ๋ฐฉ์์ ์๋ฏธ
ํ ์์น ๋ฐฐ์ด์ด 0๋ถํฐ ์์ฐจ์ ์ผ๋ก ์ฆ๊ฐํ๋ ๊ฐ์ผ๋ก ์ด๋ค์ก๋ค๋ ํน์ฑ์ ๊ณ ๋ คํด ํ ์์น ๋ฐฐ์ด์ ๊ณ ์ ํ ๊ฐ์ ์์ ์์น๋ง ํ๊ธฐํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ๋ณต์ ์ ๊ฑฐ!
์ด๋ ๊ฒ ๊ณ ์ ๊ฐ์ ์์ ์์น๋ง ์๊ณ ์์ผ๋ฉด ์ผ๋ง๋ ์ง ํ ์์น ๋ฐฐ์ด์ ๋ค์ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ COO ๋ฐฉ์๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ๊ฒ ๋ค๊ณ ๋น ๋ฅธ ์ฐ์ฐ์ด ๊ฐ๋ฅํ๊ฒ ๋จ!
~ํจํค์ง ๋ค์ด~
from scipy import sparse
~CSR๋ฐฉ์~
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])
*์ค์ ๋ก๋ 0์ด ์๋ ๋ฐ์ดํฐ ๋ฐฐ์ด, ROW, COL ์์น ๋ฐฐ์ด์ ์ง์ ํ์ง ์๊ณ sparse.coo_matrix(๋ฐฐ์ด), sparse.csr_matrix(๋ฐฐ์ด)๋ก ์ฌ์ฉํด๋ ๋๋ค.
#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))
print('COO ๋ณํ๋ ๋ฐ์ดํฐ๊ฐ ์ ๋๋ก ๋์๋์ง ๋ค์ Dense๋ก ์ถ๋ ฅ ํ์ธ')
print(sparse_coo.toarray())
print('CSR ๋ณํ๋ ๋ฐ์ดํฐ๊ฐ ์ ๋๋ก ๋์๋์ง ๋ค์ Dense๋ก ์ถ๋ ฅ ํ์ธ')
print(sparse_csr.toarray())
COO๋ฐฉ์๊ณผ CSR๋ฐฉ์์ด ๋ชจ๋ ๋๊ฐ์ด ํ๋ ฌ์ ์ ์ฅํ๊ณ ์์์ ํ์ธํ ์ ์๋ค.
~์ค์ ์ฌ์ฉ~
dense3 = 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]])
coo = sparse.coo_matrix(dense3)
csr = sparse.csr_matrix(dense3)
print('COO\n', coo)
print('CSR\n', csr)
์ค๋์ ์ ์ฒ๋ฆฌ ๋ค์๋จ๊ณ์ธ BOW๋ฅผ ๊ณต๋ถํด๋ณด์๋๋ฐ์!
๋ค์ ํฌ์คํ ์์๋ ์ด๋ฅผ ํ์ฉํ์ฌ ์ค์ต์ ํด๋ณด๋ ค๊ณ ํฉ๋๋ค!
๋!-!
