[AIB 18기] Section 3 - Sprint 2 - Note 1 - 자연어처리(NLP, Natural Language Processing)

ysk1230·2023년 4월 25일
0

Count Based Representation

🏆 학습 목표

  • 자연어처리

    • 자연어처리를 통해 어떤 일을 할 수 있는지 알 수 있습니다.
  • 전처리(Preprocessing)

    • 토큰화(Tokenization)에 대해 설명할 수 있으며 SpaCy 라이브러리를 활용하여 토큰화를 진행할 수 있습니다.
    • 불용어(Stop words)를 제거하는 이유를 설명할 수 있고, 불용어 사전을 커스터마이징한 후 해당하는 내용을 토큰화에 적용할 수 있습니다.
    • 어간 추출(Stemming)과 표제어 추출(Lemmatization)의 차이점을 알고 각각의 장단점에 대해 설명할 수 있습니다.
  • 등장 횟수 기반의 단어 표현(Count-based Representation)

    • 문서-단어 행렬(Document-Term Matrix, DTM)을 이해하고 Bag-of-words 에 대해서 설명할 수 있습니다.
    • TF-IDF에서 TF, IDF에 대해서 설명하고 IDF를 적용하는 이유에 대해서 설명할 수 있습니다.

🛫 Warm up

  • 자연어 처리에서 등장하는 용어들

    • 말뭉치(Corpus) : 특정한 목적을 가지고 수집한 텍스트 데이터
    • 문서(Document) : 문장(Sentence)들의 집합
    • 문장(Sentence) : 여러 개의 토큰(단어, 형태소 등)으로 구성된 문자열. 마침표, 느낌표 등의 기호로 구분
    • 어휘집합(Vocabulary) : 코퍼스에 있는 모든 문서, 문장을 토큰화한 후 중복을 제거한 토큰의 집합
  • 전처리(Preprocessing)

    • 다음 키워드에 대해 조사해보세요.
      • 토큰화(Tokenization)
      • 차원의 저주(Curse of Dimensionality)
      • 불용어(Stop words)
      • 어간 추출(Stemming)
      • 표제어 추출(Lemmatization)
  • 등장 횟수 기반의 단어 표현(Count-based Representation)


1. 자연어 처리란?

자연어는 사람들이 일상적으로 쓰는 언어, 인공적으로 만들어진 언어인 인공어와 구분하여 부르는 개념
이런 자연어를 컴퓨터로 처리하는 기술을 자연어처리(Natural Language Processing,NLP)
라고 한다.

자연어 처리로 할 수 있는 것들
뉴스 기사 분류, 감정 분석, 리뷰 분석, 기계번역, 요약, 챗봇, TTS, STT 등

2. 벡터화

컴퓨터는 자연어 자체를 해석할 수 없습니다. 그래서 컴퓨터가 이해할 수 있도록 벡터를 만들어줘야 합니다.
이 과정을 벡터화 라고 하며 자연어 처리 모델의 성능을 결정하는 중요한 역할을 합니다.

자연어를 벡터화하는 방법은 크게 2가지로 나뉩니다.

  1. 등장 횟수 기반의 단어 표현 : 단어가 문서(혹은 문장) 에 등장하는 횟수를 기반으로 벡터화 하는 방법
    • Bag of Word (CounterVectorizer)
    • TF-IDF(TfidVectorizer)
  1. 분포 기반의 단어 표현 : 타겟 단어 주변에 있는 단어를 기반으로 벡터화 하는 방법
    • Word2Vec
    • GloVe
    • fastText

3. 텍스트 전처리

텍스트 데이터도 전처리를 해줘야 자연어 처리를 제대로 진행할 수 있습니다.
만약 전처리를 안하고 진행할 경우 차원의 저주가 발생할 가능성이 높습니다.
단어의 종류를 줄여야 차원의 저주를 해소 가능합니다.

전처리를 위해 활용되는 방법들은
- 내장 메서드(lower, upper)
- 정규표현식
- 불용어 처리
- 통계적 트리밍
- 어간 추출, 표제어 추출 등등

4. 정리

1. 토큰화

파이썬 자연어 처리에서 토큰화(Tokenization)란, 문장이나 단락을 작은 단위로 쪼개는 것을 의미합니다. 이 작은 단위를 토큰(Token)이라고 하며, 예를 들어 단어, 구두점, 숫자 등이 될 수 있습니다.

일반적으로 토큰화는 자연어 처리에서 데이터를 전처리하는 과정 중 하나로, 텍스트를 처리하고 분석하기 위해 필요합니다. 이는 텍스트를 기계가 이해할 수 있는 단위로 분해하는 것으로, 이후에 수행될 자연어 처리 작업에서 토큰들을 활용하여 문장의 의미를 파악하거나 문서 분류, 감성 분석 등 다양한 작업을 수행할 수 있게 됩니다.

파이썬에서는 주로 NLTK(Natural Language Toolkit) 패키지나 spaCy 패키지 등을 사용하여 토큰화를 수행할 수 있습니다.

2. 정규표현식

구두점이나 특수문자 등 필요없는 문자가 말뭉치 내에 있을 경우 토큰화가 제대로 이루어지지 않습니다.
이를 제거하기 위해서 정규표현식(Regular Expression, Regex)을 사용합니다.
정규 표현식은 문자열을 다루기 위한 매우 중요하고도 강력한 도구이지만 복잡하기 때문에 잘 쓰려면 반복적인 실습이 필요합니다.

3. SpaCy

SpaCy 는 문서 구성요소를 다양한 구조에 나누어 저장하지 않고 요소를 색인화하여 검색 정보를 간단히 저장하는 라이브러리입니다.
그렇기 때문에 실제 배포 단계에서 기존에 많이 사용되었던 NLTK 라이브러리보다 SpaCy 가 더 빠릅니다.

이러한 장점 덕분에 최근에는 SpaCy 라이브러리를 많이 사용하고 있습니다.

4. 불용어 처리

'I', 'and', 'of' 같은 단어들은 리뷰 관점에서 아무런 의미가 없습니다.
이런 단어들을 'Stop words(불용어)' 라고 합니다.
분석할 때 해당하는 단어를 제외하기 때문입니다.

대부분의 NLP 라이브러리는 접속사, 관사, 부사, 대명사, 일반동사 등을 포함한 일반적인 불용어를 내장하고 있습니다.

불용어는 삭제나 추가를 통해 커스터마이즈가 가능합니다.

5. 통계적 트리밍(Trimming)

불용어를 직접적으로 제거하는 대신 통계적인 방법을 통해 말뭉치 내에 너무 많거나, 너무 적은 토근을 제거하는 방법

  • 자주 나타나는 단어들 : 여러문서에 두루 나타나기에 문서 분류 단계에서 통찰력을 제공하지 않음
  • 자주 나타나지 않는 단어들 : 너무 드물게 나타나기 때문에 큰 의미가 없을 확률이 높다

6. 어간 추출과 표제어 추출

어근이 같은 단어를 정규화 해주는 작업이 어간추출 표제어 추출

* 어간(Steamming) 추출

어간이란? 단어의 의미가 포함된 부분. 접사등이 제거된 형태
argue, argued, arguing... 어간은은 argu 가 어간

어간 추출은 ing, ed ,s 같은 부분을 제거

* 표제어 추출(Lemmatization)

표제어 추출(Lemmatization)은 어간추출보다 체계적입니다.
단어들은 기본 사전형 단어 형태인 Lemma(표제어)로 변환됩니다.

명사의 복수형은 단수형으로, 동사는 모두 타동사로 변환됩니다.
이렇게 단어들로부터 표제어를 찾아가는 과정은 Stemming 보다 많은 연산이 필요합니다.

7. 등장 횟수 기반의 단어 표현

텍스트 문서를 벡터로 표현

텍스트를 컴퓨터가 계산할 수 있도록 수치정보로 변환하는 과정입니다.
단어가 특정 문서에 들어있는 횟수를 바탕으로 해당 문서를 벡터화합니다.

대표적인 방법으로는 Bag-of_Words(TF, TF-IDF) 이 있습니다.

  • 문서 - 단어 행렬(Document-Term Matrix, DTM)

1) Bag-of-Words(BoW) : TF(Term Frequency)

Bag-of-Words(BoW)는 가장 단순한 벡터화 방법 중 하나입니다.
문서(혹은 문장)에서 문법이나 단어의 순서 등을 무시하고 단순히 단어들의 빈도만 고려하여 벡터화합니다.

2) Bag-of-Words(BoW) : TF-IDF (Term Frequency - Inverse Document Frequency)

단어를 벡터화 할 때에도 마찬가지입니다. 다른 문서에 잘 등장하지 않는 단어라면 해당 문서를 대표할 수 있는 단어가 될 수 있겠죠.
이렇게 다른 문서에 등장하지 않는 단어, 즉 특정 문서에만 등장하는 단어에 가중치를 두는 방법이
TF-IDF(Term Frequency-Inverse Document Frequency) 입니다.

  • TF-IDF의 수식
    TF-IDF의 수식은 다음과 같습니다.
TF-IDF(w)=TF(w)×IDF(w)\text{TF-IDF(w)} = \text{TF(w)} \times \text{IDF(w)}

각 항이 어떻게 구해지는지 알아보겠습니다.

TF(Term-Frequency)는 특정 문서에서 단어 w가 쓰인 빈도입니다. 분석할 문서에서 단어 ww 가 등장하는 횟수를 구하게 됩니다.

TF(w)=특정 문서 내 단어 w의 수\text{TF(w)} = \text{특정 문서 내 단어 w의 수}

IDF(Inverse Document Frequency)는 분류 대상이 되는 모든 문서의 수를 단어 ww 가 들어있는 문서의 수로 나누어 준 뒤 로그를 취해준 값입니다.

IDF(w)=log(분류 대상이 되는 모든 문서의 수단어 w가 들어있는 문서의 수)\text{IDF(w)} = \log \bigg(\frac{\text{분류 대상이 되는 모든 문서의 수}}{\text{단어 w가 들어있는 문서의 수}}\bigg)

실제 계산에서는 0으로 나누어 주는 것을 방지하기 위해서 분모에 1을 더해준 값을 사용합니다.

분류 대상이 되는 모든 문서의 수:n단어 w가 들어있는 문서의 수:df(w)\text{분류 대상이 되는 모든 문서의 수} : n \\ \text{단어 w가 들어있는 문서의 수} : df(w)

라 하면 IDF는 다음과 같이 구해집니다.

IDF(w)=log(n1+df(w))\text{IDF(w)} = \log \bigg(\frac{n}{1 + df(w)}\bigg)

위 식에 따르면 자주 사용하는 단어라도, 많은 문서에 나오는 단어들은 IDF가 낮아지기 때문에

TF-IDF로 벡터화 했을 때 작은 값을 가지게 됩니다.

0개의 댓글