본문 바로가기
Computer Science/Machine Learning

Feature Extract : NLP [한국어 텍스트 데이터를 활용한 영화 리뷰 분류] (1)

by BaekDaBang 2024. 6. 10.

0. Overview

(1) 목적

  • 자연어 텍스트 데이터, 특히 한국어 데이터를 머신러닝에 활용할 수 있는 벡터 형태의 데이터로 가공하는 과정을 학습한다.
  • 같은 데이터를 두 가지 주어진 방법으로 가공하는 과정을 통해, 여러가지 방법론을 비교하고 선택하는 과정을 경험한다.

(2) 데이터셋

  • 본 데이터셋은 네이버 영화 서비스에 사용자들이 남긴 리뷰들로 구성되었습니다.
  • 데이터셋에는 길이 제한이 없는 리뷰글과, 해당 리뷰가 영화에 대한 긍정적 리뷰인지, 혹은 부정적 리뷰인지의 여부가 포함되어 있습니다.
  • 자연어(Natrual Language) 데이터, 그 중에서도 우리가 사용하는 한국어 데이터를 전처리하여 텍스트 데이터를 머신러닝을 적용하는 과정을 통해, 데이터 전처리와 특징 추출의 과정을 배워보시길 바랍니다.

(3) 자연어 처리 (Natural Language Processing, NLP)

  • 자연어 데이터를 머신러닝에 사용하기 위해서는 데이터를 머신러닝에 사용할 수 있도록 전처리하는 과정이 필요합니다.
  • 일반적으로 머신러닝에 사용되는 데이터가 어떤 형태이고, 자연어가 이와 어떻게 다른지 생각해봅시다.
    • 데이터의 크기: 대부분의 머신러닝 모델들은 고정된 크기의 입력 데이터를 받습니다. 그러나, 자연어는 문장에 따라 길이가 상이합니다. 때문에 자연어를 머신러닝 모델에 투입하려면 데이터를 고정된 크기로 변환해줘야 합니다.
    • 데이터의 형태: 머신러닝 모델들은 실수 데이터를 입력 받습니다. 그러나, 자연어 데이터는 문자형(char, string)으로 되어있습니다.
  • 이러한 문제들로 자연어 처리에서는 전처리 방식이 매우 중요합니다.
  • 이 과제에서, 자연어 데이터의 전처리를 경험해보고 대표적인 두 가지 방법론의 성능을 비교해봅시다.

(4) Description

[Empty Module #1] 자연어 데이터의 전처리

  • 자연어 데이터는 매우 다양한 형태로 주어지며, 이러한 미묘한 차이를 컴퓨터가 구분할 수 있게 하려면 매우 많은 데이터가 필요합니다.
  • 예를들어, ㅋ과 ㅋㅋㅋㅋ에 존재하는 미묘한 차이, 다른 특수문자들과 :)같은 이모지가 갖는 차이 등을 컴퓨터가 학습하려면 매우 많은 양의 데이터가 요구됩니다.
  • 그렇기 때문에 이런 특수문자나 초성체 등을 차라리 제거해주는 것이, 소규모 자연어 데이터 상에서는 더 좋을 수 있습니다.
  • 먼저, 정규 표현식(Regular Expression)을 이용해 한글(초성 제외), 영문자, 띄어쓰기를 제외한 문자들을 제외해봅시다.
    • 초성체(ㅋㅋ, ㅋㅋㅋ)나 특수문자(. , ? ! !! 등)와 같이 처리하기 어렵고 문장의 의미에 큰 영향을 주지 않는 데이터들을 제거합니다.
  • 영어의 경우, 같은 단어들이 대소문자에 의해 다른 단어로 인식되지 않도록 모두 대문자로 통일해줍니다.
    • (apple, APPLE, aPPle 등을 모두 APPLE로 통일합니다.)

 

[Empty Module #2] 단어 토큰화(Tokenization)

  • 자연어 데이터는 다양한 길이로 주어질 수 있습니다.
    • 짧게는 초성부터 문자, 단어, 문장, 문단, 한 편의 글이나 책까지… 다양한 크기의 글이 있습니다.
  • 이런 데이터를 머신러닝 모델이 처리할 수 있도록 어떠한 단위의 토큰(token)으로 나누는 작업을 토큰화라고 합니다.
  • 토큰화는 다양한 단위로 수행할 수 있는데, 이번 프로젝트에서는 언어의 의미가 사라지지 않으면서도 작은 단위인 단어 단위로 나누는 단어 토큰화(Word Tokenization)를 적용합니다.
  • 이때, 어근화(stemming)를 적용합니다. 어근화란 같은 뜻을 갖지만 다양한 형태로 표현되는 단어들을 한 가지 형태로 통일 시켜주는 작업입니다.
    • 예를 들어, "~입니다", "~에요", "~임" 등을 "이다"로 통일하는 작업입니다.

konlpy 라이브러리에서 제공하는 한국어 토크나이저인 okt를 활용하여 단어 토큰화를 수행합니다.

 

[Empty Module #3] 불용어 제거

  • ["은", "는", "이", "가"]와 같은 단어들은 그 자체로는 큰 의미를 가지지 않는 불용어(stopword)입니다.
  • 이러한 데이터들 역시 기계학습 모델이 쉽게 이해하게 하기 매우 어려우며, 본 task에서 문장의 내용을 판별하는데 크게 도움이 되지도 않습니다.
  • 그렇기 때문에 이번에는 이러한 불용어들을 데이터에서 제거하고 진행합니다.

 

[Empty Module #4] 단어 임베딩(Word Embedding)

  • 토큰화된 단어를 컴퓨터가 이해할 수 있는 실수 벡터 형태로 변환하는 과정을 워드 임베딩(Word Embedding)이라고 합니다. 일반적으로 단어를 고차원 벡터 공간에서 고밀도 벡터로 표현합니다.
  • 이러한 임베딩에도 매우 다양한 방법이 존재하며, 각각의 장점과 단점이 존재합니다.
    • 원-핫 인코딩(one-hot encoding)은 표현하고자 하는 단어의 인덱스 값만 1이고, 나머지 인덱스는 전부 0인 벡터 표현 방법입니다. 간단하지만 단어 의미 관계를 잘 포착할 수 없고 과도한 벡터 차원을 가질 수 있습니다.
    • Bag-of-Words(BoW)는 카운트 기반 단어 표현(Count based word representation)법 중 하나로, 단어들의 순서는 고려하지 않고 각 단어의 출현 빈도만을 고려하여 문서 또는 문장을 벡터로 수치화하는 표현 방법입니다. 따라서 어순과 문맥은 무시되고 단어의 발생 여부가 중요해 단어 간 의미 관계를 포착하기는 힘듭니다.
    • TF-IDF(단어 빈도-역 문서 빈도, Term Frequency-Inverse Document Frequency)는 문서에 자주 등장하지만 말뭉치에서 상대적으로 드문 단어에 높은 가중치를 할당하여 특정 문서에서 단어의 의미를 고려할 수 있는 표현법으로, BoW와 마찬가지로 카운트 기반 단어 표현법입니다. '용어 빈도(TF)'는 단어가 문서에서 얼마나 자주 나타나는지를, '역문서 빈도(IDF)' 단어가 전체 말뭉치에서 얼마나 드물거나 고유한지를 나타낼 수 있습니다.
    • 워드투벡터(Word2Vec)는 CBOW(Continuous Bag of Words)및 Skip-gram과 같은 신경망을 사용하여 단어 표현을 학습하는 방법으로, 단어 간 의미 관계를 포착하여 유사 의미를 가진 단어가 비슷한 벡터 표현을 가지도록 합니다.
    • 글로브(Glove. 단어 표현을 위한 글로벌 벡터)는 전체 말뭉치에서 글로벌 단어 동시 발생 동계 및 행렬 분해를 결합하여 단어 표현을 학습하는 방법으로 단어 간 의미론적 관계과 구문론적 관계를 포착할 수 있습니다.
  • 이번 프로젝트에서는 가장 단순한 방법이라 할 수 있는 희소 표현법으로 단어를 임베딩 해보겠습니다.

희소 표현법(Sparse Representation)

  • 희소 표현법은 각 단어에 하나의 값들을 부여합니다.
  • 예를들어, "사과"에 1, "맛있다."에 2… 와 같은 방식입니다. (데이터 전처리에서 배운 라벨 인코딩과 유사합니다)
  • 이 방법을 사용하면 데이터에 등장하는 단어의 수가 m개라 할 때, (0~m) 사이의 값으로 각 단어들이 임베딩됩니다.
  • 이를 원-핫 인코딩 방식으로 표현하면 [0, 0, 1, 0 ..... 0]과 같이 대부분의 값이 0이고 하나의 값만 1인, 희소 벡터로 변환되기 때문에 이러한 방식을 희소 표현법이라 합니다.

(참고) 한국어 자연어 처리의 어려움

  • 한국어는 영어나 라틴어 계열의 다른 언어에 비해 토큰화를 수행하기 어려운 언어에 속합니다.
  • 영어에서는 "San Francisco", "We're"와 같이 일부 예외를 제외하고는 띄어쓰기를 활용하면 쉽게 단어 토큰화를 수행할 수 있습니다.
  • 한편, 한국어는 조사, 어미와 같이 다른 단어와 결합되는 단어들을 통해 말이 구성되는 교착어에 속합니다.
  • 예를 들어, 영어에서는 "I"로 표현되는 말이 한국어에서는 "나는", "내가" 등으로 다양하게 나타날 수 있기 때문에, 띄어쓰기를 통한 분리가 어렵습니다.

 

[Empty Module #5] Bag of Words 방법을 통한 문장 벡터화

  • 위에서 한 개의 단어를 한 개의 값으로 변환하였습니다.
  • 그러나 여전히 우리가 분류해야 할 문장들은 다양한 길이를 가지고 있기 때문에, 고정된 크기의 입력 값을 요구하는 머신러닝 모델을 적용하기 어렵습니다.
  • Bag of Words(BoW) 방법을 사용하여 모든 문장을 동일한 길이의 벡터로 만들어 줄 수 있습니다.
  • 이렇게 변환된 벡터의 형태를 Bag of Words(BoW)라고 합니다.

Bag of Words 방법

  • BoW는 그 이름처럼, 어떤 단어들이 담긴 가방(집합)의 형태로 문장을 표현한다고 이해할 수 있습니다.
  • 마치 가방 속에 든 물건의 개수를 세는 것처럼, 어떠한 문장을 고정된 $m$개의 단어들의 등장 횟수로 나타내는 방법입니다.
  • 예를들어, "사과 주스는 사과 맛이 나는 주스입니다."와 같은 문장은 {"사과": 2, "주스": 2, "는":2, "맛": 1, "이":1, "나":1", "입니다.":1, "당근":0, "인공지능": 0 ....}과 같이 나타낼 수 있습니다.

임베딩된 자연어 데이터를 BoW 형태로 변환하는 코드를 직접 작성하여, 데이터를 변환해봅시다.

[Empty Module #6] 차원 축소

  • 우리가 만든 BoW는 불용어를 제외하고 데이터셋에 등장하는 모든 단어를 포함하여 만들었기 때문에, 매우 많은 차원을 가지고 있습니다.
  • 그러나 실제로 이 중에는 전체 데이터에서 한두 번만 등장하는 단어들이 꽤 많이 포함되어 있습니다.

전체 데이터에서 50번 미만으로 등장하는 단어들을 BoW에서 제거하는 코드를 작성해봅시다.

 

[Empty Module #7] 분류 수행 및 제출: BoW

  • 지금까지 배운 머신러닝 라이브러리를 이용해 분류를 수행하고, 제출해봅시다!
  • 베이스라인은 로지스틱 회귀 모델을 사용하였고, 별다른 하이퍼 파라미터 튜닝은 진행하지 않았습니다.
  • 성능 향상과 독학을 위해 다양한 머신러닝 모델 및 하이퍼 파라미터 튜닝을 적용하기 앞서, 반드시 주어진 조건에 따라 베이스라인을 달성해 보기를 바랍니다(제출 코드에는 분류기를 변경하지 말아주세요).

 

[Empty Module #8] TF-IDF 방법

아래 TF-IDF 방법에 대한 설명을 읽고, 직접 구현해봅시다.

  • TF-IDF(Term Frequency - Inverse Document Frequency) 방법은 BoW 방법에서 조금 더 나아가, 각 단어들의 중요도를 고려합니다.
  • BoW 방법에서는 리뷰에 여러 차례 등장한 단어가 큰 값을 갖습니다.
  • 그런데 리뷰에 여러 차례 등장하였다고 해서, 꼭 리뷰가 긍정적인 리뷰인지 판단하는데 도움이 될까요?
  1. 이 영화는 좋은 영화입니다. 가히 제가 본 영화 중에 최고의 영화라 할 수 있겠습니다.
  2. 이 영화는 나쁜 영화입니다. 가히 제가 본 영화 중에 최악의 영화라 할 수 있습니다.
  • 위에 두 개의 비슷한 리뷰가 있습니다. 영화라는 단어는 많이 등장하기는 하였지만, 리뷰가 긍정적인지 판단하는 데는 전혀 도움이 되지 않습니다.
  • 오히려 중요한 것은, 리뷰에서 각각 한번만 등장한 좋은, 나쁜, 최고, 최악과 같은 단어들 입니다.
  • TF-IDF는 텍스트에서 자주 등장하는 단어들보다 오히려 가끔 등장하는 단어들의 중요도가 더 높을 것이란 가정에서 출발합니다.

TF-IDF 구현

  1. 먼저, 각 단어 t가 전체 데이터 N개 중 몇 개의 샘플(문서)에서 등장하는지를 의미하는 document frequency를 구합니다.
  2. 아래 식을 참고하여 앞서 구한 document frequency에 반비례하는 inverse document frequency를 구합니다.
  3. BoW Feature에 IDF를 곱하여 중요도를 반영해줍니다.

 

IDF(𝑡)=log(𝑁1+df(𝑡))IDF(𝑡)=log⁡(𝑁1+df(𝑡))
 

[Empty Module #9] 분류 수행 및 제출: TF-IDF

  • BoW와 같이 TF-IDF도 예측을 수행하여 제출해봅시다.
  • 이때, TF-IDF의 적용 여부를 제외하고 전처리 과정, 모델 구조 등에는 변화를 주지 않아야 정확한 비교가 가능합니다.
  • 이렇게 다른 조건들은 동일한 상태로, 어떤 변화가 성능에 미치는 영향을 알아보기 위한 실험을 ablation study라고 합니다.