DEV/nlp

NLP 자연어 처리 정리 1

석봉 2024. 8. 22. 10:57

[노트]

자연어 처리

 - Speech Recognition (음성 인식)

 - Translation (번역)

 - Text Summary (요약)

 - Text Classification (분류)

 

자연어 처리의 요소들

 - Sentiment Analysis : 텍스트에 녹아 있는 감성 또는 의견을 파악

 - Tokenization : 단어의 최소한의 의미를 파악하는 쪼개기

 - Named Entity Recognition : 텍스트로부터 주제 파악하기

 - Normalization : 의도된 오타 파악하기

 - Dependenct Parsin : 문장 구성 성분의 분석

 - Feature Analysis : 음성 데이터로부터 특징을 추출

 - Language Model : 언어별로 갖고 있는 특성을 반영

 - Deep Learning : 이미 학습된 데이터로부터 음성 신호 처리

 - HMM(Hidden Markov Model) : 앞으로 나올 단어 또는 주제의 예측

 - Similarity Analysis : 음성 신호가 어떤 기준에 부합하는가?

 - Encoding : 유사도 기반 자연어 특징 추출

 - Time Series Modeling : 문장을 시간에 따른 데이터로 처리

 - Attention Mechanism : 번역에 필요한 부분에만 집중하기

 - Self-Attention : 문장 사이의 상관관계를 분석

 - Transformer (Attention Mechanism + Self-Attention) : Attention 구조를 이용한 번역 원리

 

텍스트 전처리 과정

  1. 토큰화 : 문장을 단어로 쪼개기 (필요한 기준에 맞게)
  2. 정제 및 추출 : 오타 수정, 의미가 비슷한 단어끼리 묶기, 필요 없는 단어 제거 등등... 필요한 정제 및 추출 실행
  3. 인코딩 : 단어를 숫자로 변환 (정수 인코딩, 원핫 인코딩 등등...)

 

 

언어 전처리 : 컴퓨터가 자연어를 효과적으로 처리할 수 있도록 하는 것

  1. Sentence 문장
  2. Tokenization 토큰화
    주어진 문장에서 "의미 부여"가 가능한 단위를 찾음, 주로 패키지를 사용하여 처리하며 패키지 처리 방식 및 특성을 잘 고려하여 사용
  3. Cleaning Stemming 정제 추출 :
    [정제]
     - 대문자 -> 소문자
     - 노이즈 제거 (출현 횟수가 적은 단어 제거 등..)
     - 제거할 때 해당 단어가 중요한 단어라면 제거하지 않는 것을 고려해야 함
     - 길이가 짧은 단어 제거, 지시(대)명사 및 관사 제거. 즉 대세에 지장이 없는 토큰을 제거하는 방법들...

    [추출]
     - 어간 추출 (Porter Algorithm과 같은 알고리즘)
     - 복수, 진행형와 같은 필요 없는 부분 제거 (해당 문맥에 문제가 없다면)
     - 표제어 추출 (is, are -> be / having -> have)

    *표제어 추출은 단어의 품사 정보를 포함
    *어간 추출은 품사 정보를 갖고 있지 않음

    [Stopword 불용어]
     - 문장에서 대세로 작용하지 않는, 중요도가 낮은 단어 제거
     - 전처리 과정에서 패키지를 이용하여 제거 (필요에 따라, 메모리/시간 등 고려)
     - 불용어 목록 받아오기 > 정제할 문장 토큰화 > 토큰화된 각 단어에 불용어가 존재하는 경우 제거
  4. Encoding 인코딩
     - 1, 2, 3 과정을 거치면 진짜 필요한 단어 리스트를 가지게 되며 해당 리스트를 컴퓨터가 인식할 수 있게 변경해야 함
     - 정수 인코딩 : 순서대로 정수로 변환 >> 1, 2, 3 ....
     - 원핫 인코딩 : 0, 1로 백터화 >> [1, 0, 0, 0], [0, 1, 0, 0] ....
    메모리를 많이 차지하는 단점 존재, 필요할 때만 잠깐 적용하는 방법 등을 사용
     - Wrod2vec : 단어의 유사성을 인코딩에 반영 (인코딩 벡터가 비슷하면 단어가 유사하다고 볼 수 있음)

    TF-IDF (Term Frequency -Inverse Document Frequency) : 단어들의 중요한 정도를 가중치로 매기는 방법
    *TF - IDF = tf (d,t) x idf (d, t)
     - d : 특정 문서 번호
     - t : 특정 단어 번호
     - tf(d, t) : 특정 문서 d에서 특정 단어 t의 등장 횟수
     - idf(d,t) : idf(d,t) = log(N/df(t))
     - df(t) : 특정 단어 t가 등장한 문서의 수
     - N : 총 문서의 수
  5. Sorting 분류
     - 빈도수 기준으로 재정렬 등...
  6. Padding Similarity  길이 조정 유사도 분석
     - Zero-padding : 같은 길이로 padding을 주는데 빈 공간을 0으로 채워서 길이를 맞춤

언어 모델 (Language Model)

 - 통계(확률) 기반 언어 모델
개별 단어 : w
단어 sequence = W = {w1, w2, w3 ... wn}
n개의 단어로 이루어진 sequence가 등장할 확률 : p(W) = p(w1, w2, ... wn)
즉, 개별 단어가 나올 확률의 곱


이미 n-1개의 단어가 주어진 경우, 다음에 등장할 단어는?
p(wn|w1, w2 ... wn-1) = p(w1 ... wn) / p(w1 ... wn-1)

Markov Chain : 다음 단어의 영향만을 주고 이후의 단어가 이전에 단어에 영향을 주지 않는다를 가정.
- 표본수가 적은 경우 확률을 구하여 사용하기 적합할까...? (Sparsity Problem)
- 위 문제를 해결하기 위해 N-gram Language Model이 나옴
- 한국어의 경우 순서가 중요하지 않기 때문에 적용하기 힘든 모델

N-gram Language Model : 앞의 N개의 단어를 가지고 근사하겠다.
- 정확성은 낮아지나 Sparsity 문제를 어느정도 해결할 수 있음

NNLM (NN-Language Model / NN : Neural Network) : 앞의 N개의 단어를 Neural Network에 태워서 Input / Outpu 도출

- 정해진 길이의 과거 정보만을 참조하므로 함축 정보를 파악할 수 없음

  - 문장의 길이가 달라질 겨우 한계점이 명확함

 - 인공 신경망 기반 언어 모델

 

유사도 분석

 - 벡터 유사도 (Cosine Metric)
벡터는 크기와 방향을 가짐
같은 방향은 1, 90도 차이는 0, 180도 차이는 -1

두 벡터의 내적 = norm*cosΘ
벡터의 내적 : 각 성분끼리 곱한 값의 합
norm : root(성분의 제곱들의 합)
[1, 1, 0] , [1, 0, -1] >> 1 = root(2)*root(2)*cosΘ >> cosΘ = 0.5

 

- bag of words : 단어의 발생 빈도만을 가지고 유사도를 분석하는 단순 모형

- Euclidean Metric : 벡터 사이의 길이를 기반으로 분석

- Levenshtein Distance : 단어 사이의 거리를 나타내는 대표적인 척도

 

텍스트 마이닝

 - Word2Vec : 정수/one-hot 인코딩 단점 보완 

- 정수 인코딩 : 단어 사이의 연관성 파악 어려움

- one-hot 인코딩 : 메모리 문제, 연관성 파악 어려움, 희소 표현(Sparse Representation)
밀집 표현 (Dense Representation) <--> 희소 표현
- one-hot encoding의 S.R 문제를 보완

- 벡터의 차원을 원하는 대로 설정
- 데이터를 이용하여 표현을 학습함 (Neural Network 이용)

- CBOW (Continuous Bag of Words)

주변 단어를 활용하여 중간에 있는 단어를 예측 (*예측 : 학습을 위한 레이블링)
1. 모든 단어 토큰화 > 정제 및 추출 > 인코딩 후 중심 단어 기준으로 주변 단어를 모두 Input Layer에 집어 넣음
(단어의 수는 설정 : 좌/우 N개...)

2. Projection Layer를 거친 후 Output Layer에서 중심 단어(임베딩 된)가 출력되게

- Skip-Gram

중간 단어를 활용해 주변에 있는 단어를 예측

(CBOW와 반대 흐름)

- SGNS : 중심 단어와 주변 단어의 관계를 수치화 (1에 가까울 수록 관계적인 단어다.)
CBOW나 Skip-Gram은 classification을 했다면, SGNS는 binary classification (연산량에 강점)
예) 단어 2개를 비교하여 관계있는 단어는 1, 없는 단어는 0으로 데이터셋을 구성, binary classification함.

 

 - Glove
중심 단어와 주변 단어 벡터의 내적 = Corpus 동시 등장 학률

 

 - FastText

Facebook에서 개발한 Word2Vec 알고리즘

단어 단위에서 더 쪼갠 "subword"의 개념 도입

- 글자 단위 n-gram (mouse|3-gram > mo, mou, ous, use, se)

쓰는 이유?

1. OOV(Out of Vocabulary) : 모르는 단어(OOV)가 등장할 경우 Word2Vec에서 처리가 불가능 (해당 단어가 인코딩이 안되어있기 때문)

>> backdrop > back + drop 처럼 단어의 느낌(뉘양스)을 이해할 수 있다는 장점이 있음.

2. Rare word 처리 : 빈도 수가 적은 단어들 처리에 강함

3. 오타에 강함

 

 

Pre-trained Word Embedding

 - 지도 학습에서 training dataset이 적을 경우 underfitting 발생 가능

 - 이를 해결하기 위해 사전훈련된 model 사용

 - CBOW, GloVe, FastText 등으로 훈련된 사전 모델 존재

 

RNN (Recurrent Neural Network)

 - 시계열 데이터 처리하기에 좋은 뉴럴 네트워크 구조 (음성인식, 음악생성, DNA 염기서열 분석, 번역기, 감정분석 등 시간에 따른 변화가 있는 데이터들 처리에 유리)

 - CNN은 이미지 구역별로 같은 weight를 공유한다면, RNN은 시간 별로 같은 weight를 공유함

 - Frist Order System : 현재 시간의 상태가 이전 시간의 상태와 관련이 있다고 생각함. xt = f(tx-1)
- 현재 입력(ut)이 존재하는 경우(이전 시간의 상태 + 현재의 입력) xt = f(xt-1, ut) ***이전 State를 참조함!!

 - 외부 입력 없이 자기혼자 돌아감. (autonomous system), 물론 입력이 있을 수 있음.

 - ANN(Artificial Neural Network)와 다르게 self-feedback(loop)이 존재함

 - 즉, xt는 hidden layer의 state를 의미 (이전 xt-1를 참조함)

 - 그렇기 때문에 xt는 이전까지의 상태와 이전까지의 입력을 대표할 수 있는 압축본이라고 할 수 있음 (아닐 수 도 있음)

 - 상태 xt는 시계열로 들어오는 입력들을 최대한 상세하게 표현할 수 있어야 함.

 - ANN, CNN처럼 back-propagation을 이용함

 - 한계점
- exploding / vanishing gradient 문제 :
W*x가 계속 곱하지다 보니 무한대 또는 0으로 수렴하는 문제가 있음 (학습이 어려움)

- inf가 뜨는 경우 더 이상 학습 진행이 불가 >> Gradient clipping (임계값을 정해놓고 그 이상은 값 고정)

- 반대로 vanishing gradient 문제는 학습 중 파악이 어려움.

 

RNN의 한계점을 해결하기 위해 나온 것 Gated RNN(LSTM / GUR)

 

LSTM(Long short-term memory)

 - gradient flow를 제어할 수 있는 밸브 역할

 - State space의 입력, 상태, 출력 구조는 동일함

  - 1. (forget gate) 입력값과 이전 상태를 어느정도 비율로 사용할 지 결정 (또는 얼마나 잊어버릴 것인가?)

- 2. (input gate) 새로운 입력과 이전 상태를 참조하여 이 정보들을 얼마나 활용할 것인가? (어떤 정보를 활용할 것인가?)

- 3. (cell gate) 1, 2번(input / forget gate)을 적절하게 섞음

- 4. (output gate) 일련의 정보들을 모두 종합하여 다음 상태를 결정

 

GRU

 - LSTM은 너무 복잡함 > 간소화

 - Cell state가 없음 (input, forget, output)

 - LSTM보다 파라미터 수가 적어 학습 시간 절약됨

 - 성능의 차이는 상황에 따라 너무 다름. BUT) RNN 보다는 성능 차원에서는 보장된다.

 

Seq2seq

 - RNN(LSTM)을 Encoder, Decoder 이중으로 사용.

 - input이 encoder를 지나서 나오는 "상태값"을 decoder 상태값으로 입력 (decoder 입력같에는 시작 시그널과 종료 시그널이 포함됨)

 

CNN (Convolutional Neural Network)

 - nxn 배열로 쪼개서 이미지 처리에 주로 사용

 - 이를 언어 모델로 사용할 수 없을까? >> 1D-CNN Model

- 단어 정제 및 추출 후 인코딩 -> Pooling

- word2vec + CNN 필터를 사용한다고 생각하면 됨

 

Bi-LSTM

 - State가 한방향으로 흐르는 LSTM과는 다르게 양방향으로 State가 흐름(즉, State의 흐름이 2배가 됨)

 - 과거 데이터와 미래 데이터가 영향을 주는 모델로 성능은 LSTM보다 좋은 편

 

BERT(bidirectional encoder representation transformers)

 - Transformer 구조를 이용한 사전학습모델

- 사전 학습한 weight에 fine-tuning 하여 사용

 - 양방향(bidirectional) (Bi-directional Language Model)

 - Transformer 구조의 encorder 부분을이용

 - 대용량 corpus data로 모델(Glove, FastText, SGNS, CBOW 등...)을 학습시킨 후 task에 알맞게 전이학습을 하는 모델 (Word Embedding의 한 방법)

 - LSTM, NCC, Attention 구조 없이 ANN만 이어서 Task를 수행해도 성능이 잘 나온다는 장점이 있음

 - 두 가지 Pre-Training 구조를 가짐 (두 자기 동시 학습하는 구조)

- 1. Masked Language Model (MLM) : 가려서 학습 << 단어 단위 학습

- 1. 입력 단어의 15%를 Masking 함

- 1.1. 이 중 80%는 그대로 마스킹

- 1.2. 나머지 중 10%는 마스킹 대신 Random word로 치환

- 1.3. 나머지 10%는 원래 단어를 그대로 두고 추론할 수 있게 둠 (학습이 잘 되지 않은 상태를 보정하기 위함)
- 비율은 실험 결과적으로 성능이 가장 좋은 비율을 정한 것으로 비중을 바꿀 수 있는듯.

- 2. Masking한 단어를 예측하도록 인공신경망에게 요구 (가린 단어를 맞출 때 보여주기 때문에 Supervised learning)

- 단어를 양방향 참조 (GPT와는 다른 구조)

- 2. Next Sentence Prediction (NSP) : 두 문장을 넣었을 때 연결되어 있는가? 자연스러운가? (Supervised) << 문장 단위 학습

- 1. A 문장과 B 문장이 자연스럽게 이어지는 문장인지 (supervised)

 - INPUT(3개) : Token Embeddings, Segment Embeddings, Position Embeddings

 

GPT(generative pre-trained transformer)

 - Transformer의 Decoder 구조만을 사용

 - Masked self-attention 구조를 사용

 - Text & Position Embed -> [ Masked Self attention layer -> Layer Norm -> Feed forward -> Layer Norm ] * 12 -> Text Prediction / Task Classification

 - 양방향성을 띄는 BERT와는 다르게 순차적으로 계산하는 단방향성 Pre-train 모델

 - 그래서 GPT는 문장 생성과 같은 Task에 강점이 있음

 - BERT는 문장 의미 및 감성 분석 추출과 관련된 Task에 강점이 있음

 

 

 

[정리]

자연어 처리의 주요 분야:

  • 음성 인식(Speech Recognition): 음성을 텍스트로 변환
  • 번역(Translation): 한 언어를 다른 언어로 변환
  • 텍스트 요약(Text Summary): 긴 텍스트를 요약하여 핵심 내용 제공
  • 텍스트 분류(Text Classification): 텍스트를 사전 정의된 카테고리로 분류

 

자연어 처리의 주요 기술:

  • 감성 분석(Sentiment Analysis): 텍스트 내 감정 파악
  • 토큰화(Tokenization): 문장을 작은 단위로 분리
  • 명명체 인식(Named Entity Recognition): 텍스트 내의 주요 주제 식별
  • 정규화(Normalization): 오기나 약어를 표준 형태로 변환
  • 의존성 분석(Dependency Parsing): 문장 구조 분석
  • 특징 분석(Feature Analysis): 음성 데이터에서 중요한 특징 추출
  • 언어 모델(Language Model): 언어의 통계적 특성 반영
  • 딥러닝(Deep Learning): 대량의 데이터에서 패턴 학습
  • 은닉 마르코프 모델(Hidden Markov Model): 미래의 단어 또는 주제 예측
  • 유사도 분석(Similarity Analysis): 음성 신호의 기준 부합 여부 분석
  • 인코딩(Encoding): 텍스트의 특징 추출
  • 시계열 모델링(Time Series Modeling): 시간에 따른 데이터 분석
  • Attention Mechanism: 중요 부분에 집중
  • 셀프 어텐션(Self-Attention): 문장 내의 상호 관계 분석
  • 트랜스포머(Transformer): Attention 기반의 번역 원리

 

텍스트 전처리 과정:

  1. 토큰화(Tokenization): 문장을 단어로 분리
  2. 정제 및 추출: 오타 수정, 필요없는 단어 제거
  3. 인코딩(Encoding): 단어를 컴퓨터가 이해할 수 있는 형태로 변환

 

언어 모델의 종류:

  • 통계(확률) 기반 언어 모델
  • N-gram 언어 모델: 앞의 N개의 단어를 이용한 확률 계산
  • 인공 신경망 기반 언어 모델: 신경망을 이용한 언어 패턴 학습

 

유사도 분석 방법:

  • 코사인 유사도(Cosine Similarity)
  • 백터 유사도(Bag of Words)
  • 유클리드 거리(Euclidean Distance)
  • 레벤슈타인 거리(Levenshtein Distance)

 

텍스트 마이닝 기법:

  • 워드투벡(Word2Vec): 단어의 의미를 벡터로 표현
  • 글로브(GloVe): 단어와 주변 단어의 동시 등장 확률을 기반으로 단어 벡터 학습
  • FastText: 서브워드(subword)를 이용한 단어 벡터 학습, OOV 단어 및 드문 단어에 강함

 

사전 훈련된 워드 임베딩:

  • CBOW, GloVe, FastText 등으로 사전 훈련된 모델을 사용하여 학습 데이터 부족 문제 해결

 

딥러닝 기반 자연어 처리 모델:

  • RNN(Recurrent Neural Network): 시계열 데이터 처리에 적합
  • LSTM(Long Short-Term Memory): RNN의 gradient vanishing/exploding 문제 해결
  • GRU(Gated Recurrent Unit): LSTM보다 간결하고 학습이 빠름
  • Seq2Seq: RNN 또는 LSTM을 이용한 인코더-디코더 구조
  • CNN(Convolutional Neural Network): 이미지 분석 뿐 아니라 텍스트 분석에도 적용 가능
  • Bi-LSTM: 양방향 LSTM, 과거와 미래 데이터 모두 고려
  • BERT: 양방향 사전학습 모델, 트랜스포머 구조 이용
  • GPT: 단방향 사전학습 모델, 트랜스포머의 디코더 구조만 사용