• [6. 텍스트와 시퀀스를 위한 딥러닝] 6.1 텍스트 데이터 다루기

    2021. 1. 26.

    by. 민영답게

    텍스트 데이터 다루기

     

     

     

    배경 지식

     

     

     

    1. 텍스트 벡터화의 방식

     

     

      -  텍스트를 단어로 나누고 각 단어를 하나의 벡터로 변환

     

      -  텍스트를 문자로 나누고 각 문자를 하나의 벡터로 변환

     

      -  텍스트에서 단어나 문자의 n-그램을 추출하여 각 n-그램을 하나의 벡터로 변환

     

     

      *  텍스트 벡터화란?

     

         텍스트를 수치형 텐서로 변환하는 과정, 딥러닝 모델은 수치형 텐서만 다룰 수 있기때문에 반드시 이 과정이 필요함

         모든 텍스트 벡터화 과정은 토큰화 적용 후 생성된 토큰에 수치형 벡터를 연결하는것으로 이루어짐

     

     

      *  n-그램이란?

     

        문장에서 추출한 N개의 연속된 단어 그룹

          n=2라면, "The cat"은 {"The", "cat", "The cat"} 으로 분해됨

     

     

     

     

    2. 토큰과 벡터를 연결하는 방법

     

     

    -  원-핫 인코딩

     

    -  단어 임베딩 ( = 토큰 임베딩 )

     

     

      *  토큰  :  텍스트를 나누는 단위

     

      *  토큰화  : 텍스트를 토큰으로 나누는 작업

     

     

     

    이번 글에서는 이 토큰과 벡터를 연결하는 2가지 방법 (원핫인코딩, 단어임베딩)을 위주로 작성하려한다.

     

     

     

     

    원-핫 인코딩

     

     

     

    1. One-Hot-Encoding 이란?

     

     

    -  토큰을 벡터로 변환하는 가장 일반적이고 기본적인 방법

     

    모든 단어에 고유한 정수 index를 부여한 후, 이 index를 이진 벡터로 변환

       ( 이때, 해당 벡터의 index만 1이고 나머지는 모두 0 )

     

     

     

     

    2. 케라스에서 사용하는 방법

     

     

    직접 코드로 원-핫 인코딩을 구현할수는 있지만,

     

    케라스에서는 텍스트 데이터를 단어 or 문자수준의 원핫인코딩으로 변환해주는 유틸리티가 있음

     

     

     

     

     

    3. 원-핫 해싱 ( = 원-핫 인코딩의 변종 )

     

     

    -  어휘사전에 있는 토큰의 수가 너무 클때 사용

     

    단어를 해싱하여 고정된 크기의 벡터로 변환

     

    -  장점 : 단어인덱스가 필요없으므로 메모리 절약, 전체 데이터 확인하지않고도 토큰 생성 가능

     

    -  단점 : 해시 충돌 

     

     

       * 해시 충돌이란?

     

        2개의 단어가 같은 해시를 만들었을때 머신러닝이 이 단어 차이를 인식하지 못하는것

        해싱 공간의 차원이 토큰개수보다 훨씬 크면 충돌 가능성은 감소됨

     

     

     

     

     

    단어 임베딩

     

     

     

    1. 원-핫 인코딩과의 차이점

     

     

    -  희소하고 고차원인 원-핫 인코딩과 달리, 저차원의 실수형 벡터 (밀집 벡터)

     

    -  수동적으로 인코딩하는 원핫인코딩과는 달리 데이터로부터 학습

     

    -  원핫인코딩보다 더 많은 정보를 더 적은 차원에 저장

     

     

     

     

    2. 단어 임베딩을 만드는 방법

     

     

    -  풀려고 하는 문제와 함께 단어 임베딩을 학습하는 방법

       

       :  랜덤한 단어 벡터로 시작하여 가중치를 학습하는 것과 같은 방식으로 단어 벡터를 학습함

     

    -  사전 훈련된 단어 임베딩을 사용하는 방법

     

     

     

    처음부터 단어 임베딩을 학습하는 방법과 사전 훈련된 단어 임베딩을 사용하는 방법 이 2가지를 모두 다뤄볼것이다.

     

     

     

     

     

    3.  Embedding 층을 사용하여 단어 임베딩 학습하기

     

     

     

    -  단어 임베딩이란?

     

         단어 사이에 있는 의미 관계를 반영하여 기하학적 공간에 매핑하는 것

     

         ex)  동의어의 경우, 비슷한 단어 벡터로 임베딩됨

     

      

        거리와 특정 방향은 단어 사이의 의미와 관계되어 있음

     

        ex) dog와 cat VS wolf와 tiger  :  두 집단간의 거리는 애완동물에서 야생동물로 이동하는것을 의미

     

     

    -  케라스에서 사용하는 방법 ( = Embedding 층 사용하기 )

     

     

      

     ☞  Embedding 층 추가하기

     

      케라스에서는, Embedding 층을 추가하여 단어 임베딩을 구현할 수 있음

       Embedding 층은 정수 index를 밀집 벡터로 매핑하는 딕셔너리라고 이해하면 좋음

     

     

      ☞  입력

     

        ( samples, sequence_length ) 인 2D 정수 텐서

        배치의 시퀀스는 모두 길이가 같아야하므로 길면 잘리고 작으면 0으로 패딩됨

     

     

      ☞  출력

     

        ( samples, sequence_length, embedding_dimensionality ) 인 3D 실수형 텐서

     

     

      ☞  가중치

     

        처음에는 랜덤하게 초기화되고, 훈련하면서 역전파를 통해 점차 조정됨

     

     

      ☞  실습 코드 설명 ( Embedding 층 사용 방법 )

     

        이 코드에는 안나와있지만, 데이터 전처리단계에서 정수리스트로 데이터를 로드한 후, 리스트를 2D 정수텐서로 변환함

     

        그 후, Embedding층을 통해 3D 실수형 텐서로 변환시킴.

     

        이 때, Flatten() 에서 사용하기 위해 input_length의 값도 넣어주어야함

     

      

        * 이 방법은 단어 사이의 관계나 문장 구조를 고려하지 않는 방법이므로, 

           전체를 고려하기 위해서는 Embedding 층 위에 순환 층이나 1D 합성곱 층을 추가하는 것이 좋음

     

     

     

     

     

     

    4.  사전 훈련된 단어 임베딩 사용하기

     

     

    -  훈련데이터가 부족할 때 미리 계산된 임베딩 공간에서 임베딩 벡터를 로드하는 방법

     

    -  케라스는 Embedding 층을 위해 내려받을 수 있는 사전 훈련된 단어 임베딩 DB가 있음

       ( = Word2vec, GloVe, ... )

     

     

     

     

     

     

     

     

    <케라스 창시자에게 배우는 딥러닝>(길벗, 2018)을 학습하고 개인 학습용으로 정리한 내용입니다.

      

    댓글