본문 바로가기
멋쟁이사자처럼 AIS7/오늘코드

[1212] CNN 마무리와 NLP 입문

by YeonGun M 2022. 12. 12.

1004 날씨 분류 실습

CNN 복습

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

 

NLP 스타트

1101 실습:  BOW tfidf

정규표현식

  • 문자, 숫자를 제외한 특수문자를 제외할 때 주로 사용. 특정 패턴으로 텍스트 전처리 시에도 사용한다.
  • 정규표현식은 그 자체로 프로그래밍 언어
  • regular expression 학교마다 한과목 혹은 한학기 동안 배움
  • 위키백과 링크 참고

steming, lematization => 한국어 형태소 분석기에서 제공하는 것도 있고 안 하는 형태소 분석기도 있습니다. 실습 할 때 다시 예제와 함께 다뤄보겠습니다. 원형을 어떻게 추출할지에 대한 방법을 다루는 것입니다.
했다. 했어요. 했습니다. 했나요? 하다 => 하다로 통일해서 변형해 주면 어떤 효과가 있을까요?
=> 비슷한 의미의 단어를 하나로 전처리해서 나중에 벡터화(인코딩을) 했을 때 데이터의 용량을 줄이고 모델에게 힌트도 줄 수 있겠죠.


KoNLPy

  • KoNLPy 는 박사학위 논문으로 만들었던 도구
  • 자바, C, C++ 등으로 만들어진 형태소 분석기를 파이썬으로 사용할 수 있게 연결해 주는 도구
  • 파이썬은 접착제 언어이기 때문에 다른 언어로 만들어진 형태소 분석기를 파이썬으로 래핑해서 사용할 수 있게 해주는 도구

 

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는 문서에 특정 단어가 최소 몇 번 이상 문서에 등장하는 단어를 가방에 담겠다는 의미입니다.

CountVectorizer

  • CountVectorizer 는 사이킷런에서 제공하는 bag of words 를 만들 수 있는 방법입니다.
  • 텍스트 문서 모음을 토큰 수의 행렬로 변환합니다.
  • 단어들의 카운트(출현 빈도)로 여러 문서들을 벡터화
  • 문서목록에서 각 문서의 feature(문장의 특징) 노출수를 가중치로 설정한 BOW 벡터를 생성
  • 카운트 행렬, 단어 문서 행렬 (Term-Document Matrix, TDM))
  • max_df, min_df 인수를 사용하여 문서에서 토큰이 나타난 횟수를 기준으로 단어장을 구성할 수도 있음
  • 토큰의 빈도가 max_df로 지정한 값을 초과 하거나 min_df로 지정한 값보다 작은 경우에는 무시하며 인자 값은 정수인 경우 횟수, 부동소수점인 경우 비율을 의미
  • API documentation:https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html

사용법

  1. 문서를 토큰 리스트로 변환한다.
  2. 각 문서에서 토큰의 출현 빈도를 센다.
  3. 각 문서를 BOW 인코딩 벡터로 변환한다.
  4. 매개 변수
    • analyzer : 단어, 문자 단위의 벡터화 방법 정의
    • ngram_range : BOW 단위 수 (1, 3) 이라면 1개~3개까지 토큰을 묶어서 벡터화
    • max_df : 어휘를 작성할 때 문서 빈도가 주어진 임계값보다 높은 용어(말뭉치 관련 불용어)는 제외 (기본값=1.0)
      • max_df = 0.90 : 문서의 90% 이상에 나타나는 단어 제외
      • max_df = 10 : 10개 이상의 문서에 나타나는 단어 제외
    • min_df : 어휘를 작성할 때 문서 빈도가 주어진 임계값보다 낮은 용어는 제외합니다. 컷오프라고도 합니다.(기본값=1.0)
      • min_df = 0.01 : 문서의 1% 미만으로 나타나는 단어 제외
      • min_df = 10 : 문서에 10개 미만으로 나타나는 단어 제외
    • stop_words : 불용어 정의

N-grams

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

 

min_df vs. max_df vs. ngram_range vs. max_features

너무 희귀한 단어를 제외 vs. 너무 많이 등장하는 불용어를 제외 vs. 앞뒤 맥락을 고려 vs. dtm 가 너무 커지는 것을 방지하기 위해 최대 단어를 제한

 

불용어 stop_words

  • 문장에 자주 등장하지만 "우리, 그, 그리고, 그래서" 등 관사, 전치사, 조사, 접속사 등의 단어로 문장 내에서 큰 의미를 갖지 않는 단어

 

analyzer

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

댓글