멋쟁이 사자처럼 AI 스쿨 TIL-48

김영민·2022년 12월 12일
0

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

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

QnA

  • 이미지 데이터를 읽어오면 다차원 형태의 구조로 되어있는데 np.array 형태로 되어있음에도 왜 다시 np.array 로 만들어주었을까요?
    => train_test_split에 사용하기 위해, 계산의 편의를 위해 넘파이 형태로 변경해 주었습니다.

  • 정답값을 균일하게 나누기 위해 사용하는 train_test_split 의 옵션은 무엇일까요?
    => stratify=y

  • accuracy와 val_accuracy 혹은 loss와 val_loss가 대략 어느정도 차이나면 오버피팅인지?
    => 시각화를 해보는게 좀 더 직관적으로 볼 수 있는데 더 이상 val_loss 값이 감소하지 않는데, loss 값은 줄어든다면 오버피팅 되었다고 판단하는게 나아보이며, 딱 수치가 얼마가 차이가 나면 오버피팅이다 이렇게 공식으로 얘기는 잘 하지 않는 편입니다

  • np.argmax 는 어떤 기능을 할까요?
    => 가장 큰 값을 가지는 index를 반환

  • 맨 마지막 에포크 결과가 아닌, 성능이 가장 좋았을때의 모델을 사용하는 방법은 없을까요?
    => 초기화 해서 다시 학습해서 성능이 잘 나오는 곳까지 early stop 이나 epoch값을 조정해 주세요!

  • 정규표현식 [0-9] 는 무엇을 의미할까요?
    => 모든 숫자를 가져온다

  • 정규표현식 [^0-9] 는 무엇을 의미할까요?
    => 모든 숫자를 제외합니다

  • steming, lematization
    => 한국어 형태소 분석기에서 제공하는 것도 있고 안 하는 형태소 분석기도 있습니다. 실습 할 때 다시 예제와 함께 다뤄보겠습니다. 원형을 어떻게 추출할지에 대한 방법을 다루는 것입니다.

  • 했다. 했어요. 했습니다. 했나요? 하다 => 하다로 통일해서 변형해 주면 어떤 효과가 있을까요?
    => 비슷한 의미의 단어를 하나로 전처리해서 나중에 벡터화(인코딩을) 했을 때 데이터의 용량을 줄이고 모델에게 힌트도 줄 수 있겠죠.
    => 실습에서는 KoNLPy 를 사용할 예정입니다. 지원하는 형태소 분석기도 있고 그렇지 않은 형태소 분석기도 있습니다.
    => KoNLPy 는 박사학위 논문으로 만들었던 도구 입니다. 자바, C, C++ 등으로 만들어진 형태소 분석기를 파이썬으로 사용할 수 있게 연결해 주는 도구입니다.
    => 파이썬은 접착제 언어이기 때문에 다른 언어로 만들어진 형태소 분석기를 파이썬으로 래핑해서 사용할 수 있게 해주는 도구 입니다

  • NLTK, Spacy 도 대표적인 텍스트 전처리 도구이며, 토큰화, steming, lematization, 불용어 등의 기능을 제공합니다. 하지만 저희는 실습에서 잘 사용하지 않을거에요. 왜 그럴까요?
    => 한글을 지원하지 않습니다.

  • N-grams 은 왜 사용할까요?
    => BOW 의 앞뒤 맥락을 고려하지 않는다는 단점을 해결하기 위해
    it's bad, not good at all.
    it's good, not bad at all.
    => 예시처럼 전혀 반대의 의미를 갖는 문장인데 BOW로 만들면 같은 형태가 됩니다. 그래서 묶어서 사용하게 되면 앞뒤 맥락을 고려할 수 있습니다.

  • min_df를 0.1, 0.2로 설정한다면 10%, 20% 보다 많이 나타나는 용어만 학습합니다. 너무 희귀한 단어를 제외하는 효과가 있는 것은 무엇을까요?
    => min_df

  • 너무 많이 등장하는 불용어를 제외하는 효과가 있는 것은 무엇일까요?
    => max_df

  • BOW를 사용하다보면 앞뒤 맥락을 고려하지 않는 단점이 있습니다. 이것을 해결하기 위한 것은 무엇일까요?
    => ngram_range

  • 단어를 너무 많이 사용해서 dtm 가 너무 커지는 것을 방지하기 위해 최대 단어를 제한하는 것은 무엇일까요?
    => max_features

  • 영어나 다른 외국어는 불용어 사전을 NLTK, Spacy 등에서 제공합니다. 하지만 한국어는 불용어 사전이 따로 없습니다. 왜 그럴까요?
    => 정답이 따로 있지는 않습니다. 한국어는 맥락에 따라 복잡하고 다양한 의미를 갖고 또 도메인마다의 불용어가 다 다릅니다. 예를 들어 코로나 치료제 관련 논문을 연구 한다면 코로나 라는 단어는 불용어가 되겠죠. 예를 들어 파이썬 문서를 본다라고 했을 때 파이썬 문서에서도 파이썬이라는 단어는 불용어가 되겠죠.

딥러닝

성능향상

1) Conv, Pooling Layer 의 층을 더 쌓는다든지 파라미터 값을 변경해서 개선해 보세요.
2) compile 설정을 변경해 보세요.
3) fit 의 설정 값도 변경해 보세요.
4) 물론 이미지 사이즈나 이미지 전처리를 하면 더 나은 성능을 내지만 fit(학습)속도를 빠르게 하기 위해 기존 사이즈로 진행하겠습니다.

CNN

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

정규표현식

  • 정규표현식 => 문자, 숫자를 제외한 특수문자를 제외할 때 주로 사용합니다. 특정 패턴으로 텍스트 전처리 시에도 사용합니다. 정규표현식은 그 자체로 프로그래밍 언어입니다.
  • regular expression => 학교마다 차이가 있지만 보통 대학에서 배우면 한 학기동안 배우기도 합니다. 한 과목으로 되어있기도 합니다.

1101번 실습 목표

BagOfWords,TF-IDF => 단어를 숫자로 인코딩 하는 방법에 대해 알아보겠습니다.
토큰화 => 특정 문자(예. 띄어쓰기, 공백)으로 텍스트 데이터를 나눠주는 것

BOW(bag of words)

  • 가장 간단하지만 효과적이라 널리쓰이는 방법
  • 장, 문단, 문장, 서식과 같은 입력 텍스트의 구조를 제외하고 각 단어가 이 말뭉치에 얼마나 많이 나타나는지만 헤아립니다.
  • 구조와 상관없이 단어의 출현횟수만 세기 때문에 텍스트를 담는 가방(bag)으로 생각할 수 있습니다.
  • BOW는 단어의 순서가 완전히 무시 된다는 단점이 있다. 예를 들어 의미가 완전히 반대인 두 문장이 있다고 합니다.
it's bad, not good at all.
it's good, not bad at all.
  • 위 두 문장은 의미가 전혀 반대지만 완전히 동일하게 반환됩니다.
  • 이를 보완하기 위해 n-gram을 사용하는 데 BOW는 하나의 토큰을 사용하지만 n-gram은 n개의 토큰을 사용할 수 있도록 합니다.
  • min_df는 문서에 특정 단어가 최소 몇 번 이상 문서에 등장하는 단어를 가방에 담겠다는 의미입니다.

N-grams

  • 토큰을 몇 개 사용할 것인지를 구분합니다. 지정한 n개의 숫자 만큼의 토큰을 묶어서 사용합니다.
    -> 예를 들어 (1, 1) 이라면 1개의 토큰을 (2, 3)이라면 2~3개의 토큰을 사용합니다.
  • analyzer 설정에 따라 단어단위, 캐릭터 단위에 따라 사용할 수 있습니다.
  • 기본값 = (1, 1)
  • ngram_range(min_n, max_n)
  • min_n <= n <= max_n

min_df

기본값=1

  • min_df는 문서 빈도(문서의 %에 있음)가 지정된 임계값보다 엄격하게 낮은 용어를 무시합니다.
    -> 예를 들어, min_df=0.66은 용어가 어휘의 일부로 간주되려면 문서의 66%에 나타나야 합니다.
  • 때때로 min_df가 어휘 크기를 제한하는 데 사용됩니다.
    -> 예를들어 min_df를 0.1, 0.2로 설정한다면 10%, 20%에 나타나는 용어만 학습합니다.

max_df

  • 기본값=1
  • max_df=int : 빈도수를 의미
  • max_df=float : 비율을 의미
  • 어휘를 작성할 때 주어진 임계값보다 문서 빈도가 엄격히 높은 용어는 무시
  • 빈번하게 등장하는 불용어 등을 제거하기에 좋음
    -> 예를 들어 코로나 관련 기사를 분석하면 90%에 '코로나'라는 용어가 등장할 수 있는데, 이 경우 max_df=0.89 로 비율을 설정하여 너무 빈번하게 등장하는 단어를 제외할 수 있음

max_features

  • 기본값 = None
  • 벡터라이저가 학습할 기능(어휘)의 양 제한
  • corpus중 빈도수가 가장 높은 순으로 해당 갯수만큼만 추출

불용어 stop_words

  • 문장에 자주 등장하지만 "우리, 그, 그리고, 그래서" 등 관사, 전치사, 조사, 접속사 등의 단어로 문장 내에서 큰 의미를 갖지 않는 단어
stop_words=["코로나", "문의입니다", '터미널','택시']

cvect = CountVectorizer(stop_words=stop_words)
display_transform_dtm(cvect,corpus)

analyzer

  • 기본값='word'
  • 종류: word, char, char_wb
  • 기능을 단어 n-그램으로 만들지 문자 n-그램으로 만들어야 하는지 여부입니다. 옵션 'char_wb'는 단어 경계 내부의 텍스트에서만 문자 n-gram을 생성합니다. 단어 가장자리의 n-gram은 공백으로 채워집니다.
  • 띄어쓰기가 제대로 되어 있지 않은 문자 등에 사용할 수 있습니다.

TF-IDF

  • TF(단어 빈도, term frequency)는 특정한 단어가 문서 내에 얼마나 자주 등장하는지를 나타내는 값으로, 이 값이 높을수록 문서에서 중요하다고 생각할 수 있다. 하지만 단어 자체가 문서군 내에서 자주 사용되는 경우, 이것은 그 단어가 흔하게 등장한다는 것을 의미한다.
  • 이것을 DF(문서 빈도, document frequency)라고 하며, 이 값의 역수를 IDF(역문서 빈도, inverse document frequency)라고 한다. TF-IDF는 TF와 IDF를 곱한 값이다.
  • TF-IDF 전체 문서에서는 자주 등장하지 않지만 특정 문서에서 자주 등장한다면 가중치 값이 높게 나오게 됩니다. 모든 문서에 자주 등장하는 값은 가중치가 낮게 나오게 됩니다.
profile
배운걸 다 흡수하는 제로민

0개의 댓글