아래는 앞서 챕터 1에서 예시로 든 두 가지 문장을 tokenizer를 사용하여 encoading 하는 예제 코드 이다.
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으로 할당하게 된다. 이렇게 함으로써 전체 문장의 길이 자체를 똑같이 유지시키는 것이다.
이미지 출처
https://www.coursera.org/learn/natural-language-processing-tensorflow/lecture/2Cyzs