멋사 AISCOOL 7기 Python/TIL

[TIL]1213: 빈도기반워드임베딩, TF-IDF, 텍스트데이터 EDA, 전처리

dundunee 2022. 12. 14. 02:08

텍스트 분석과 자연어 처리

빈도 기반 워드 임베딩

TF(단어빈도)

  • 특정한 단어가 문서 내에 얼마나 자주 등장하는지를 나타내는 값
  • 이 값이 높을 수록 중요하다고 생각할 수 있지만 문서내에서 자주 등장하면 흔하게 등장한다는 의미

DF

  • 특정 단어가 등장한 문서의 수

IDF

  • 역문서 빈도, DF역수로 DF에 반비례하는 수

TF-IDF

  • TF * IDF
  • 모든 문서에 자주 등장하는 단어는 중요도가 낮다고 판단
  • 특정 문서에서만 자주 등장하는 단어는 중요도가 높다고 한단
  • 이 값이 낮으면 중요도가 낮고, 이 값이 크면 중요도가 큰 것

sklearn의 feature_extraction

sckit-learn에 문서 전처리 기능이 제공됨

  • from sklearn.feature_extraction.text import CountVectorizer
  • from sklearn.feature_extraction.text import TfidfVectorizer

fit과 transform

  • 기준을 train 으로 해주어야 test도 같은 방법으로 전처리 할 수 있다.
  • train, test 각각 fit을 하게 되면 다른 기준으로 전처리 하게 됩니다.
  • 텍스트 데이터를 각각 fit을 하게 되면 다른 단어사전으로 전처리 되어 기준이 다르게 됩니다.

CountVectorizer

  • analyzer: n_그램을 지정할 수 있음
  • max_df(불용어 제거), min_df(오타, 희귀단어 제거), max_features

HashingVectorizer

TfidfTransformer

  • TF-IDF 가중치를 만들어줌

TfidfVectorizer

  • TfidfTransformer대신 그냥 이거 쓰면 됨

1101 실습

Bag of Words

max_features

이미지를 다룰 때는 돈을 쓰지 않고 모델을 내 컴퓨터에서 돌리기 위해 이미지 사이즈, 레이어 개수 등을 조정했다 텍스트 데이터에서 내 컴퓨터가 힘들어 한다면 여러 방법을 사용할 수 있는데 가장 간단한 방법이 max_features 를 작게 조정하는 것이다. 비지도학습의 차원축소를 사용하게 되면 데이터를 압축해서 사용할 수도 있다. 그런데 차원축소 과정에서도 메모리 오류가 발생할 수도 있는데 그럴 때 max_features 를 내 컴퓨터가 계산할 사이즈로 적당하게 조정해 주면 로컬 PC로도 어느정도 돌려볼 수 있다. 여기에서 조금 더 조정한다면 min_df, max_df, stop_words 등을 조정해 볼 수 있다.

관련영상

https://www.youtube.com/playlist?list=PLaTc2c6yEwmp35y9Z868VlV9NQpG-eBb6

1103실습

문자길이세기

  • 형태소 분석기를 사용하면 단어의 수를 셀 때 중복을 더 제거할 수 있다.
  • 문자길이: df["len"] = df["title"].map(lambda x: len(x))
  • 단어 수: df["word_count"] = df["title"].map(lambda x: len(x.split()))
  • 유니크한 단어수: df["unique_word_count"] = df["title"].map(lambda x: len(set(x.split()))) #set을 해주면 중복이 사라진다.
  • displot의 histogram으로 시각화해보며 빈도수가 많은 단어, 길이가 유난히 긴 단어 등을 파악할 수 있음
  • 이러한 방법으로 텍스트 데이터 전처리 및 eda에 사용하기도함

텍스트 데이터 분석

  • 너무 길거나 짧지는 않은지
  • 단어 또는 토픽의 분포

문자 전처리

숫자제거

  • 정규표현식, map, lambda이용: df["title"].map(lambda x: re.sub("[0-9]", "", x))
  • str.replace(regex=True)이용: df["title"] = df["title"].str.replace("[0-9]", "", regex=True)

공백제거

  • re.sub("[\s]+", " ", "공백 전처리")
  • df["title"].str.replace("[\s]+", " ", regex=True)

워드클라우드

def display_word_cloud(data, width=1200, height=500): word_draw = WordCloud() word_draw.generate(data) plt.imshow(word_draw)