brunch

You can make anything
by writing

C.S.Lewis

by TUGU Sep 22. 2019

NLP in TensorFlow_챕터 2

Tensorflow에는 word based encoading을 쉽게 구현하기 위한 API가 제공되는 데, 바로 'Tokenizer'이다.


아래는 앞서 챕터 1에서 예시로 든 두 가지 문장을 tokenizer를 사용하여 encoading 하는 예제 코드 이다.


Tokenizer를 활용해보자!


1) 맨 위에 필요한 framework 들을 import한 후에, sentences = [ ] 에 encoading 할 문장 2개를 적어준다.


2) tokenizer 인스턴스를 생성하고, 앞서 import한 Tokenizer 함수를 지정한다. 아래 예제에서는 단어 100개를사용하는데, 물론 이는 굉장히 작은 수이고 실제로 광범위한 자연어 처리에 사용하려면 num_words 는 어마무시하게 커질 것이다


3)그리고 뒤에 fit_on_texts 메써드를 활용하여 앞서 정의한 두 가지 문장을 벡터화 시킨다


4) 마지막으로 word_index 인스턴스 생성 및 word_index 메써드를 활용하여 encoading을 한다.


                                                

5) 그리고 결과값을 출력하면? 

요렇게 나온다. 각 단어마다 고유 값이 부여되었다. 즉 encoading이 되었다.

단 여기서는 단어마다 값만 부여되었을 뿐, 단어의 순서에 대한 정의는 이루어지지 않았음을 이해하자. 다시 말해 단어의 순서에 대한 정의가 없다면, 컴퓨터는 문장의 의미를 이해할 수 없다. 그래서 한 줄의 코드가 더 필요하다.

                                    

6) 이를 위해 아래와 같이 sequence 인스턴스 생성및 tokenizer에 내장된 texts_to_sequences 메써드를 활용하여 , 각각의 문장에 word based encoading 뿐만 아니라 sequence (순서) 까지 부여하여, 사람이 이해하듯이 컴퓨터에게도 문장의 의미를 이해시킬 수 있는 방식으로 최종 encoading이 된 것이다.                 


                      

7) 결과를 출력하면?

아래와 같이 단어에 할당된 고유 번호 뿐만 아니라, 그 번호의 순서까지가 데이터와 되는 것 이다.                 


만약 듣도 보도 못한 단어가 나온다면?

                                        

8) 자 여기까지 왔으면 컴퓨터에게 문장까지 이해시킨 것이다. 그런데 아직 또 하나의 문제가 있다. 앞서 정의한 num_words = 100, 즉 100가지의 단어를 벗어난 새로운 단어가 나온다면?


아래와 같이 my dog loves my manatee를 encoading 하면 그 결과가 [1,3,1] my dog my 로 나오게 된다. 즉 loves와 manatee와 같이 100개의 단어사전에 없는 녀석들이 등장하게 되면 이들을 skip한 결과나 나와서 전혀 의미가 없는 문장이 되고 만 것이다.       

                                                  

9) oov_token 파라미터를 사용하자. out of vocab.)


적어도 모든 단어를 커버하지는 못하더라도, 문장을 이루는 단어의 수라도 커버했으면 좋겠다. 이럴 때 아래와 같은 oov_token 파라미터를 사용하여, 사전에 없는 단어가 나올때 OOV로 출력하게 하는 방법이 있다


                                   

10) 위 코드를 실행하고 결과를 출력하면 아래와 같이 나온다. 즉 모르는 단어느 OOV = 1로 값이 대체되어, 적어도 문장을 이루는 단어의 개수는 유지할 수 가 있게 되었다. 물론 num_words의 수치를 10000000개로 한다면 이러한 경우는 OOV의 필요성이 감소할 수도 있겠으나, 매일매일 신조어, 비속어, 사투리, 등등이 생겨나는 판에 이 모든 단어를 커버할 수 는 없는 노릇이다.



문장의 길이는 제각각이다. 이건 어떻게 할 것인가?

             

11) 그렇다. 아직도 한 가지 더 해결할 문제가 남아있다. 바로 문장의 길이가 제 각각이라는 점이다.그래서 padding이 필요하다. (마치 CNN에서 인풋 사이즈를 zero padding을 통해 동일하게 유지하는 것처럼)           

                                     

12) 그래서 padding 된 결과를 출력하면? 아래처럼 전체 문장의 길이는 가장 긴 문장 기준으로 유지가 되고, 상대적으로 짧은 문장의 경우 빈 단어를 0으로 할당하게 된다. 이렇게 함으로써 전체 문장의 길이 자체를 똑같이 유지시키는 것이다.                


                                                 

축하한다. 여기까지 이해했으면 NLP에 필요한 기본은 이해한 것이다!!




이미지 출처

https://www.coursera.org/learn/natural-language-processing-tensorflow/lecture/2Cyzs












브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari