BoW (Bag of Words)
단어 출현 순서는 무시하고 빈도수만 기반으로 문서를 벡터화, 각 토큰들이 문서에서 몇번 등장했는지
생성방법
1.각 토큰에 고유 인덱스 부여
2. 문서별로 단어가 몇번 등장했는지 횟수 기록
한계점- 단어의 순서 고려하지 않음(문맥 고려 x), BoW는 원핫인코딩처럼 벡터공간의 낭비할 수 있음. (표시되지 않는 것 0으로 표시), 빈도수가 중요도를 의미 하지 않음. 전처리가 어떻게 하느냐에 따라 카운팅이 달라짐
code
docs = ['오늘 동물원에서 원숭이를 봤어',
'오늘 동물원에서 코끼리를 봤어 봤어',
'동물원에서 원숭이에게 바나나를 줬어 바나나를']
#띄어쓰기 단위로 토큰화
docs_ls = [d.split() for d in docs]
docs_ls
[['오늘', '동물원에서', '원숭이를', '봤어'],
['오늘', '동물원에서', '코끼리를', '봤어', '봤어'],
['동물원에서', '원숭이에게', '바나나를', '줬어', '바나나를']]
#각 고유 토큰에 인덱스 지정
from collections import defaultdict
word2id = defaultdict(lambda:len(word2id)) #word2id의 길이만큼 추가하는 형태로 딕셔너리 생성
[word2id[t] for d in docs_ls for t in d]
word2id
defaultdict(<function __main__.<lambda>()>,
{'오늘': 0,
'동물원에서': 1,
'원숭이를': 2,
'봤어': 3,
'코끼리를': 4,
'원숭이에게': 5,
'바나나를': 6,
'줬어': 7})
#boW 생성, 원핫인코딩 방법 생성
import numpy as np
bow_ls = []
for i,d in enumerate(docs_ls): #인덱스아이디
bow = np.zeros(len(word2id),dtype = int) #word2id 길이만큼 0으로 차있음
for t in d : #도큐먼트 토큰별 탐색
bow[word2id[t]] += 1 #word2id 딕셔너리 해당 단어 위치 리턴
bow_ls.append(bow.tolist())
bow_ls
[[1, 1, 1, 1, 0, 0, 0, 0], [1, 1, 0, 2, 1, 0, 0, 0], [0, 1, 0, 0, 0, 1, 2, 1]]
sklearn 활용
from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer()
BoW = count_vect.fit_transform(docs)
BoW.toarray()
array([[1, 0, 1, 1, 1, 0, 0, 0],
[1, 0, 2, 1, 0, 0, 0, 1],
[1, 2, 0, 0, 0, 1, 1, 0]], dtype=int64)
2. TDM(Term-Document Matrix)
각 단어 빈도를 행렬로 표현
TDM은 행이 term, 열이 document
반대로 DTM은 행이 document, 열이 term
한계점- 순서를 고려하지 않음,벡터공간의 낭비, 빈도수가 중요도를 의미하지 않음 (보완책으로 TF-IDF 사용)
docs = ['오늘 동물원에서 원숭이를 봤어',
'오늘 동물원에서 코끼리를 봤어 봤어',
'동물원에서 원숭이에게 바나나를 줬어 바나나를']
doc_ls = [doc.split() for doc in docs]
from collections import defaultdict
word2id = defaultdict(lambda : len(word2id))
[word2id[token] for doc in doc_ls for token in doc ]
word2id
defaultdict(<function __main__.<lambda>()>,
{'오늘': 0,
'동물원에서': 1,
'원숭이를': 2,
'봤어': 3,
'코끼리를': 4,
'원숭이에게': 5,
'바나나를': 6,
'줬어': 7}
import numpy as np
TDM = np.zeros((len(word2id), len(doc_ls)), dtype=int) #행 len(word2id), 열 다큐먼트 수
for i, doc in enumerate(doc_ls):
for token in doc:
TDM[word2id[token], i] += 1 # 해당 토큰의 위치(column)
TDM
array([[1, 1, 0],
[1, 1, 1],
[1, 0, 0],
[1, 2, 0],
[0, 1, 0],
[0, 0, 1],
[0, 0, 2],
[0, 0, 1]])
출처:https://github.com/insightcampus/sesac-nlp/tree/main/ipynb
'Deep Learning > NLP' 카테고리의 다른 글
08. 주성분 분석 (0) | 2023.03.22 |
---|---|
07. TF-IDF(단어빈도-역문서빈도) (0) | 2023.03.18 |
05. TF-IDF, N-gram (0) | 2023.03.13 |
04. One- Hot Encoding, Similarlity (0) | 2023.03.13 |
03. 영문 텍스트 전처리 (0) | 2023.03.12 |