<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로 구성
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: 업데이트 게이트
- 리셋 게이트 : 기존 hidden state의 정보를 얼마나 초기화할지 결정하는 게이트
- 업데이트 게이트 : 기존 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 |