[DL] NLP를 위한 준비

박경국·2022년 3월 12일
0

Deep Learning

목록 보기
6/15
post-thumbnail
post-custom-banner

오늘은 자연어를 컴퓨터로 처리하는 NLP에 대해 정리해보려 합니다. 컴퓨터가 자연어를 처리하기 위해서 필요한 준비 작업과 자연어를 이해하기 위한 모델 등에 대해 간단히 정리해보곘습니다.

1. 벡터화

컴퓨터는 자연어를 이해할 수 없습니다. 컴퓨터가 이해할 수 있도록 숫자로 표현해야하는데요. NLP는 자연어를 벡터로 변환하여 컴퓨터가 이해할 수 있도록 합니다. 자연어를 벡터로 표현했을 때 장점은 여러가지가 있습니다. 단어를 공간 위에 표현한다면 서로 다른 단어 간에 유사도를 판별할 수도 있습니다. 단어를 벡터화하는 방법은 등장 횟수 기반의 단어 표현과 분포 기반의 단어 표현 두 가지로 나눌 수 있습니다.

1) 등장 횟수 기반의 단어 표현

먼저, 등장 횟수를 기반으로 단어를 변환하는 방법입니다. 단어들으 ㅣ순서는 고려하지 않고, 단어들의 출현 빈도에 집중하여 텍스트 데이터를 수치화합니다. 대표적으로 Bag-of-Words와 TF-IDF가 있습니다.

  • Bag of Words(BoW)

    • 단어들의 순서는 고려하지 않고, 단어들의 출현 빈도에 집중하는 텍스트 데이터 수치화 표현 방법입니다.
    • 각 단어에 고유한 정수 인덱스를 부여하고, 각 인덱스의 위치에 단어 토큰의 등장 횟수를 기록한 숫자를 부여합니다. 만약 apple이라는 단어가 문서에서 총 2번 등장한다면 apple은 '2'라는 숫자로 변환됩니다.
    • 'This apple apple is mine.' 이라는 문서를 토큰화하면 각각 {This:0, apple:1, is:2, mine:3}이 되고, BoW로는 (1, 2, 1, 1)로 표현할 수 있습니다.
  • DTM

    • 서로 다른 문서들의 BoW를 결합한 행렬을 문서 단어 행렬이라고 부릅니다.
    • 다수의 문서에서 등장하는 각 단어들의 빈도를 행렬로 표현한 것입니다.
    • 간편한 방법이지만 희소표현의 문제가 발생합니다. 모든 문서에서 등장하는 단어란 없기 때문에 필연적으로 많은 단어가 '0'으로 표현됩니다. 모델의 정확도를 떨어뜨리는 요인이 됩니다.
    • 또한 모든 문서에 등장하는 단어의 수만큼 feature가 생성되기 때문에 차원의 저주에 빠질 가능성도 높습니다.
  • TF-IDF(TfidfVectorizer)

    • TF : 특정 문서에서 특정 단어가 등장한 횟수입니다.
    • DF : 특정 단어가 등장한 문서의 수입니다. 문서들에서 특정 단어가 몇 번 등장했는지는 관심 가지지 않습니다. 오직 특정 단어가 등장한 문서의 수에만 관심을 갖습니다.
    • IDF : DF에 반비례하는 수입니다.
    • TF-IDF : TF와 IDF를 곱한 값입니다. TF에 IDF를 곱합으로써 모든 문서에서 자주 등장하는 단어는 중요도가 낮다고 판단하며, 특정 문서에서만 자주 등장하는 단어가 중요도가 높다고 판단합니다.

2) 분포 기반의 단어 표현

단어 주변에 있는 단어를 기반으로 벡터화하는 방법입니다. Word2Vec, fastText 등의 방법이 있습니다. 분포 기반의 단어 표현에 대해서는 추후 Word2Vec과 임베딩에 대해 정리할 때 더 자세히 정리하도록 하겠습니다.

2. 텍스트 전처리

앞서 '단어 토큰'이라는 단어를 사용했습니다. 문장에서 단어를 의미 단위로 쪼개어 인덱스를 부여하는 것을 토큰화라고 합니다. 단어 토큰은 토큰화를 거친 단어입니다. 단어를 토큰화하기 전에 전처리를 하는 것이 매우 중요합니다. 의미 파악이나 분석에 큰 동무이 되지 않는 단어를 제외해야 '차원의 저주'나 '희소 문제'를 겪지 않을 수 있습니다. NLP에서 전처리란 어떤 것을 의미하는지 정리하겠습니다.

1) 불용어(Stop words)

  • 의미 파악이나 분석에 큰 도움이 되지 않는 단어를 의미합니다.
  • 영어에서 the, a와 같은 관사가 주로 불용어로 취급됩니다.
  • 유의미한 단어를 토큰화하여 문서의 성격을 제대로 파악하고, DTM의 차원을 줄이기 위해 불용어 처리를 해야합니다.

2) 어간 추출(Stemming)

  • 같은 의미이지만 단어의 활용 과정에서 형태가 달라진 두 단어를 같은 형태로 만드는 방법입니다.
  • 예를 들어, Wolf와 Wolves라는 단어가 있다면 Wol로 어간을 추출합니다.
  • 단어 뭉치의 복잡성을 줄이고, 희소 문제를 해결하는 방법입니다.
  • 단어의 변화 규칙만 보고 변화하는 어미를 자르는 방법인데, 사전에 없는 단어로 토큰화될 수 있지만 처리 속도가 매우 빠릅니다.

3) 표제어 추출(Lemmatization)

  • 어간 추출과 비슷하지만, 기본 사전형 단어의 형태로 단어 토큰을 정규화하는 방법입니다.
  • 한국어 토큰화에서는 의미를 가진 가장 작은 단위인 형태소 추출을 사용합니다.

4) 기타

  • 이밖에도 영어의 대소문자를 소문자로 통일하는 전처리도 필요합니다.
  • 정규 표현식을 이용한 특수 문자 제거도 해야합니다.

다음 포스팅에서 또다른 전처리 방법인 임베딩과 Word2Vec 등의 분포 기반의 벡터화 방법에 대해 정리하겠습니다.

post-custom-banner

0개의 댓글