EH_dream

딥러닝학습 : 단어빈도와 벡터화 25.06.16 본문

딥러닝

딥러닝학습 : 단어빈도와 벡터화 25.06.16

Song EH. 2025. 6. 18. 18:19

단어빈도를 이용한 벡터화 – 자연어 처리의 기본기 다지기

 

이번 학습에서는 자연어 처리에서 가장 기본적이면서도 중요한 개념인 단어 빈도를 기반으로 한 텍스트 벡터화 방식들을 정리해보았다. 처음에는 문서 내 단어들이 몇 번 등장했는지를 세는 간단한 아이디어인 Bag of Words부터 시작했다. 단어의 순서나 맥락은 고려하지 않지만, 문서 간 유사도를 수치화할 수 있다는 점에서 유용하다. DTM(Document-Term Matrix)은 이를 행렬로 표현한 것이며, 실제로 sklearn의 CountVectorizer를 활용해 손쉽게 구현할 수 있었다.

 

하지만 곧 한계를 마주쳤다. 자주 등장하지만 정보성이 낮은 단어들(예: "the", "is")이 문서 간 유사도를 흐리게 만든다는 점이다. 그래서 등장한 것이 TF-IDF였다. TF-IDF는 특정 문서에만 자주 등장하는 단어에 더 큰 가중치를 부여해, 단어의 '중요도'를 반영하는 방식이다. 직접 수식을 구현해보면서 TF, IDF, TF-IDF를 모두 수치로 확인했고, sklearn의 TfidfVectorizer를 통해 간편하게 실제 데이터에 적용해볼 수 있었다.

 

# 사이킷런의 TfidfVectorizer를 통해 TF-IDF 행렬을 출력
from sklearn.feature_extraction.text import TfidfVectorizer

corpus = [
  'John likes to watch movies and Mary likes movies too',
  'James likes to watch TV',
  'Mary also likes to watch football games',  
]

tfidfv = TfidfVectorizer().fit(corpus)
vocab = list(tfidfv.vocabulary_.keys()) # 단어장을 리스트로 저장
vocab.sort() # 단어장을 알파벳 순으로 정렬

# TF-IDF 행렬에 단어장을 데이터프레임의 열로 지정하여 데이터프레임 생성
tfidf_ = pd.DataFrame(tfidfv.transform(corpus).toarray(), columns = vocab)
tfidf_

 

결과

 

또한 코사인 유사도라는 개념도 함께 학습했다. 두 문서 벡터의 방향성을 비교해 얼마나 유사한지를 판단하는 방식인데, 벡터의 내적과 크기를 통해 계산하며, 값이 1에 가까울수록 유사도가 높은 것이다. 특히 문서의 길이가 다르더라도 내용상의 유사성을 비교할 수 있다는 점에서 TF-IDF와 궁합이 좋다.

 

마지막으로 BoW, DTM, TF-IDF 각각의 개념 차이와 실제 사용 시 고려해야 할 점들을 정리해보았다. 단순한 빈도 기반 접근에서부터, 정보성 높은 단어를 추출하는 TF-IDF까지, 텍스트 데이터를 수치화해 모델에 적용할 수 있는 기반을 다지는 매우 유익한 시간이었다.