-
NLP 자연어 처리 정리 1DEV/nlp 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 구조를 이용한 번역 원리
텍스트 전처리 과정
- 토큰화 : 문장을 단어로 쪼개기 (필요한 기준에 맞게)
- 정제 및 추출 : 오타 수정, 의미가 비슷한 단어끼리 묶기, 필요 없는 단어 제거 등등... 필요한 정제 및 추출 실행
- 인코딩 : 단어를 숫자로 변환 (정수 인코딩, 원핫 인코딩 등등...)
언어 전처리 : 컴퓨터가 자연어를 효과적으로 처리할 수 있도록 하는 것
- Sentence 문장
- Tokenization 토큰화
주어진 문장에서 "의미 부여"가 가능한 단위를 찾음, 주로 패키지를 사용하여 처리하며 패키지 처리 방식 및 특성을 잘 고려하여 사용 - Cleaning Stemming 정제 추출 :
[정제]
- 대문자 -> 소문자
- 노이즈 제거 (출현 횟수가 적은 단어 제거 등..)
- 제거할 때 해당 단어가 중요한 단어라면 제거하지 않는 것을 고려해야 함
- 길이가 짧은 단어 제거, 지시(대)명사 및 관사 제거. 즉 대세에 지장이 없는 토큰을 제거하는 방법들...
[추출]
- 어간 추출 (Porter Algorithm과 같은 알고리즘)
- 복수, 진행형와 같은 필요 없는 부분 제거 (해당 문맥에 문제가 없다면)
- 표제어 추출 (is, are -> be / having -> have)
*표제어 추출은 단어의 품사 정보를 포함
*어간 추출은 품사 정보를 갖고 있지 않음
[Stopword 불용어]
- 문장에서 대세로 작용하지 않는, 중요도가 낮은 단어 제거
- 전처리 과정에서 패키지를 이용하여 제거 (필요에 따라, 메모리/시간 등 고려)
- 불용어 목록 받아오기 > 정제할 문장 토큰화 > 토큰화된 각 단어에 불용어가 존재하는 경우 제거 - 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 : 총 문서의 수 - Sorting 분류
- 빈도수 기준으로 재정렬 등... - 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 기반의 번역 원리
텍스트 전처리 과정:
- 토큰화(Tokenization): 문장을 단어로 분리
- 정제 및 추출: 오타 수정, 필요없는 단어 제거
- 인코딩(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: 단방향 사전학습 모델, 트랜스포머의 디코더 구조만 사용
'DEV > nlp' 카테고리의 다른 글
Ollama python 모델 실행하기. (0) 2024.10.28 Mac OS / Windows Ollama로 eeve 모델 설치하여 사용하기 (2) 2024.09.25 LLaMA2 Meta의 LLM... (1) 2024.04.18 NLP 4. 불용어(Stopword), 정수 인코딩(Integer Encoding), 패딩(Padding) (0) 2024.01.17 NLP 3. 어간 추출(Stemming) / 표제어 추출(Lemmatization) (0) 2024.01.17