본문 바로가기
인공신경망(DL)/NLP

NLP, Natural Language Processing

by kiimy 2021. 8. 21.
728x90
  • 자연어처리
    • 자연어처리를 통해 어떤 일을 할 수 있는지 알 수 있습니다.

 

  • 전처리(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) # corpus에 존재하는 단어의 종류
      • 불용어(Stop words)
      • 어간 추출(Stemming)
      • 표제어 추출(Lemmatization)

자연어(Natural Language)

자연어 혹은 자연 언어는 사람들이 일상적으로 쓰는 언어를 인공적으로 만들어진 언어인
인공어와 구분하여 부르는 개념

자연어 이해(NLU, Natural Language Understanding)

분류(Classification) : 뉴스 기사 분류, 감성 분석(Positive/Negative)
Ex) "This movie is awesome!" -> Positive or Negative?

 

자연어 추론(NLI, Natural Langauge Inference)
Ex) 전제 : "A는 B에게 암살당했다", 가설 : "A는 죽었다" -> True or False?

 

기계 독해(MRC, Machine Reading Comprehension), 질의 응답(QA, Question&Answering)
Ex) 비문학 문제 풀기

 

품사 태깅(POS tagging), 개체명 인식(Named Entity Recognition) 등 
Ex) POS Tagging :POS Tagging을 알아보자! fly= 날다(verb), fly= 파리(noun)
Ex) NER : NER을 알아보자!

 

NER 개론과 NER 데이터셋 모음 (한국어 개체명인식 포함)

**아래 글은 A Survey on Deep Learning for Named Entity Recognition 논문을 읽고 작성한 글입니다.** 목차 NER이란? NE의 태깅 시스템 NE의 카테고리와 대표적인 데이터셋 NER에 대한 전통적인 접근법 딥러닝으..

stellarway.tistory.com

 

  • 자연어 생성(NLG, Natural Language Generation)
    • 텍스트 생성 (특정 도메인의 텍스트 생성)
      Ex) 뉴스 기사 생성하기, 가사 생성하기

 

  • NLU & NLG
    • 기계 번역(Machine Translation)
    • 요약(Summerization)
      • 추출 요약(Extractive summerization) : 문서 내에서 해당 문서를 가장 잘 요약하는 부분을 찾아내는 Task => (NLU에 가까움)
      • 생성 요약(Absractive summerization) : 해당 문서를 요약하는 요약문을 생성 => (NLG에 가까움)
    • 챗봇(Chatbot)
      • 특정 태스크를 처리하기 위한 챗봇(Task Oriented Dialog, TOD)
        Ex) 식당 예약을 위한 챗봇, 상담 응대를 위한 챗봇
      • 정해지지 않은 주제를 다루는 일반대화 챗봇(Open Domain Dialog, ODD)
  • 기타
    • TTS(Text to Speech) : 텍스트를 음성으로 읽기 (Ex) 유튜브 슈퍼챗)
    • STT(Speech to Text) : 음성을 텍스트로 쓰기 (Ex) 컨퍼런스, 강연 등에서 청각 장애인을 위한 실시간 자막 서비스 제공)
    • Image Captioning : 이미지를 설명하는 문장 생성 

벡터화(Vectorize)

컴퓨터는 자연어 자체를 받아들일 수 없습니다. 그래서 컴퓨터가 이해할 수 있도록 벡터로 변환
자연어를 어떻게 벡터로 표현하는 지는 자연어 처리 모델의 성능을 결정하는 중요한 역할을 합니다.

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

전처리( Text Processing )

1. 차원의 저주 (Curse of Dimensionality)

- 전체 말뭉치에 존재하는 단어의 종류가 데이터셋의 Feature

 

for i, sent in enumerate(tokenizer.pipe(sent_lst)):

# tokenizer.pipe == Tokenize a stream of texts.

 

total_tokens = []

for i, sent in enumerate(tokenizer.pipe(sent_lst)):

    sent_token = [token.text for token in sent]

         # [ re.sub(r"[^a-z0-9]", "", token.text.lower()) for token in sent ]

 

    total_tokens.extend(sent_token)

    print(f"sent {i} : {sent_token}")

 

token_set = set(total_tokens) # 중복을 제거하고 순서 없다

 

# 토큰화 -> 벡터화( one-hot은 이제 안 씀 == 차원이 너무 많아짐 => word Embedding)

* 토큰화시 주의

나누는 기준을 잘 생각해야된다.

ex ) 199.01.01.01 서버에서 ~~~ 하고 밥먹자.

만약 . (.마침표를 기준으로 나눈다면 앞에 IP주소를 다 나누게 된다.

== 사용하는 Corpus가 어떤 언어인지 특수문자들이 어떻게 쓰이는지 알고

     규칙을 정의 해볼 수 있겠다.

2. 대소문자 통일, 정규식표현식(Regex)

- 똑같은 단어로 통일, 구두점 or 특수문자 제외

but

단순 제외하면 절대 안되!

1. $45.55, 01/02/02, AT&T 등 각 표현에 의미가 있는 경우가 있다.

2. 줄임말과 한 단어 내에 띄어쓰기 있을 경우

ex) New York / 아포스트로피( ' ) == Don't 접어 사용시

import re

# []: [] 사이 문자를 매치, ^: not

regex = r"[^a-zA-Z0-9 ]" 

 

# 치환할 문자

subst = ""

result = re.sub(regex, subst, text)

 

# 소문자로 치환

result.lower().split()

 

* 가장많이 존재하는 단어 확인

from collections import Counter

# Counter 객체는 리스트요소의 값과 요소의 갯수를 카운트 하여 저장하고 있습니다.

# 카운터 객체는 .update 메소드로 계속 업데이트 가능합니다.

 

word_counts = Counter() # 토큰화된 각 리뷰 리스트를 카운터 객체에 업데이트 합니다.

 

df['tokens'].apply(lambda x: word_counts.update(x))

 

word_counts.most_common(10)

3. 불용어(stop_words) 처리

- 별로 의미를 갖지 않는 단어들(= 불용어)을 제외

- BoW를 사용한다는 것은 그 문서에서 각 단어가 얼마나 자주 등장했는지를 보겠다라는 의미

== > 단어에 대한 빈도수를 수치화 하겠다는 것은 결국 텍스트 내에서 어떤 단어들이 중요한지를 

        보고싶다는 의미를 함축하고 있다.

불용어를 제거하는 일은 자연어 처리의 정확도를 높이기 위해서 선택할 수 있는 전처리 기법

4. 통계적 트리밍(Trimming)

- 불용어를 직접 제거하는 대신 통계적인 방법으로 corpus 내에 너무 많거나 적으면 제거

5. 어간 추출(Stemming)과 표제어 추출(Lemmatization)

* 어간 추출(Stemming)

- 어근이나 단어의 원형과 같지 않을 수 있다 ( flies => fli )

(=  단지 단어의 끝 부분을 자르는 것 ) 

표제어 추출과 비교했을 때 성능이 나쁘지 않음

 

* 표제어 추출

- 단어들은 기본 사전형 단어 형태인 Lemma(표제어)로 변환 ( flies => fly )

(= 많은 연산이 필요 )


단어 시퀀스에 확률을 할당하게 하기 위해서 가장 보편적으로 사용되는 방법은

언어 모델이 이전 단어들이 주어졌을 때 다음 단어를 예측하도록 하는 것

등장 횟수 기반의 단어 표현(Count-based Representation)

-- 통계적 언어 모델( statistical Language Model, SLM ) 한계가 있음!

= 이전단어로 부터 다음 단어를 예측

 

-  단어가 특정 문서(혹은 문장)에 들어있는 횟수를 바탕으로 해당 문서를 벡터화

= 대표적인 방법으로는 Bag-of-Words(TF, TF-IDF) 방식

문법이나 단어의 순서 등을 무시하고 단순히 단어들의 빈도만 고려

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

벡터화 된 문서는 문서-단어 행렬의 형태로 나타내어집니다.
문서-단어 행렬이란 각 행에는 문서((Document)가, 각 열에는 단어(Term)가 있는 행렬입니다.

  word_1 word_2
docu_1 1 2
docu_2 0 0
docu_3 0 0

from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer

 

TF( Term Frequency )의 단점 Countervectorizer DTM

- 횟수만 고려하기 때문에 횟수에 따라 중요도가 달라진다

 

보완

TF -IDF ( - Inverse Document Frequency ) TfidVectorizer

각 단어에 대한 중요도를 계산

- 빈도 횟수에 패널티를 주어 확률로 나오게함(= 단어 빈도 scale 맞춰준다 )

- 특정 문서에만 등장하는 단어에 가중치를 두는 방법

모든 문서들에서 자주나오는 단어가 아닌 특정문서에서만 나오는 단어가 있을 경우
해당 단어에 대해 가중치를 부여한다.(= 해당 문서를 대표하는 단어)

자주 사용하는 단어라도, 많은 문서에 나오는 단어들은 IDF가 낮아지기 때문에
TF-IDF로 벡터화 했을 때 작은 값을 가지게 된다.

 

각 문서에서의 각 단어의 빈도수를 카운트 한 행렬이라는 전체적인 통계 정보를 입력으로 받아

차원을 축소(Truncated SVD)하여 잠재된 의미를 끌어내는 방법론

But
이런 카운트 기반 접근 모델의 한계는 훈련한 corpus에 주어진 단어 시퀀스가 없다면
확률을 0 or 정의되지 않은 확률이 나올 수 있다,
이와 같이 충분한 데이터를 관측하지 못하여 언어를 정확히 모델링하지 못하는 문제를 
희소 문제(sparsity problem)

n-gram 모델

n-gram 언어 모델은 여전히 카운트에 기반한 통계적 접근을 사용하고 있으므로 SLM의 일종

이전에 등장한 모든 단어를 고려하는 것이 아니라 일부 단어만 고려하는 접근 방법

== 일부 단어로 카운트 횟수를 늘려서 정확도를 늘릴 수 있다는 아이디어

 

unigrams : an, adorable, little, boy, is, spreading, smiles
bigrams : an adorable, adorable little, little boy, boy is, is spreading, spreading smiles
trigrams : an adorable little, adorable little boy, little boy is, boy is spreading, is spreading smiles
4-grams : an adorable little boy, adorable little boy is, little boy is spreading, boy is spreading smiles

But
전체 문장을 고려하지 않은 것이기 때문에 정확도가 떨어진다
학습하지 않은 것에 대해선 0으로 출력

so Word Embedding을 통해 단어 유사도를 학습시킨다. NNLM
유사도를 구해서 확률을 가진 값을 출력 ( cos similartiy ), 그리고 
벡터의 원소들이 실수값을 가지면서, 원-핫 벡터보다 저차원을 가진다.

But
이것도 한계가 있다.(= 마찬가지로 버려진 단어들이(n-gram) 가진
문맥정보를 참고하지 못해 )
고정된 길이의 입력( 정해진 n개의 단어만 참고 )

결국은 이러한 한계로 인해 인공신경망을 사용 RNN

 

 

728x90

'인공신경망(DL) > NLP' 카테고리의 다른 글

Transformer / BERT, GPT  (0) 2021.08.22
Recurrent Neural Network, RNN  (0) 2021.08.22
분산표현(Distributed Representation, word2Vec, FastText)  (0) 2021.08.21

댓글