본문 바로가기

부트캠프/멀티캠퍼스_퍼포먼스 마케팅과 데이터 분석

[멀티캠퍼스 부트캠프 11주차] 데이터 분석 심화_자연어 처리

데이터 분석 심화_자연어 처리


 

단어 가방 모형(Bag of Words; BOW)

1. BOW의 정의 및 특징

1) 정의 및 구조

 -개념: 문서에 포함된 단어들의 순서를 무시하고, 오직 각 단어의 출현 빈도(Frequency)만을 기반으로 문서를 수치화하는 방식임.

 -DTM(Document Term Matrix): 개별 문서의 토큰 빈도를 행렬로 나타낸 결과물이며, 행은 문서, 열은 단어 토큰을 의미함.

 

2) BOW 및 DTM의 한계

 -의미(Semantic) 정보 결여: 단어 간의 연관성이나 의미 차이를 반영하지 못하고 단어의 순서 정보가 손실됨.

 -고차원 희소 행렬(Sparse Matrix): 단어 사전이 커질수록 대부분의 값이 0으로 채워져 메모리 효율이 저하됨.

-일반화 한계: 학습 시 사전에 없던 단어(OOV; Out Of Vocabulary)가 등장하면 처리하지 못하는 한계가 있음.

 

 

2. 코드 구현 및 세부 설명

1) 환경 설정 및 말뭉치(Corpus) 준비

 -라이브러리: 데이터 처리를 위한 pandas, 수치 계산을 위한 numpy, 시각화를 위한 matplotlib 등을 활용함.

 -데이터: 분석하고자 하는 문장들을 리스트 형태인 corpus에 담아 준비함.

 

2) 사이킷런을 활용한 벡터화 공정

 -모델 선언 및 학습:

  • CountVectorizer(): 텍스트를 빈도 기반 벡터로 변환하는 클래스임.
  • fit(): 말뭉치 내의 모든 토큰을 추출하여 중복 없는 어휘 사전을 학습하고 인덱스를 부여함. 
    • transform(): 학습된 사전을 바탕으로 각 문장의 단어 빈도를 수치 행렬(DTM)로 변환함.
    • get_feature_names_out(): 학습된 사전의 단어 목록을 인덱스 순서대로 반환하여 열 이름으로 사용함.
    • toarray(): 희소 행렬을 일반적인 2차원 배열 형태로 변환하여 가독성을 높임.
      dtm = cvect.transform(corpus)
      vocab = cvect.get_feature_names_out()
      df_dtm = pd.DataFrame(dtm.toarray(), columns=vocab)
      
  • from sklearn.feature_extraction.text import CountVectorizer
    cvect = CountVectorizer()
    cvect.fit(corpus)
    

    -행렬 변환 및 데이터프레임화:

 

3) 주요 파라미터 활용

 -n-gram (ngram_range): 연속적인 토

큰을 묶어서 하나의 단위로 처리함(예: (1, 2)는 유니그램과 바이그램을 모두 포함).

 -빈도 제어(min_df, max_df): 너무 희귀하거나 너무 흔한 단어를 필터링하여 사전의 질을 높임.

 -기능 제한(max_features, stop_words): 학습할 단어 수를 제한하거나 분석 의미가 없는 불용어를 직접 지정하여 제외함.

 


 

TF-IDF(Term Frequency - Inverse Document Frequency)

1. TF-IDF의 정의 및 목적

1) 핵심 지표의 정의

 -TF(Term Frequency): 특정 문서 내에서 해당 단어가 등장하는 빈도로, 문서 내 중요도를 나타냄.

 -IDF(Inverse Document Frequency): 특정 단어가 등장한 문서 수에 반비례하는 값으로, 문서군 전반에 흔하게 나타나는 단어의 가중치를 낮춤.

 

2) 사용 목적 및 특징

 -가중치 보정: 모든 문서에 공통으로 등장하여 변별력이 낮은 단어의 가중치를 낮추고, 특정 문서에서만 발견되는 핵심어에 높은 점수를 부여함.

 -핵심어 추출: 단순히 빈도수만 고려하는 BOW보다 문서의 핵심 의미를 파악하는 데 유리함.

 

 

2. 코드 구현 및 세부 설명

1) TfidfVectorizer를 이용한 가중치 행렬 생성

 -구현 코드:

  • TfidfVectorizer(): TF-IDF 계산을 지원하는 전용 벡터라이저 클래스임.
  • fit_transform(): 단어 사전 학습과 가중치 계산 및 행렬 변환을 동시에 수행함. 
  • from sklearn.feature_extraction.text import TfidfVectorizer
    tfidfvect = TfidfVectorizer(ngram_range=(1, 2))
    dtm = tfidfvect.fit_transform(corpus)
    

2) 결과 데이터 분석

 -코드 설명:

  • 결과물을 데이터프레임으로 변환하면, '문의입니다'와 같이 모든 문서에 등장하는 단어는 낮은 가중치를, '코로나'와 같이 특정 문서에 집중된 단어는 높은 가중치를 가짐을 확인할 수 있음.
    vocab = tfidfvect.get_feature_names_out()
    df_dtm = pd.DataFrame(dtm.toarray(), columns=vocab)
    

 

3) 분석의 한계와 대안

 -한계: 빈도를 보정한 지표일 뿐 여전히 Bag-of-Words 구조이므로 단어의 문맥적 의미를 완전히 이해하지 못함.

 -보완: 더 정교한 의미 파악을 위해 Word2Vec, BERT, GPT

등의 딥러닝 기반 임베딩 모델을 활용함.

 


 

#부트캠프후기 #멀티캠퍼스부트캠프 # 데이터마케팅부트캠프