221212 멋쟁이 사자처럼 AI스쿨 7기, 박조은 강사님 강의
이번주 진행 주제 : 텍스트 분석과 자연어처리를 할 예정.
❓ 이미지 데이터를 읽어오면 다차원 형태의 구조로 되어있는데 np.array 형태로 되어있음에도 왜 다시 np.array 로 만들어주었을까?
◼ 리스트 안에는 np.array 로 되어 있더라도 여러 장의 이미지를 하나로 만들 때 파이썬 리스트에 작성해 주었다. 이미지 여러 장을 하나의 변수에 넣어주었을 때, 해당 변수의 데이터 타입은 파이썬 리스트 구조이다. train_test_split 에 사용하기 위해 넘파이 형태로 변경해주었다.
❓ 정답 인코딩이 제대로 되었는지 확인하고 클래스가 train, valid 균일하게 나뉘었는지 확인했다. 정답값을 균일하게 나누기 위해 사용하는 train_test_split 의 옵션은?
◼ stratify=y
validation_split 을 사용하지 않고 위에서 따로 validation_data를 나눠서 사용한 이유는
class 를 stratify 로 층화표집을 해주지 않으면 균일하게 학습이 되지 않는다.
멀티클래스일 때 데이터를 따로 균일하게 나눠서 학습시키지 않으면 성능이 낮게 나올 때가 많다.
🦁 accuracy와 val_accuracy 혹은 loss와 val_loss가 대략 어느정도 차이나면 오버피팅이라 그러나요?
◼ 시각화를 하면 직관적으로 볼 수 있다. 더이상 val_loss 값이 감소하지 않는데, loss 값은 줄어든다면 오버피팅 되었다고 판단하는게 나아보인다.
◼ val_loss 값이 나아지지 않는데 loss 값이 나아진다면 오버피팅이라고 볼 수 있다.
❓ softmax 로 출력했기 때문에 합이 1이 되는 값으로 출력이 된다. 0번째 테스트 이미지에 대한 분류 확률이다. 여기에서 클래스를 어떻게 찾을까?
◼ np.argmax
❓ np.argmax 는 어떤 기능을 할까요?
◼ 가장 큰 값을 가지는 index를 반환
🦁 맨 마지막 에포크 결과가 아닌, 성능이 가장 좋았을때의 모델을 사용하는 방법은 없을까요?
◼ 초기화 해서 다시 학습해서 성능이 잘 나오는 곳까지 early stop 이나 epoch값을 조정
❓ 머신러닝에서 텍스트로 된 카테고리 범주 값을 어떻게 처리 했을까?
◼ 인코딩
❓ 텍스트는 영어로 학습한 내용을 한국어로 예측하면 성능이 어떻게 될까?
텍스트 데이터 전처리 -> 데이터 나누기 -> 벡터화(BOW, TF-IDF)
문자, 숫자를 제외한 특수문자를 제외할 때 주로 사용한다. 특정 패턴으로 텍스트 전처리 시에도 사용한다. 정규표현식은 그 자체로 프로그래밍 언어이다. 정규 표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있다.
https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D
❓ 정규표현식 [0-9]
◼ 모든 숫자
❓ 정규표현식 [^0-9]
◼ 숫자가 아닌 문자
◼ carrot ^ 이 문자열(대괄호) 밖에 있으면 처음을 의미
1101 번의 실습 목표 : BagOfWords,TF-IDF => 단어를 숫자로 인코딩 하는 방법에 대해 알아본다.
토큰화 => 특정 문자(예. 띄어쓰기, 공백)으로 텍스트 데이터를 나눠주는 것. NLTK, Spacy 도 대표적인 텍스트 전처리 도구이며, 토큰화, steming, lematization 등의 기능을 제공한다.
steming, lemitation => 한국어 형태소 분석기에서 제공하는 것도 있고, 안하는 형태소 분석기도 있다. 실습 때 예제에서 함께 다루어 볼 것. 원형을 어떻게 추출할지에 대한 방법을 다루는 것이다.
❓ 하지만 실습에서 잘 사용하지 않을것. 이유는?
◼ 한글을 지원하지 않아서.
❓ 했다. 했어요. 했습니다. 했나요? 하다 => 하다로 통일해서 변형해 주면 어떤 효과가 있을까?
◼ 머신러닝에서 데이터를 binning 해주는 것과 비슷한 효과를 낼 것이다.
◼ 비슷한 의미의 단어를 하나로 전처리해서 나중에 벡터화(인코딩을) 했을 때 데이터 용량을 줄이고 모델에 힌트도 줄 수 있다.
◼ 실습에서는 KoNLPy를 사용할 예정이다. 지원하는 형태소 분석기도 있고, 그렇지 않은 형태소 분석기도 있다.
◼ KoNLPy는 박사학위 논문으로 만들었던 도구이다. 자바, C, C++ 등으로 만들어진 형태소 분석기를 파이썬으로 사용할 수 있게 연결해주는 도구이다.
◼ 파이썬은 접착제 언어이기 때문에 다른 언어로 만들어진 형태소 분석기를 파이썬으로 래핑해서 사용할 수 있게 해주는 도구이다.
n-gram단어를 몇 개로 묶어서 사용할 것인지
stop_words : 불용어. ex) 나, 너
cvect.fit_transform : document-term matrix 를 반환
get_feature_names_out 으로 단어 사전을 볼 수 있다.
cvect.vocabulary_ : {"단어": 인덱스번호}
❓ N-grams 은 왜 사용할까?
◼ it's bad, not good at all.
it's good, not bad at all.
BOW의 앞 뒤 맥락을 고려하지 않는다는 단점을 해결하기 위해
◼ 묶어서 사용하게 되면 앞뒤 맥락을 고려할 수 있다.
❓ 너무 희귀한 단어를 제외하는 효과가 있는 것은 무엇을까?
◼ min_df
❓ 너무 많이 등장하는 불용어를 제외하는 효과가 있는 것은 무엇일까?
◼ max_df
❓ BOW를 사용하다보면 앞뒤 맥락을 고려하지 않는 단점이 있다. 이것을 해결하기 위한 것은 무엇일까?
◼ ngram_range
❓ 단어를 너무 많이 사용해서 dtm 가 너무 커지는 것을 방지하기 위해 최대 단어를 제한하는 것은 무엇일까?
◼ max_features
❓ 영어나 다른 외국어는 불용어 사전을 NLTK, Spacy 등에서 제공한다. 하지만 한국어는 불용어 사전이 따로 없다. 왜 그럴까?
◼ 정답이 따로 있지는 않다. 한국어는 맥락에 따라 복잡하고 다양한 의미를 갖고, 또 도메인마다 불용어가 다 다르다. 예를 들어 코로나 치료제 관련 논문을 연구한다면 코로나 라는 단어는 불용어가 된다. 예를 들어 파이썬 문서를 본다라고 했을 때 파이썬 문서에서도 파이썬이라는 단어는 불용어가 된다.
◼ 아직 연구가 많이 진행되지 않아서 일수도 있다.
analyzer='char_wb', 'char' . n_gram 과 묶어서 많이 사용한다.
'char_wb':단어 안에서만 n_gram을 사용
'char':단어 밖에서도 n_gram을 사용
전체 문서에서는 자주 등장하지 않지만 특정 문서에서 자주 등장한다면 가중치 값이 높게 나온다. 모든 문서에 자주 등장하는 값은 가중치가 낮게 나온다.