본문 바로가기

Heute lerne ich/AI

[엘리스] 자연어 처리 및 문장 유사도 / 모델 심화

<1> 자연어 처리 및 문장 유사도

 

01 한국어 자연어 처리

텍스트의 단어를 통해 문장의 의미, 구성 요소 및 특징 파악 가능

영어에서는 띄어쓰기를 통해 구별했으나 한국에서 단어의 기준은 명확하지 않음

 

한국어에서의 단어란 : 교착어, 의미적 기능 + 문법적 기능을 하는 부분의 조합으로 구성

엘리스는 / 엘리스

다 / 었다 / 는다

⇒ 단어의 의미적 기능과 문법적인 기능을 구분하는 것이 중요


02 KoNLPy

형태소 분석 : 주어진 한국어 텍스트를 단어의 원형 형태로 분리해주는 작업

KoNLPy는 형태소 사전을 기반으로 한국어 단어를 추출하는 라이브러리 (Mecab, 한나눔, 꼬꼬마, Komoran, Open Korean Text)

from konlpy.tag import Kkma, Okt

sent = "안녕 나는 엘리스야 반가워. 너의 이름은 뭐야?"
kkma = Kkma()

print(kkma.nouns(sent)) #명사 추출 ['안녕','나',~]
print(kkma.pos(sent)) #의미적 단어와 문법적 단어 나누어 원형 형태로 분리하고, 종류 구별
#[('안녕','NNG'),(~)]
print(kkma.sentences(sent)) #문장 구분하여 리스트 형태로 반환

okt = Okt()
print(okt.nouns(sent)) #명사 추출
print(okt.pos(sent)) #[('안녕','Noun'),('나','Noun'),('는','Josa'),..]
print(okt.pos(sent, stem=True)) #...('반갑다','Adjective') 원형 상태로 반환

hannanum = Hannanum()
komoran = Komoran(userdict=경로)

각 형태소 사전별 형태소 표기 방법 및 기준의 차이가 존재


03 soynlp

사전 기반의 단어 처리의 경우, 미등록 단어 문제가 발생할 수 있음

ex) 보코하람 테러로 소말리아에서 전쟁이 있었어요

꼬꼬마 기준 추출된 명사 : [보, 보코, 코, 테러, 소말리, 전쟁]

OKT 기준 추출된 명사 : [보코하람, 테러, 소말리아, 전쟁]

⇒ soynlp는 학습 데이터 내 자주 발생하는 패턴을 기반으로 단어의 경계선을 구분

 

단어는 연속으로 등장하는 글자의 조합이며 글자 간 연관성이 높다는 가정

한국어 어절은 좌-우 구조로 2등분 할 수 있다

from soynlp.utils import DoublespaceLineCorpus
from soynlp.word import WordExtractor
from soynlp.noun import LRNounExtractor_v2

train_data = DoublespaceLineCorpus(학습데이터의 경로) #데이터 기반 패턴 학습

noun_extractor = LRNounExtractor_v2()
nouns = noun_extractor.train_extract(train_data) #[할리우드, 모바일 게임 ...] #nouns

word_extractor = WordExtractor()
words = word_extractor.train_extract(train_data) #[클린턴, 트럼프, 프로그램 ...]
#words

04 문장 유사도

문장 간 유사도는 공통된 단어 혹은 의미를 기반으로 계산

 

자카드(Jaccard) 지수 : 문장 간 공통된 단어의 비율로 문장 간 유사도를 정의, 0~1 사이

문장 1과 문장 2의 유사도 = (두 문장 내 공통된 단어의 종류) / (두 문장 내 모든 단어의 종류)

 

코사인 유사도 : 문장 벡터 간의 각도를 기반으로 계산

A = [1, 3], B = [0,2]

 

*사진 출처 : 엘리스 코딩

⇒ 벡터 간의 각도는 벡터 간 내적을 사용해서 계산

유클리드 거리와 같은 다양한 거리 지표가 존재하나 코사인 유사도는 고차원의 공간에서 벡터 간의 유사성을 잘 보존하는 장점이 있음


<2> 모델 심화 : LSTM과 GRU

 

01 LSTM

Vanilla RNN의 기울기 소실 문제를 해결하고자 등장

Long Short Term Memory → 장기 의존성과 단기 의존성을 모두 기억할 수 있다는 의미

새로 계산된 hidden state를 입력으로 사용

Cell State : 기울기 소실 문제를 해결하기 위한 핵심 장치, 장기적으로 기억할 정보를 조절

게이트 : 3종류의 게이트를 4개의 FC layer로 구성

 

*사진 출처 : 엘리스 코딩 (차례대로 forget gate, input gate, output gate)

 

1. Forget gate : 기존 cell state에서 어떤 정보를 잊을지 결정하는 게이트

sigmoid, concatenate ( [1 2 3]과 [4 5 6]을 concatenate하면 [1 2 3 4 5 6]

 

2. Input gate: 현재 입력 받은 정보에서 어떤 것을 cell state에 저장할 지 결정

*새로운 cell state : forget gate와 Input gate의 정보를 통해 cell state 갱신

hadamard 곱! (원소 별로 곱하는 연산)

 

3. Output gate: 다음 hidden state와 출력값을 계산 - 새로 계산된 cell state를 사용


02 GRU

Gated Recurrent Unit의 약자

LSTM이 가지는 3개의 게이트를 2개로 간소화하고 Cell State를 없앰

-파라미터 수가 감소하여 LSTM보다 빠른 학습 속도를 가짐

-그럼에도 성능은 일반적으로 LSTM과 비슷함

*사진 출처 : 엘리스 코딩

2종류의 게이트를 2개의 FC Layer로 구성

W_r: 리셋 게이트

W_z: 업데이트 게이트

  1. 리셋 게이트 : 기존 hidden state의 정보를 얼마나 초기화할지 결정하는 게이트
  2. 업데이트 게이트 : 기존 hidden state의 정보를 얼마나 사용할지 결정하는 게이트

새로운 hidden state 계산 : reset gate의 결과를 통해 새로운 hidden state의 후보를 계산, update gate의 정보만이 새로운 hidden state 계산에 사용됨

⇒ update gate가 LSTM의 망각게이트와 입력 게이트를 하나로 합친 것과 유사한 역할


03 RNN 모델 활용

RNN/LSTM/GRU 모델은 회귀 분석과 분류 작업에 모두 활용 가능

회귀 분석 : 각 시점의 출력값이 어느 정도일지 예측, 주가 예측, 기온 예측

분류 작업 : 각 시점의 데이터가 어느 클래스일지 예측, 문장에서 다음 단어 예측, 각 단어의 품사 예측

모델 학습을 위한 손실 함수의 계산

 

각 시점별 예측값과 실제값을 통해 시점 별 손실 함수 값 계산 → L_t

L_t를 모두 더하여 최종 손실 값을 계산함

 

회귀 분석의 손실 함수 : Mean Squared Error(MSE)

분류 작업의 손실 함수 : Cross Entropy

 

'Heute lerne ich > AI' 카테고리의 다른 글

[엘리스] 문서 유사도 및 언어 모델  (0) 2023.09.28
[엘리스] 모델 학습 및 서비스  (0) 2023.09.28
[엘리스] 자연어 처리  (0) 2023.09.14