멋사 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 실습 정리
- MNIST, FMNIST, CIFAR10, 말라리아 혈액도말 이미지, 날씨이미지 데이터를 통해 이미지 분류 실습을 알아봄
- CNN Explainer를 통해 Conv, Pooling과정을 이미지로 이해해봄
- 왜 완전밀집연결층을 첫 레이어부터 사용하지 않고 합성곱 연산을 했을 까?
- 완전밀집연결층은 flatten해서 이미지를 입력해주는데 그러면 주변 이미지를 학습하지 못하는 문제가 생김
- 합성곱, 풀링 연산으로 특징을 학습하고, 출력층에서 flatten해서 완전연결밀집층에 주입해 주고 결과를 출력한다.
- 기존에 사용했던 DNN에서 배웠던 개념을 확장해서 합성곱 이후 완전연결밀집층을 구성하는 형태로 진행하였다.
- 이미지 전처리 도구는 matplotlib.pyplot의 imread를 통해 array로 읽어올 수 있고, PIL, OpenCV를 사용할 수 있다.
- 이미지 증강 기법 등을 통해 이미지를 변환해서 사용할 수 있다.
텍스트 분석과 자연어 처리(개념)
- 데이터를 어떻게 넣어주느냐가 성능에 많은 영향을 미친다!
- 머신러닝에서 텍스트로 된 카테고리 범주 값을 어떻게 처리했을까?: 인코딩을 해주었다!
자연어처리(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 가중치를 적용한 단어 벡터를 만들 수 있는 방법
- 전체 문서에서는 자주 등장하지 않지만 특정 문서에서 자주 등장한다면 가중치 값이 높게 나오게 된다.
- 모든 문서에서 자주 등장하는 값은 가중치가 낮게 나오게 된다.