본문 바로가기

머신러닝 & 딥러닝 공부/Tensorflow

[Tensorflow dev 자격증] Sentiment in text

반응형

안녕하세요

27년차 진로탐색꾼 조녁입니다!

 

오늘은 텐서플로우 자격증 과정 세번째 강좌인

' Natural Language Processing in TensorFlow 

1주차 강의(Sentiment in text) 및 자료를 공부했습니다.

 

드디어 코스3  NLP에 도착했습니다!! ...

설렘반 두려움반인게 코스3이랑 코스4는 제가 코드프레소 인공지능 실무과정에서 주로 다뤘던 내용이 아니라 개념자체가 낯설 수 있습니다.

 

학습 방식도 달라졌어요. 1-2주차는 과제제출이 필수였던 것에 반해 3주차에는 과제 제출이 사라졌고, 대신 강의 시간이 거의 두배가까이 늘었...습니다. 새로 등장하는 내용이 많은 만큼 더 흥미(?)로운 강의가 되길 소망합니다!!!!! 시---작!

 

NLP부터는 확실히 개념이 엄청 많아서 스압 주의!

 

코스3 인트로 : 이번에는 NLP를 배울 것이다. 기존 이미지 처리와 달리 텍스트는 이것을 알파벳별로 처리할 지, 단어로 처리할 지 등을 고려해야합니다. 신경망은 일반적으로 숫자를 다루기 때문에 텍스트를 어떻게 변환할 지 배울 것입니다. 그 다음은 어떻게 이것을 합리적으로 숫자로 변환시킬 지 배울 것이다. 그리고 여러길이의 문장들이 있는데 어떻게 패딩할 것인지? 학습한 본문에 없는 단어를 마주할 때 어떻게 어휘 토큰을 처리할 것인 지? 많은 재미가 있을 것입니다 ^^

 

첫번째 주차에는, 텍스트를 로드하는 방법과 전처리 및 데이터 설정하고 신경망에 공급하는 것까지 배울 것입니다.

 

첫번째 영상, 우리는 텍스트를 feeding할 수 있도록 모델부터 다시 살펴볼것이다. 우선 텍스트에 라벨링을 해서 학습시키고 새 텍스트를 분류하는 방법을 배운다. 이미지를 학습시킬떄는 픽셀값이 이미 숫자였기때문에 신경망에 feeding하는 과정이 쉬웠다. 하지만 텍스트는 문장과 단어를 어떻게 할 수 있을까요?! 

 

두번째 영상, 집합의 각 문자에 대해 인코딩을 취할 수 있다. 예를 들어, 아래 그림1과 같이 LISTEN, SILENT를  ASCII값을 취할 수 있다.

그러나 문제는 이들이 문자의 의미를 포함하지 못해, 전혀다른 의미를 가진 단어로도 설명할 수 있다는 것이다.

 

그림1. ASCII 값으로 나타낸 두 단어

 

이번에는 문자가 아닌 단어로 그 값을 인코딩해보자. 그러면 아래 두 문장과 같이 겹치는 부분이 있을 때 기존 지정한 1,2,3을 재사용할 수 있다.

 

그림2. 단어를 인코딩한 문장

 

감사하게도 Tensorflow 2.0 과 Keras에는 인코딩할 수 있는 API들이 있다. 다음 영상에서 확인해보자.

 

 

세번째 영상, 좌측 코드는 두 문장을 인코딩하는 코드다. 이 때, 우리는 Tokenizer를 우선 살펴볼 수 있다.

하이퍼 파라미터로 지정해준 100은 데이터가 많을 때 일반적인 100개를 보고자 하는 숫자이다. 

 

불러온 문장을 키값이 단어이고 벨류값이 숫자인 딕셔너리로 바꿔준다.

 

 

 

위에 코드에서 sentences에 새로운 문장 'You love my dog!'를 추가해줬다. 

 

이것을 인코딩한 결과는 아래와 같다.

살펴봐야할 점은 1) 맨 앞에 대문자를 소문자로 받았다는 것과, 2) dog 뒤에 있는 구두점 '!' 를 무시하고 dog으로 받아줬다는 점이다.

 

 

 

그림3. sentences 토큰화

 

 

 

네번째 읽기자료, 이 주의 첫번째 노트북이다.

gist.github.com/jonhyuk0922/bae0e6f6187a2a6629ebb3e64795c90b

 

Course 3 - Week 1 - Lesson 1.ipynb의 사본

Course 3 - Week 1 - Lesson 1.ipynb의 사본. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

다섯번째 영상, Tokenizer는 NLP에서 여러분의 친구입니다. (그러고 아까 하신 얘기 또하심.)

 

여섯번째 영상, 이번에는 토크나이저를 수열(sequence)로 나타내보려한다.

 

좌측 코드를 실행한 결과는 아래와 같다.

이 때 생각해야될 것은 우리가 모델에 feeding 하기 위해서는 이미지를 전처리해줬던 것과 같이

문자열 데이터의 길이를 맞춰줘야 한다는 것이다. 

 

현재 주어진 4개의 문장은 길이가 모두 같지는 않은 상태다. (걱정은 마라. 다음 강의에서 패딩 배울거임)

 

그림4. 토크나이저 수열로 표현

 

 

 

이제 기존 토크나이저에 새로운 test_data를 넣어보겠다.

결과는 아래와 같이 잘못표현되는 것을 볼 수 있다.

토크나이저에 없는 단어('really', 'loves')를 넣자 , 그거는 뺴고 출력했다.

 

그림5. 토크나이저에 없는 단어 입력했을 때 출력값

 

일곱번째 영상, 우리는 위 상황에서 어떤 방법이 있을까요? 첫번째로, 다양한 어휘를 얻기 위해선 광범위한 학습 데이터가 필요합니다.

두번째로, 모르는 단어를 대신하는 것이 필요합니다. 이 방법은 아래 코드에서 추가된 OOV를 통해 확인할 수 있다.

 

그림6. 토크나이저에 OOV 추가

 

위 코드를 출력하면 다음과 같은 결과를 얻는다. 토크나이저가 보지 못한 단어를 OOV로 출력하고 있다.

 

그림7. OOV 사용한 출력값

 

여덟번째 영상, 주어진 문장들의 길이를 맞추기 위해 우리는 'padding'을 사용할 것이다. 우선 pad_sequences API를 호출해준다.

그 다음 아래 padded 코드를 추가해주면 결과는 다음과 같다.

 

그림8. padding 추가

 

이렇게 가장 긴 문장의 길이로 맞춰지며 빈부분은 0이 들어갔습니다. 

 

그림9. padding 결과

 

만약, 0을 우측에 주고 싶다면 아래와 같이 padded에 padding='post' 파라미터를 추가해서 변경해줄 수 있다. 또한, 길이를 지정해주고 싶다면 maxlen=5를 추가해줄 수 있다. 다만, 더 긴 문장이 있다면 손실이 있을 수 있다.

다만, 앞에서부터 잃는게 싫다면 truncating='post'를 추가하여 뒤에서부터 짤리게 할 수 있다.

 

 

 

아홉번째 읽기자료, 6~8번강의에서 살펴본 내용에 대한 노트북이다.

gist.github.com/jonhyuk0922/e5f6bd2c15ff997cc213dafb1e2f6bef

 

Course 3 - Week 1 - Lesson 2.ipynb의 사본

Course 3 - Week 1 - Lesson 2.ipynb의 사본. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

열번째 영상, 위에 올려진 코드를 돌려보면서 6~8번째 영상 내용 리뷰함.

 

열한번째 영상, Sarcasm, really?

: 이제는 간단한 실제 사례를 다뤄보겠다. Sarcasm data set에는 3가지가 있는데 풍자 여부, 기사 제목, 기사 링크가 있다. 풍자 여부에 대한 건 html을 분석해야해서 더 자세히 들어가야하므로 우리는 기사 제목에 대해서 다룰 것이다.

아래 사진을 보면 키 값이 기사 제목이고 벨류값이 풍자여부와 기사 링크로 이루어진 딕셔너리다. 이 때, 아래 사진처럼 몇 가지 변경을 줄 것이다. 이렇게 하면 python에 더 쉽게 로드 시킬 수 있다.

 

그림10. Sarcasm data tweak

import json

 

with open("sarcasm.json", 'r') as f:

      datastore = json.load(f)

 

sentences = [ ]

labels = [ ]

urls = [ ] 

for item in datastore:

      sentences.append(item['headline'])

      labels.append(item['is_sarcastic'])

      urls.append(item['article_link'])

 

코드를 살펴보면, 우선 json을 불러와주고 datasotre로 받을 수 있습니다. 그 다음 3개의 list에 headline, is sarcastic , article_link 값을 넣어준다.

 

 

열두번째 영상,

이전에 작성한 토크나이저 코드와 유사할 것이다.

우선 토크나이저를 설정하고 fit_on_texts를 통해 재 학습시켜준다.

그리고 단어 인덱스를 다시 설정해준다. 이 때는 전보다 훨씬 많은 인덱스가 있다.

 

그림11. Sarcasm data padding

열세번째 읽기자료, 

Sarcasm data for ML 책 링크 : rishabhmisra.github.io/publications/

 

Rishabh Misra

ML Engineer

rishabhmisra.github.io

Sarcasm data in Kaggle : www.kaggle.com/rmisra/news-headlines-dataset-for-sarcasm-detection

 

News Headlines Dataset For Sarcasm Detection

High quality dataset for the task of Sarcasm Detection

www.kaggle.com

 

열네번째 읽기자료, 위에서 작성한 노트북 제공(Sarcasm Data)

gist.github.com/jonhyuk0922/068d29e077bb1f91eee422ec0ddd1585

 

Course 3 - Week 1 - Lesson 3.ipynb의 사본

Course 3 - Week 1 - Lesson 3.ipynb의 사본. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

열다섯번째 읽기자료, 위에 올린 깃허브 노트북을 살펴봄

 

1. tokenizer.fit_on_texts(sentences) : sentences에 들어있는 'headline'을 토큰화함

2. sequences = tokenizer.texts_to_sequences(sentences) : 토큰화된 숫자들 수열로 나타낸다.

3. padded = pad_sequences(sequences) : 위에 주어진 sequences 를  가장 긴문장 길이에 다 똑같이 맞춰준다.

 

퀴즈는 위에 내용에서 다 나옴.

 

열여섯번째 영상, 다음주에 임베딩 배울거임.

 

* 과제 : BBC 뉴스 아카이브 살펴보기.

mlg.ucd.ie/datasets/bbc.html

 

Insight - BBC Datasets

BBC Datasets Two news article datasets, originating from BBC News, provided for use as benchmarks for machine learning research. These datasets are made available for non-commercial and research purposes only, and all data is provided in pre-processed matr

mlg.ucd.ie

 

gist.github.com/jonhyuk0922/b057a5d8e757f00d3b22fab4658dd6a8

 

Course 3 - 1주차과제(BBC Archive)

Course 3 - 1주차과제(BBC Archive). GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

반응형