BoW๋ Bag of Words์ ์ฝ์๋ก, ๋จ์ด ๊ฐ๋ฐฉ์ ํ์ฉํ์ฌ ํ ์คํธ๋ฅผ ๋ฒกํฐํํ๋ ๋ฐฉ์์ ๋๋ค. ์ฆ, ์ฌ๋ฌ ๋จ์ด๋ค์ด ๋ด๊ธด ๋จ์ด ๊ฐ๋ฐฉ(Bag of Words)์์ ์์๋ก ๋จ์ด๋ฅผ ๊บผ๋ด์ด ํ ์คํธ์ ํด๋น๋๋ ๋จ์ด๊ฐ ๋ช ๊ฐ ์๋ ์ง ๊ทธ ๋น๋๋ฅผ ์ธ๋ ๋ฐฉ์์ด์ฃ .
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ๋จ์ด ๊ฐ๋ฐฉ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ด
์๋ค.
๋ง์ฝ I really really like dog.
๋ผ๋ ๋ฌธ์ฅ์ด ์๋ค๋ฉด, BoW๋ก๋ ๋ค์๊ณผ ๊ฐ์ด ํํํ ์ ์์ต๋๋ค.
์ด์ฒ๋ผ BoW๋ ๋จ์ด ๊ฐ๋ฐฉ์ ํฌํจ๋ ๋จ์ด๊ฐ ๋ช ๊ฐ ๋ค์๋์ง ๊ฐ์๋ก ํ
์คํธ๋ฅผ ๋ฒกํฐํํฉ๋๋ค. ํด๋น ๋ฌธ์ฅ์ ๋ฒกํฐํํ๋ฉด [1, 1, 1, 0, 2, 0, 0]
์ผ๋ก ํํํ ์ ์์ต๋๋ค.
BoW์ ๊ตฌํํ๊ธฐ ์ํด์ ๋จผ์ ๋จ์ด ๊ฐ๋ฐฉ์ ๋ง๋ค์ด์ผ ํ ํ์๊ฐ ์์ต๋๋ค. ๋จ์ด ๊ฐ๋ฐฉ์ ๊ฒฝ์ฐ, ์ค๋ณต๋๋ ๋จ์ด๊ฐ ์์ด์ผ ํ๊ณ ๋ฒกํฐํํ์์ ์ด๋ ๋จ์ด์ธ์ง ๊ตฌ๋ณํ๊ธฐ ์ํด ์๋ฒ์ด ๋ถ์ฌ๋์ด์ผ ํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ฅ์ ๋ํด์ BoW๋ฅผ ์คํํ๋ค ๊ฐ์ ํด๋ด ์๋ค.
sentences = ["I really want to stay at your house",
"I wish that I could turn back time",
"I need your time"]
์ด ๊ฒฝ์ฐ, ๋จ์ด ๊ฐ๋ฐฉ์ ์ธ ๋ฌธ์ฅ ๋ด์ ์ค๋ณต๋์ง ์์ ๋ชจ๋ ๋จ์ด๋งํผ์ ๊ธธ์ด๋ก ๋ง๋ค์ด์ ธ์ผ ํฉ๋๋ค.
from nltk.tokenize import word_tokenzie
word_bag = {}
for sent in sentences:
tokens = word_tokenize(sent)
for token in tokens:
if token not in word_bag.keys():
word_bag[token] = len(word_bag)
print(word_bag)
# ๊ฒฐ๊ณผ
# {'I': 0, 'really': 1, 'want': 2, 'to': 3, 'stay': 4, 'at': 5, 'your': 6, 'house': 7, 'wish': 8, 'that': 9, 'could': 10, 'turn': 11, 'back': 12, 'time': 13, 'need': 14}
๋จ์ด ๊ฐ๋ฐฉ์ ๊ธฐ๋ฐ์ผ๋ก BoW๋ฅผ ์งํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
result = []
for sent in sentences:
vector = []
for word in word_bag.keys():
if word in sent:
vector.append(sent.count(word))
else:
vector.append(0)
result.append(vector)
print(result)
# ๊ฒฐ๊ณผ
# [[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
# [2, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0],
# [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1]]
๋จ์ด ๊ฐ๋ฐฉ ๋ด ๋จ์ด์ ๋น๋์๊ฐ ์์๋๋ก ๋์ด๋์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํจ์๋ก ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฆฌํ ์ ์์ต๋๋ค.
import re
from nltk.tokenize import word_tokenize
def vector_word_of_bag(sents: list[str]) -> list[list[int]]:
sents = [re.sub("[^a-zA-Z0-9\s]", "", sent) for sent in sents] # ํน์ ๋ฌธ์๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
tokens: list[list[str]] = [word_tokenize(sent) for sent in sents] # ํ ํฐํ๋ฅผ ์งํํฉ๋๋ค.
word_bag: dict[str, int] = {}
for token in sum(tokens, []):
if token not in word_bag.keys():
word_bag[token] = len(word_bag)
result: list[list[int]] = []
for sent in tokens:
temp: list[int] = []
for word in word_bag.keys():
if word in sent:
temp.append(sent.count(word))
else:
temp.append(0)
result.append(temp)
return result
BoW๋ ์ง์ ์ ์ธ ๊ตฌํ ๋ง๊ณ ๋ ํ์ด์ฌ ๋ด scikit-learn
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ CountVectorizer()
ํด๋์ค๋ฅผ ํตํด์ ๊ตฌํํ ์๋ ์์ต๋๋ค.
๐ก scikit-learn์ด๋?
scikit-learn ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ์ด์ฌ ๋ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋๋ก ์ฃผ๋ก ๋จธ์ ๋ฌ๋๊ณผ ๊ด๋ จํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
CountVectorizer()
ํด๋์ค๋ ๋น๋์๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์คํธ๋ฅผ ๋ฒกํฐํํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. (pip
๋ช ๋ น์ด๋ฅผ ํตํ ์ค์น๊ฐ ํ์ํฉ๋๋ค.)
from sklearn.feature_extraction.text import CountVectorizer
sents = ["I really want to stay at your house",
"I wish that I could turn back time",
"I need your time"]
vectorizer = CountVectorizer()
vectorizer.fit(sents) # ํ
์คํธ ๋ฐ์ดํฐ๋ฅผ ํ์ต์ํต๋๋ค.
word_bag = vectorizer.vocabulary_
result = vectorizer.transform(sents).toarray()
print(word_bag)
print(result)
# ๊ฒฐ๊ณผ
# {'really': 5, 'want': 11, 'to': 9, 'stay': 6, 'at': 0, 'your': 13, 'house': 3, 'wish': 12, 'that': 7, 'could': 2, 'turn': 10, 'back': 1, 'time': 8, 'need': 4}
# [[1 0 0 1 0 1 1 0 0 1 0 1 0 1]
# [0 1 1 0 0 0 0 1 1 0 1 0 1 0]
# [0 0 0 0 1 0 0 0 1 0 0 0 0 1]]
์ด ๊ฒฝ์ฐ์๋ ๋ถ์ฉ์ด๊ฐ ์ฒ๋ฆฌ๋์ด ์๋ฏธ์๋ ๋จ์ด๋ค์ ๋น๋์๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋์ถํฉ๋๋ค.
BoW๋ ๋จ์ด ๊ฐ๋ฐฉ ๋ด ๋จ์ด๋ค์ ๋น๋๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์คํธ ๋ฒกํฐํ๋ฅผ ์งํํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์ฅ ๊ฐ ๋น๊ต๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ์ฆ, ๋ฌธ์ฅ ๊ฐ์ ์ ์ฌ๋๋ฅผ ์ดํด๋ณผ ์ ์๋ค๋ ์ด์ผ๊ธฐ์ด์ฃ .
์-ํซ ์ธ์ฝ๋ฉ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, ๋ฌธ์ฅ ๋ด์์ ๋จ์ด ๊ฐ์ ๊ด๊ณ๋ฅผ ๋๋ฌ๋ด์ง๋ ๋ชปํฉ๋๋ค. ๋จ์ด์ ์์๋ ์์น๋ฅผ ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์ด์ฃ . ๋ํ ๋จ์ด ์๊ฐ ๋ง์์ง์๋ก ๋จ์ด ๊ฐ๋ฐฉ์ด ๋์ด๋๊ณ , ๊ทธ๋งํผ ๋ฒกํฐ ์ฐจ์๋ ๋์ด๋๊ธฐ ๋๋ฌธ์ ๊ณต๊ฐ์ ์ผ๋ก ๋นํจ์จ์ ์ผ ์ ์์ต๋๋ค.
DTM์ Document-Term Matrix, ๋ฌธ์ ๋จ์ด ํ๋ ฌ์ ์ฝ์๋ก, ์์ ๋ฐฐ์ ๋ BoW๋ฅผ ํ์ฉํ์ฌ ์ฌ๋ฌ ๋ฌธ์๋ค์ ํ๋์ ๋ฒกํฐ๋ก ํํํ ๊ฒ์ ๋งํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฌธ์1, ๋ฌธ์2, ๋ฌธ์3, ๋ฌธ์4๊ฐ ์๋ค๋ฉด ์ด๋ค์ ๋จ์ด ๊ฐ๋ฐฉ์ ๋ง๋ค๊ณ BoW๋ฅผ ์คํํ ๊ฒ์ด์ฃ .
๋ฌธ์ 1. ๋๋ ๋ฐฅ์ ๋จน๋๋ค.
๋ฌธ์ 2. ๋๋ ๋ฐฅ์ ์ข์ํ๊ณ ์๋ฆฌ๋ ์ข์ํ๋ค.
๋ฌธ์ 3. ์๋ฆฌ๋ ์ฌ๋ฐ๊ณ ๋ฐฅ์ ๋จน๋ ๊ฒ๋ ์ฆ๊ฒจํ๋ค.
๋ฌธ์ 4. ๋ฐฅ๋ ๋ง์์ง๋ง ์นด๋ ๋ ๋ง์๋ค.
DTM์ ๊ฒฝ์ฐ BoW์ ์ฅ๋จ์ ์์ ๋ณผ ์ ์๋ฏ, ๋จ์ด ์งํฉ์ด ์ปค์ง ์๋ก ๋จ์ด ๊ฐ๋ฐฉ ๋ํ ์ปค์ง๊ธฐ ๋๋ฌธ์ ๊ณต๊ฐ์ ์ผ๋ก ๋นํจ์จ์ ์ด๋ผ๋ ๋จ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋ํ, ๋จ์ ๋น๋ ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ธฐ์ ๋ถ์ฉ์ด ์ฒ๋ฆฌ๋ฅผ ์ ํ์ง ์์ผ๋ฉด ์ ์๋ฏธํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค๋ ํ๊ณ๊ฐ ์์ต๋๋ค.