멋사 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실습
- 딥러닝 실습
- 이미지: MNIST, FMNIST
- 텍스트: IMDB, 영화리뷰데이터셋, 네이버영화리뷰데이터셋
- 딥러닝을 이용한 자연어 처리 입문: https://wikidocs.net/book/2155
- 142가지 데이터셋: https://needleworm.github.io/dataset/
문자길이세기
- 형태소 분석기를 사용하면 단어의 수를 셀 때 중복을 더 제거할 수 있다.
- 문자길이: 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)