NLP Lecture Note: 1. Logistic Regression and Sentiment Analysis

김현준·2022년 10월 22일
0

Acknowledgement: 이 콘텐츠는 Deeplearning.AI의 자연어처리 강좌를 참조하여 만들었습니다. 좋은 강의를 만들어주신 Deeplearning.AI에게 감사의 말을 전해드립니다.

Motivation

특정 텍스트들와 각 텍스트에 대한 감성 레이블 (1: 긍정, 0: 부정) 데이터가 있다고 가정하자.
이 텍스트들의 감성을 자동으로 분류하는 알고리즘을 만들 수 있을까?

Data Preprocessing

  • 텍스트 토큰화
  • 불필요한 단어 및 기호, 소셜 미디어에서의 handle, URL 등 제외
  • 형태소 분석

먼저 텍스트를 얻고 나면 몇 가지 전처리 과정을 거칠 필요가 있다.
일단 가장 기본적인 과정은 긴 텍스트를 '토큰'이라는 것으로 나누는 과정이다. 비록 토큰이 정확히 무엇인지는 정의되어 있지는 않지만, 보통은 한 글자, 단어 등 우리가 흔히 의미를 가지고 있다고 생각하는 단위를 말한다. 여기서는 단어를 토큰으로 사용할 예정이다.
먼저, 각종 특수 기호 중 감성 분석에 불필요한 기호를 제외하고, 분석에 도움이 되지 않는 stop word(e.g. and, or 등)를 제외하는 작업을 진행해야 한다. 물론 stop word도 어떤 분석을 목적시 하느냐에 따라 조금씩 다르긴 하다.
그 다음은 형태소 분석을 통해 같은 의미를 가지지만 형태가 다른 단어들을 모두 같은 단어로 변환해 주어야 한다.

이 과정을 모두 거치면 이제 다음 단계인 특징추출 단계로 넘어갈 수 있다.

Feature Engineering

여기서의 특징추출이라 하면, 길이가 정해지지 않은 여러 텍스트들을 고정된 길이의 칼럼을 가진 행렬로 만드는 것이다. 물론 행렬 안에는 숫자만 들어가야 한다.
가장 쉬운 특징추출 방법은 모든 학습 데이터 내에서 출현한 단어들을 담은 전체 단어 사전을 생성한 후, 각 텍스트에 사전에 있는 단어가 출현했는지의 여부를 0, 1로 나타내는 것이다. 요컨데, 사전에 '사과', '배'라는 단어가 있고 2번째 텍스트가 '사과는 빨갛다'라면, 데이터의 '사과' 칼럼의 2번째 원소는 1이, '배' 칼럼의 2번째 원소는 0이 들어가는 식이다.

다만 이 방법엔 다소 심각한 문제가 있다. 모든 단어를 다 담고 있는 사전을 기반으로 특징추출을 하므로, 특징 행렬의 칼럼 수가 늘어나게 되고, 그럼 자연스럽게 모형의 파라미터 수도 늘어난다. 이러면 모형이 학습하기 위해 너무 많은 데이터가 필요하고, 우연치 않게 레이블과 관계 있어 보이는 데이터 상 의미없는 패턴이 생기기 쉬워 모형이 전체적인 일반적인 패턴 대신 데이터 속 패턴만을 찾아내는 잘못된 학습을 할 위험이 있다.

이걸 막기 위해 획기적으로 특징 수를 줄이는 방법이 있다. 학습 데이터의 각 레이블에 속하는 텍스트에서 나타나는 단어들의 빈도를 담은 테이블을 만들고, 새로운 텍스트가 들어올 때 각 레이블의 빈도 테이블에서 텍스트 내 모든 단어가 가진 각 테이블에서의 빈도들의 합을 2개의 특징으로 사용하는 것이다. 단, 빈도를 더할 때 동일 단어에 대한 빈도를 중복해서 더하지 않도록 주의하여라.

예를 들어, 전체 데이터 중 긍정 레이블에서 '사랑'이라는 단어가 5번 나타났고, 부정 레이블에선 4번나타났다. 그러면 특정 텍스트에서 사랑이라는 단어가 나타나면 이 텍스트의 특징 벡터는 [5, 4]가 되는 방식이다.

이는 꽤 그럴듯한 접근방법이다. 만약 어떤 단어가 특정 레이블에서 더 빈번하게 발생한다는 건 곧 그 단어의 특정 레이블에서의 출현 빈도는 그 레이블을 예측하는데 좋은 지표가 되어줌을 의미한다. 그러한 지표들을 전부 합하면, 전체적인 텍스트의 긍/부정 수준을 쉽게 파악할 수 있다. 예를 들어 '파괴적인 생각'이라는 텍스트에서, 우리는 흔히 '파괴적'이라는 표현이 부정적인 상황에서 더 많이 쓰임을 알고, '생각'은 긍/부정 상황에서 비슷하게 쓰이므로, '파괴적인 생각'이라는 표현은 전체적으론 부정적인 표현이라고 짐작할 수 있다.

Model Building

모형은 단순한 Logistic Regression(로지스틱 회귀)를 사용하였다. 단순 선형회귀와 로지스틱 회귀를 구별짓는 가장 명확한 차이는 로지스틱 회귀의 모형 내에 있는 '시그모이드 함수 sigmoid function'인데, 단순한 선형회귀 결과를 시그모이드 함수에 집어넣으로써, 선형 회귀를 분류 모형으로 변형하면서도 모형이 통계적으로도, 그리고 직관적으로도 상당하게 그럴듯한 의미를 가지게 되기 때문이다. 로지스틱 회귀 모형의 형태를 수학적으로 적으면 아래와 같다.

h(x(i),θ)=11+eθTx(i)h(x^{(i)}, \theta)={1\over 1 + e^{-\theta^Tx{(i)}}}

x(i)x^{(i)}는 한 관측치에 대한 특징 벡터, θ\theta는 파라미터 벡터이다.
다만 문제점은 로지스틱 회귀의 최적 파라미터를 바로 특정할 수 있는 해석해가 없어서, 경사하강 방식으로 최적 파라미터의 근사치만을 구할 수 있다. 하지만 일반적으로 이 과정은 그다지 어렵지 않고 대부분의 경우에 매우 유용한 것으로 알려져 있다.

Test

테스트를 위해선 학습 데이터에 속하지 않는 새로운 텍스트가 필요하다. 물론 기존 데이터셋을 분할하여도 되지만, 결국 감성분석이라는 것이 모든 언어 활동에 적용될 수 있는지라, 시간만 있다면 자신만의 테스트셋을 사용하여도 좋다. 물론 보통은 전체 데이터셋을 학습 데이터와 검증 데이터로 분리하여 테스트한다.

Error Analysis

잘못 분류된 텍스트가 어떻게 생겼는지를 보는 건 모형 향상을 위한 인사이트를 제공해준다. 예를 들어, "나는 내 전 애인이 저렇게 행복할 수 있다는 게 믿기지 않아. 나도 축하해줘야 하는 걸까..." 라는 텍스트가 있다면, 일부 모형은 '행복'과 '축하'라는 단어를 통해 긍정적인 텍스트로 분류할 수 있지만, 읽어보면 이 텍스트는 약간 침울한 분위기가 있다.

profile
곡선의 투자, 곡선의 경제학.

0개의 댓글