멋사 AISCOOL 7기 Python/TIL

[TIL] 1212: 텍스트분석과 자연어처리 기초(빈도기반 워드 임베딩)

dundunee 2022. 12. 14. 02:07

이번주 진행 주제 : 텍스트 분석과 자연어처리

  • CNN은 주로 이미지에 주로 사용이되고 물론 텍스트에도 사용한다.
  • 하지만 이미지에서 더 나은 성능을 보여준다.
  • 텍스트 분석을 할 때 머신러닝(Bag Of Words, TF-IDF), 딥러닝(RNN) 순서로 사용할 예정
  • 텍스트 분류, 텍스트로 주식의 가격을 예측하는 회귀 모델을 만든다든지 할 때는 주로 RNN이 CNN 보다 더 나은 성능을 내는 편입니다. RNN은 주로 순서가 있는 데이터에 사용합니다. 예를 들어 시계열데이터, 자연어도 말의 앞뒤에 순서가 있기 때문에 시계열, 자연어 등에 사용됩니다.
  • 자연어처리 실습 이후에는 RNN 으로 시계열 데이터를 다뤄볼 예정입니다.

1004 실습 복습

이미지 데이터를 읽어오면 다차원 형태의 구조로 되어 있는데, np.array 형태로 되어있음에도 왜 다시 np.array 로 만들어주었을까요?

  • 리스트 안에는 np.array로 되어 있더라도 여러장의 이미지를 하나로 만들 때 파이썬 리스트로 작성해줌
  • 따라서 이미지 여러 장을 하나의 변수에 넣어주었을 때 해당 변수의 데이터 타입은 파이썬 리스트 구조이다.
  • train_test_split을 사용하기 위해, 계산의 편의를 위해 넘파이 형태로 변경해준것이다.

층구성

  • 원핫인코딩 되어 있는 상태라면 y_train shape은 (정답 갯수, 정답 class개수)로 추출된다.
  • Fully-connected layer: convolution 계산 후 1차원 형태로 변환하고 Fully-connected Layer로 전달하기 위함

컴파일

  • 다중분류에서 손실함수: 원핫벡터의 경우 categorical_crossentropy, 라벨이 int형태인 경우 sparse_categorical_crossentropy를 사용

학습

  • validation split을 사용하지 않고, 따로 validation_data를 사용한 이유는 class를 stratify로 층화표집을 해주지 않으면 균일하게 학습이 되지 않는다.
  • 특히 멀티클래스일 때 이렇게 데이터를 따로 균일하게 나눠서 학습시키지 않으면 성능이 낮게 나올 때가 많다.
  • 따라서 더 골고루 학습하기 위해 validation_data를 지정해준다.
  • 어느정도가 과적합인가? : 시각화를 해보는게 좀 더 직관적으로 볼 수 있으며, 따로 공식은 없다. : 더이상 val_loss 값이 감소하지 않는데 loss값이 줄어든다면 오버피팅 되었다고 판단하는 것이 맞다. : val_loss 값이 나아지지 않는데 loss값만 나아진다면 확실하게 오버피팅이라고 볼 수 있다.

예측

  • softmax로 출력했기 때문에 합이 1이 되는 값으로 출력 된다.
  • 0번째 텍스트 이미지에 대한 분류 확률이다. 여기서 클래스를 어떻게 찾을 까?
  • np.argmax를 사용하며, 가장 큰 값의 인덱스를 반환하는 역할을 한다.

CNN 실습 정리

  1. MNIST, FMNIST, CIFAR10, 말라리아 혈액도말 이미지, 날씨이미지 데이터를 통해 이미지 분류 실습을 알아봄
  2. CNN Explainer를 통해 Conv, Pooling과정을 이미지로 이해해봄
  3. 왜 완전밀집연결층을 첫 레이어부터 사용하지 않고 합성곱 연산을 했을 까?
  • 완전밀집연결층은 flatten해서 이미지를 입력해주는데 그러면 주변 이미지를 학습하지 못하는 문제가 생김
  • 합성곱, 풀링 연산으로 특징을 학습하고, 출력층에서 flatten해서 완전연결밀집층에 주입해 주고 결과를 출력한다.
  1. 기존에 사용했던 DNN에서 배웠던 개념을 확장해서 합성곱 이후 완전연결밀집층을 구성하는 형태로 진행하였다.
  2. 이미지 전처리 도구는 matplotlib.pyplot의 imread를 통해 array로 읽어올 수 있고, PIL, OpenCV를 사용할 수 있다.
  3. 이미지 증강 기법 등을 통해 이미지를 변환해서 사용할 수 있다.

텍스트 분석과 자연어 처리(개념)

  • 데이터를 어떻게 넣어주느냐가 성능에 많은 영향을 미친다!
  • 머신러닝에서 텍스트로 된 카테고리 범주 값을 어떻게 처리했을까?: 인코딩을 해주었다!

자연어처리(NLP): 자연어의 의미를 분석해서 컴퓨터가 일을 할 수 있도록 하는 것

  • 텍스트는 영어로 학습한 내용을 한국어로 예측하면 성능이 어떻게 될까? : 정확도가 떨어진다.

텍스트 전처리

데이터 정제 및 전처리

  • HTML태그, 특수문자, 이모티콘, 정규표현식, 불용어, 어간 추출(원래 모양을 찾아주는 것), 음소표기법
  • 어간 추출과 음소거 표기법의 큰 차이는 원형을 보존하느냐 마느냐 이다.

정규표현식

  • 문자, 숫자를 제외한 특수문자를 제외할 때 주로 사용한다. 특정 패턴으로 텍스트 전처리 시에도 사용한다.
  • 정규표현식은 그 자체로 프로그래밍 언어이다.

토큰화

  • 텍스트 조각 = 토큰
  • 특정문자(띄어쓰기, 공백)으로 텍스트 데이터를 나눠주는 것

정제(cleaning), 정규화(normalization) 어간추출(steming)과 표제어표기법(lematization)

  • 원형을 어떻게 추출할 것인지에 대한 방법을 다루는 것
  • "했다", "했어요"를 "하다"로 통일하면 비슷한 의미의 단어를 하나로 전처리해서 나중에 벡터화(인코딩)했을 때 데이터의 용량을 줄이고, 모델에 힌트를 줄 수 있다.
  • 머신러닝에서 binning과 같은 효과가 있다.
  • 실습에서는 KoNLPy를 사용할 예졍이다. 지원하는 형태소 분석기도 있고, 그렇지 않은 형태소 분석기도 있다.
  • KoNLPy는 박사학위 논문으로 만들었던 도구로, 자바, C, C++등으로 만들어진 형태소 분석기를 파이썬으로 사용할 수 이게 연결해주는 도구이다.
  • 파이썬은 접착제 언어이기 때문에 다른 언어로 만들어진 형태소 분석기를 파이썬으로 래핑해서 사용할 수 있게 해주는 도구이다.

빈도기반 워드 임베딩

원핫인코딩 BOW: 텍스트를 담는 가방, 단어의 순서를 전혀 고려하지 않음 N_gram 언어모델: 모든 단어를 고려하는 것이 아니라 일부 언어만 고려하여 접근하는 방법, n개만큼 묶어서 사용함. 앞뒤 맥락을 조금 더 보전할 수 있음 문서 단어 행렬(DTM: Document-Term Matrix)

1101 실습

[목표] BOW(Bag Of Wrods), TF-IDF ->단어를 숫자로 인코딩 하는 방법

  • 이 실습에서 NLTK, Spacy와 같은 대표적인 텍스트 전처리 도구(토큰화, steming, lematization 등의 기능을 제공함)를 사용하지 않을 것이다.
  • 왜냐하면 한글을 지원하지 않기 때문이다.

Bag of Words

  • 장, 문단, 문장, 서식과 같은 입력 텍스트의 구조를 제외하고 각 단어가 이 말뭉치에 얼마나 많이 나타나는지만 헤아린다.
  • 단어의 순서가 완전히 무시된다는 단점이 있다.

CountVectorizer

N-grams: ngram_range

  • BOW의 앞뒤 맥락을 고려하지 않는다는 단점을 해결하기 위해

min_df

  • min_df는 문서 빈도(문서의 %에 있음)가 지정된 임계값보다 엄격하게 낮은 용어를 무시한다.
  • 너무 희귀한 단어를 제외하는것에 효과가 있다.

max_df

  • 어휘를 작성할 때 주어진 임계값보다 문서 빈도가 엄격히 높은 용어는 무시
  • 빈도수가 너무 많이 등장하는 불용어를 제거하는 효과도 있다.

max_features

  • 벡터라이저가 학습할 기능(어휘)의 양 제한 --> min_df, max_df, max_features로 어휘의 양을 제한할 수 있다.

불용어: stop_words

  • 자주 등장하지만 분석을 하는 것에 있어서는 큰 도움이 되지 않는 단어를 불용어라고 한다.
  • 영어나 다른 외국어는 불용어 사전을 NLTK, Spacy등에서 제공한다. 하지만 한국은 불용어 사전이 따로 없다.
  • 이유에 대해 정답이 따로 있지 않으나, 한국어는 맥락에 따라 복잡하고 다양한 의미를 갖고, 또 도메임마다의 불용어가 다르다.

analyzer

  • 기능을 단어 n-그램으로 만들지 문자 n-그램으로 만들어야 하는지 여부
  • word, char, char_wb
  • char_wd: 단어 안에서만 n_gram 사용
  • char: 단어 밖에서도 n_gram 사용
  • 띄어쓰기가 제대로 안되어있을 때 사용하기도함.

TF-IDF

  • TF(단어 빈도, term frequency)는 특정한 단어가 문서 내에 얼마나 자주 등장하는지를 나타내는 값
  • 단어 자체가 문서군 내에서 자주 사용되는 경우, 이것은 그 단어가 흔하게 등장한다는 것을 의미한다. 이것을 DF(문서 빈도, document frequency)라고 하며, 이 값의 역수를 IDF(역문서 빈도, inverse document frequency)라한다.
  • TF-IDF는 TF와 IDF를 곱한 값

TfidfVectorizer: 사이킷런에서 TF-IDF 가중치를 적용한 단어 벡터를 만들 수 있는 방법

  • 전체 문서에서는 자주 등장하지 않지만 특정 문서에서 자주 등장한다면 가중치 값이 높게 나오게 된다.
  • 모든 문서에서 자주 등장하는 값은 가중치가 낮게 나오게 된다.