250x250
Link
๋‚˜์˜ GitHub Contribution ๊ทธ๋ž˜ํ”„
Loading data ...
Notice
Recent Posts
Recent Comments
๊ด€๋ฆฌ ๋ฉ”๋‰ด

Data Science LAB

[Python]Bag of Words(BOW) ๋ณธ๋ฌธ

๐Ÿ›  Machine Learning/ํ…์ŠคํŠธ ๋ถ„์„

[Python]Bag of Words(BOW)

ใ…… ใ…œ ใ…” ใ…‡ 2022. 2. 18. 13:10
728x90

Bag of Words ๋ชจ๋ธ์€ ๋ฌธ์„œ๊ฐ€ ๊ฐ€์ง„ ๋ชจ๋“  ๋‹จ์–ด(Words)๋ฅผ ๋ฌธ๋งฅ์ด๋‚˜ ์ˆœ์„œ์— ์ƒ๊ด€์—†์ด ๋‹จ์–ด์˜ ๋นˆ๋„ ๊ฐ’์— ๋”ฐ๋ผ ํ”ผ์ฒ˜ ๊ฐ’์„ ์ถ”์ถœํ•˜๋Š” ๋ชจ๋ธ์ด๋‹ค. ๋ฌธ์„œ ๋‚ด์˜ ๋ชจ๋“  ๋‹จ์–ด๋ฅผ ํ•œ๋ฒˆ์— ๋ด‰ํˆฌ(Bag)์•ˆ์— ๋„ฃ์€ ๋’ค ํ”๋“ค์–ด ์„ž๋Š” ๋‹ค๋Š” ์˜๋ฏธ๋กœ Bag of Words ๋ชจ๋ธ์ด๋ผ๊ณ  ํ•œ๋‹ค. 

 

BOW๋ชจ๋ธ์€ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๋ชจ๋ธ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹จ์ˆœํ•˜๊ฒŒ ๋‹จ์–ด์˜ ๋นˆ๋„ ์ˆ˜์— ๊ธฐ๋ฐ˜ํ•˜์ง€๋งŒ, ๋ฌธ์„œ์˜ ํŠน์ง•์„ ์ž˜ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์–ด ํ™œ์šฉ๋„๊ฐ€ ๋†’๋‹ค. 

 

 

 

ํ•œ๊ณ„์ 

- ๋ฌธ๋งฅ ์˜๋ฏธ ๋ฐ˜์˜ ๋ถ€์กฑ : BOW๋Š” ๋‹จ์–ด์˜ ์ˆœ์„œ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋‹จ์–ด์˜ ๋ฌธ๋งฅ์ ์ธ ์˜๋ฏธ๊ฐ€ ๋ฌด์‹œ๋œ๋‹ค. ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด n_gram๋“ฑ ์—ฌ๋Ÿฌ ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ œํ•œ์ ์ด๋‹ค. 

 

 

- ํฌ์†Œ ํ–‰๋ ฌ ๋ฌธ์ œ : BOW๋กœ ํ”ผ์ฒ˜ ๋ฒกํ„ฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด, ํฌ์†Œ ํ–‰๋ ฌ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ์…‹์ด ๋งŒ๋“ค์–ด์ง€๊ธฐ ์‰ฝ๋‹ค. ๋งŽ์€ ๋ฌธ์„œ์—์„œ ๋‹จ์–ด๋ฅผ ์ถ”์ถœํ•˜๋ฉด ๋งค์šฐ ๋งŽ์€ ๋‹จ์–ด๊ฐ€ ์ปฌ๋Ÿผ์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์–ด๊ฐ€ ๋ฌธ์„œ๋งˆ๋‹ค ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. 

๋Œ€๊ทœ๋ชจ์˜ ์ปฌ๋Ÿผ์œผ๋กœ ๊ตฌ์„ฑ๋œ ํ–‰๋ ฌ์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ’์ด 0์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ–‰๋ ฌ์„ ํฌ์†Œ ํ–‰๋ ฌ์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ํฌ์†Œ ํ–‰๋ ฌ์€ ๋จธ์‹ ๋Ÿฌ๋‹์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰ ์‹œ๊ฐ„๊ณผ ์˜ˆ์ธก ์„ฑ๋Šฅ์„ ๋–จ์–ด๋œจ๋ฆฐ๋‹ค. 

 

 

 

 

 

 

ํ”ผ์ฒ˜ ๋ฒกํ„ฐํ™”

๋จธ์‹ ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋Š” ์ˆซ์žํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์—, ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋Š” ๋จธ์‹ ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋ฐ”๋กœ ์ž…๋ ฅํ•  ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ํŠน์ • ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋Š” ์ˆซ์ž ๊ฐ’์ธ ๋ฒกํ„ฐ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ๋ณ€ํ™˜์„ ํ”ผ์ฒ˜ ๋ฒกํ„ฐํ™”๋ผ๊ณ  ํ•œ๋‹ค. 

 

๊ฐ ๋ฌธ์„œ์˜ ํ…์ŠคํŠธ๋ฅผ ๋‹จ์–ด๋กœ ์ถ”์ถœํ•ด ํ”ผ์ฒ˜๋กœ ํ• ๋‹นํ•˜๊ณ , ๊ฐ ๋‹จ์–ด์˜ ๋ฐœ์ƒ ๋นˆ๋„ ๊ฐ’์„ ํ”ผ์ฒ˜์— ๋ถ€์—ฌํ•ด ๊ฐ ๋ฌธ์„œ๋ฅผ ์ด ๋‹จ์–ด ํ”ผ์ฒ˜์˜ ๋ฐœ์ƒ ๋นˆ๋„ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ฒกํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. 

 

BOW ๋ชจ๋ธ์—์„œ ํ”ผ์ฒ˜ ๋ฒกํ„ฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋ชจ๋“  ๋ฌธ์„œ์—์„œ ๋ชจ๋“  ๋‹จ์–ด๋ฅผ ์ปฌ๋Ÿผํ˜•ํƒœ๋กœ ๋‚˜์—ดํ•˜๊ณ  ๊ฐ ๋ฌธ์„œ์—์„œ ํ•ด๋‹น ๋‹จ์–ด์˜ ํšŸ์ˆ˜๋‚˜ ์ •๊ทœํ™”๋œ ๋นˆ๋„๋ฅผ ๊ฐ’์œผ๋กœ ๋ถ€์—ฌํ•˜๋Š” ๋ฐ์ดํ„ฐ ์…‹ ๋ชจ๋ธ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

 

 

- ์นด์šดํŠธ ๊ธฐ๋ฐ˜์˜ ๋ฒกํ„ฐํ™” : ๋‹จ์–ด ํ”ผ์ฒ˜์— ๊ฐ’์„ ๋ถ€์—ฌํ•  ๋•Œ, ๊ฐ ๋ฌธ์„œ์—์„œ ํ•ด๋‹น ๋‹จ์–ด๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ํšŸ์ˆ˜(Count)๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ๊ฒฝ์šฐ

(๋ฌธ์„œ์˜ ํŠน์ง•๋ณด๋‹ค๋Š” ์–ธ์–ด์˜ ํŠน์„ฑ์ƒ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋‹จ์–ด์— ๋†’์€ ๊ฐ’์„ ๋ถ€์—ฌํ•˜๋Š” ๋‹จ์ )

 

- TF-IDF(Term Frequency - Inverse Document Frequency) : ๊ฐœ๋ณ„ ๋ฌธ์„œ์—์„œ ์ž์ฃผ ๋‚˜ํƒ€๋‚˜๋Š” ๋‹จ์–ด์— ๋†’์€ ๊ฐ€์ค‘์น˜๋ฅผ ์ฃผ์ง€๋งŒ, ๋ชจ๋“  ๋ฌธ์„œ์—์„œ ์ž์ฃผ ๋‚˜ํƒ€๋‚˜๋Š” ๋‹จ์–ด์— ๋Œ€ํ•ด์„œ๋Š” ํŒจ๋„ํ‹ฐ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. 

 

=> ๋ฌธ์„œ๋งˆ๋‹ค ํ…์ŠคํŠธ๊ฐ€ ๊ธธ๊ณ , ๋ฌธ์„œ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ์—๋Š” ์นด์šดํŠธ ๋ฐฉ์‹๋ณด๋‹ค๋Š” TF-IDF๋ฐฉ์‹์ด ์œ ๋ฆฌ!

 

 

 

 

 

 

 

์‚ฌ์ดํ‚ท๋Ÿฐ์—์„œ์˜ Count(CountVectorizer)

์นด์šดํŠธ ๊ธฐ๋ฐ˜์˜ ๋ฒกํ„ฐํ™”๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค, ์†Œ๋ฌธ์ž ์ผ๊ด„ ๋ณ€ํ™˜, ํ† ํฐํ™”, ์Šคํƒ‘์›Œ๋“œ ํ•„ํ„ฐ๋ง๊นŒ์ง€ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ

 

ํŒŒ๋ผ๋ฏธํ„ฐ ๋ช… ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค๋ช…
max_df ๋„ˆ๋ฌด ๋†’์€ ๋นˆ๋„์ˆ˜์˜ ๋‹จ์–ด ํ”ผ์ฒ˜ ์ œ์™ธ
min_df ๋„ˆ๋ฌด ๋‚ฎ์€ ๋นˆ๋„์ˆ˜์˜ ๋‹จ์–ด ํ”ผ์ฒ˜ ์ œ์™ธ
max_features ์ถ”์ถœํ•˜๋Š” ํ”ผ์ฒ˜์˜ ๊ฐœ์ˆ˜ ์ œํ•œ(์ •์ˆ˜๊ฐ’)
stop_words ์Šคํ†ฑ์›Œ๋“œ๋กœ ์ง€์ •๋œ ๋‹จ์–ด๋Š” ์ถ”์ถœ์—์„œ ์ œ์™ธ
n_gram_range n_gram์˜ ๋ฒ”์œ„ ์„ค์ • (๋ฒ”์œ„ ์ตœ์†Œ, ๋ฒ”์œ„ ์ตœ๋Œ€)
analyzer ํ”ผ์ฒ˜ ์ถ”์ถœ์„ ์ˆ˜ํ–‰ํ•  ๋‹จ์œ„ ์ง€์ •(default = 'word')
token_pattern ์ •๊ทœ ํ‘œํ˜„์‹ ํŒจํ„ด ์ง€์ •
tokenizer ํ† ํฐํ™”๋ฅผ ๋ณ„๋„์˜ ์ปค์Šคํ…€ ํ•จ์ˆ˜๋กœ ์ด์šฉ์‹œ ์ง€์ •

 

 

 

CountVectorizer๋ฅผ ์ด์šฉํ•ด ํ”ผ์ฒ˜ ๋ฒกํ„ฐํ™”๋ฅผ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

1. ์‚ฌ์ „ ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต : ๋ฌธ์ž๋ฅผ ์†Œ๋ฌธ์ž๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋“ฑ ์‚ฌ์ „ ์ž‘์—… ์ˆ˜ํ–‰

2. ํ† ํฐํ™” : ๋””ํดํŠธ๋กœ ๋‹จ์–ด ๊ธฐ์ค€์œผ๋กœ n_gram_range๋ฅผ ๋ฐ˜์˜ํ•ด ๊ฐ ๋‹จ์–ด ํ† ํฐํ™”

3. ํ…์ŠคํŠธ ์ •๊ทœํ™” : Stop Words ํ•„ํ„ฐ๋ง๋งŒ ์ˆ˜ํ–‰

4. ํ”ผ์ฒ˜ ๋ฒกํ„ฐํ™” : max_df, min_df ๋“ฑ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ ํ† ํฐํ™”๋œ ๋‹จ์–ด๋“ค์„ ํ”ผ์ฒ˜ ์ถ”์ถœ ํ›„ ๋ฒกํ„ฐ ๊ฐ’ ์ ์šฉ

 

 

 

 

 

ํฌ์†Œ ํ–‰๋ ฌ - COOํ˜•์‹

COO(Coordinate : ์ขŒํ‘œ) ํ˜•์‹์€ 0์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ๋งŒ ๋ณ„๋„์˜ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์— ์ €์žฅํ•˜๊ณ , ๊ทธ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ–‰๊ณผ ์—ด์˜ ์œ„์น˜๋ฅผ ๋ณ„๋„์˜ ๋ฐฐ์—ด๋กœ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. 

 

ํŒŒ์ด์ฌ์—์„œ๋Š” ํฌ์†Œ ํ–‰๋ ฌ ๋ฐ˜ํ™˜์„ ์œ„ํ•ด ์ฃผ๋กœ Scipy๋ฅผ ์ด์šฉํ•œ๋‹ค. 

Scipy์˜ sparse๋ฅผ ์ด์šฉํ•ด ํฌ์†Œ ํ–‰๋ ฌ ๋ณ€ํ™˜์„ COOํ˜•์‹์œผ๋กœ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. 

 

 

import numpy as np
from scipy import sparse

#array ์ƒ์„ฑ
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)))

#toarray๋ฅผ ์ด์šฉํ•ด ๋ฐ€์ง‘ ํ˜•ํƒœ์˜ ํ–‰๋ ฌ๋กœ ์ถœ๋ ฅ
sparse_coo.toarray()

์›๋ž˜์˜ ๋ฐ์ดํ„ฐ ํ–‰๋ ฌ๋กœ ์ถ”์ถœ๋จ์„ ํ™•์ธ 

 

 

 

 

 

 

ํฌ์†Œ ํ–‰๋ ฌ - CSR ํ˜•์‹

๋ฐ˜๋ณต์ ์ธ ์œ„์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” COOํ˜•์‹์˜ ๋‹จ์  ๋ณด์™„

0์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด๊ณผ ์—ด ์œ„์น˜ ๋ฐฐ์—ด, ํ–‰ ์œ„์น˜ ๋ฐฐ์—ด์˜ ๊ณ ์œ ํ•œ ๊ฐ’์˜ ์‹œ์ž‘ ์œ„์น˜ ๋ฐฐ์—ด์„ csr_matrix์˜ ์ƒ์„ฑ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ž…๋ ฅํ•˜๋ฉด csr๋ฐฉ์‹์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. 

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,4,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))

print("COO : \n",sparse_coo.toarray())
print("CSR : \n",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.toarray())
print("CSR : \n",csr.toarray())

728x90
Comments