본문 바로가기

자연어 처리

JinCoding 실무형 NLP Course 3강: 문서 검색 시스템 예제

문서 검색 시스템 예제 

 

[2] 컴퓨터는 언어를 어떻게 이해할까?

  • Embedding

[BONUS] 벡터 , numpy를 사용한 기본 연산

 

[3] 문서 검색 시스템 개발

  • SentenceBERT
  • Streamlit(web application)

 

 

상사님 : 검색 시스템 개발해봐

 

주피터노트북 실험한걸 주면 별로 안좋아하심

내가 혼자 실험 용도로 

내가 누군가에게 서비스를 보여주려면 웹 애플리케이션으로 

보여드리는게 좋다 

 

잘하는 사람들은 역시 서비스 단위로 기획을 하는구나 .. 

 

Embeddings

 

  1. Word2Vec

1-1) Skip-gram

“나 (target) 를 보고 주변 단어(context)를 맞춰봐

 

  • Context : 주변 단어
  • Target : 중심 단어
  • Window size : 주변 단어 개수
  • Context 개수 = window size * 2

나를 보고 주변 단어를 맞춰.!

 

1-1) Skip -gram

“ 하루 커피 최소 3잔은 마셔야 살 수 있어.”

-window size :2

  • Target : “3잔은”
  • Context : “커피”, “최소”, “마셔야”, “살”

 

정답 레이블에 대해 원핫인코딩을 수행해준다. 

Error = Actual Target - Model Prediction 

파라미터를 업데이트한다.

주변 단어의 “순서” 고려 X

주변 단어의 순서는 고려하기 어렵고 학습하기 어려움 

Hidden layer = parameter ?

 

Source : https://jalammar.github.io/illustrated-word2vec/

 

학습데이터셋 구성

(입력값, 출력값)

(3잔은, 커피)

(3잔은, 최소)

(3잔은, 마셔야)

(3잔은, 살)

 

 

 

 

CBOW 

“ 주변 단어(context)를 보고 나 (target)를 맞춰봐”

“ 하루 커피 최소 3잔은 마셔야 살 수 있어.”

  • 특징

학습 데이터셋

  • 주변 단어를 보고 나를 맞춘다 

(입력값, 출력값)

(커피, 3잔은)

(최소, 3잔은)

(마셔야, 3잔은)

(살, 3잔은)

 

대게 Wod2vec은 Skip-gram을 선호 

  • 학습할 데이터가 많아짐 -> 복잡도가 높아짐 
  • Word2Vec은 Embedding Matrix와 Context Matrix로 구성됨

 

Word2vec 

  • Skip-gram 모델의 단점
    • weight의 크기가 큼 (이전 예제에서만 300x1000x2 = 6백만)
    • 데이터셋이 큼
    • 따라서 학습시간이 오래 걸림
    • 제안1. Subsampling Frequent Words
    • 자주 등장하는 단어를 코퍼스에서 제거함. 따라서 학습 데이터셋에 단어 등장 빈도를 줄임
    • 제안2. Negative  Sampling(오답만듬) (Skip-gram Negative Sampling; SKNS)
    • Logistic Regression task로 변형 (softmax -> sigmoid) + negative sampling (노이즈 추가)해 복잡도 감소
    • 3잔은 -> 커피 (맞습니다 : 1) 3잔은 -> 주스 (아닙니다 : 0), 3잔은 -> 물 (아닙니다: 0)  (단순 이진분류로 바꿈)
    • 학습 과정에서 Embedding Matrix , Context Matrix를 업데이트
    • Embedding Matrix를 word embedding으로 사용함
    • Dot product : 벡터간의 dot product를 하면 -> 스칼라 값이 나옴 (곱하고 더해주는것 = dot product) 
    • Hyperparameter 
    • Window size (context : (window_size-1 ) /2 )
    • #negative samples (1이냐 0이냐가 몇개) 
    • 데이터셋 규모 작아지면 : 5~10 / 데이터셋 규모 크면 : 2~5
    • Embedding size (벡터가 몇차원일지 설정 ) -> 크면 클수록 학습속도가 느림 

 

Gensim 실습

 

Conda activate nlp

Jupyter notebook —help 

 Jupiter notebook —allow-root —no-browser —port 8889 

Pip install gensim

 

 

[BONUS] 벡터, numpy를 사용한 기본 연산

Vector (linear algebra)

  • Magnitude (값)
  • Direction (차원)

2차원 : matrix 

Source : https

 

Vector (computer science)

  • 1 dimensional array
  • Shape : 각 dimension 

 

 

[BONUS] 벡터, numpy를 사용한 기본 연산 (보통 L2를 많이 사용함)

Vector norm (L2)

= vector 크기 또는 길이

 

 

Dot product 

 a1b1 + a2b2 + a3b3 

= |a||b| cos 

= 벡터와 벡터의 유사도를 측정할 때 cosine similarity를 사용함

어떤 문서의 유사도, 클러스터링 -> 단어 문장 유사도 , 단어 길이 찾기 위해 많이 쓰임

 

비주얼 벡터 

geogebra.org/m/Yu6869By

 

 

[BONUS[ 벡터 numpy를 사용한 기본 연산

Cosine distance

= 1 - cosine similarity

 

Cosine similarity = 1 -> distance = 0

Cosine similarity = 0 -> distance = 1

Cosine similarity = -1 -> distance = 2

 

1000억개 뉴스 토큰 등을 공개하고 학습했다고함

300개 단어와 딕셔너리가 들어있음 

공개한다 이거 써

https://code.google.com/archive/p/word2vec/

 

[2] 컴퓨터는 언어를 어떻게 이해할까 ?

Embeddings 

  1. Pre-trained model (BERT: Bidirectional Encoder Representation of 

 

  1. MLM (Masked Language Model)
  • Bidirectional
  • 만약 문장내 모든 단어를 본다면 ?

  1. Next Sentence Prediction
  • 두 문장 사이의 관계 학습

 

정답과 예측값을 비교해서 차이가 너무 크면 다시 back-propagatioin 해서 업데이트 한다

 

Pre-trained model (BERT)

  1. MLM (Masked Language Model)
  • Mask 를 씌운다
  • 앞에 있는 단어로만 학습하지 않는게 아니라 뒤에 있는 단어도 학습한다 bidirectional 

 

  1. NSP (next Sentence Prediction)
  • GPT는 이런게 없음
  • Binary classification으로 풉니다
  • Semi-supervised -> 사람이 레이블한게 맞아 ? 
  • Negative data도 만들어야함 -> 학습에 활용 
  • 금융 코퍼스 가져와서 금융 Bert 만들고
  • 뷰티 버트를 만들고 싶으면 뷰티 Bert를 만들고

 

Source: https://jalammar.github.io/Illustrated-bert 

 

[3] 문서 검색 시스템 개발 

SentenceBERT 

 

Fixed-size sentence vector 

 

문장 A와 문장 B가 유사한가 

하나의 모델의 문장 2개 인풋으로 넣고 매번 버트 모델이 넣어서 유사도를 비교하기 어려움 

Ex) A와 B 비교, A와 C 비교 .. 어려움..

 

Bert는 워드벡터가 있음

토큰1 부터 토큰 n 

문장에 대한 고정된 벡터를 만들면 너무 편하지 않을까 ?

몇 초마다 새로운 문서가 계속 업데이트 됨 

문서를 벡터화 함 

찐코딩 야식 벡터 유사한 문서를 가져올 수 있지 않을까

비슷한 문장 거리를 계산할 수 있을까 ?

문서간의 유사도, 키워드 간의 유사도를 개발할 것이다

 

Sham network -> 파라미터가 동일하다 

학습을 할때 똑같은 파라미터를 가진, 파라미터를 공유하는 것을 가져옴 

얘네들의 유사도를 본다고 할때, supervised learning이기 떄문에

같으면 0, 다르면 1, 정답 유사도간의 비교를 해서 업데이트를 한다

 

둘 안의 파라미터는 공유된다 

새로운 벡터를 만들게 된다. 또 다른 벡터를 만든 다음에 

레이어가 하나 있는 classifier에 넣어서 예측하는 모델 

조합해서 하는 모델이 sentence 모델인 것이다 

 

Softmax 2개 3개 4개 클래스 모두 가능 

Shape 인풋 전체를 넣는다 전체와 더하면 1이 됨

 

Sigmoid 전체 확률 값을 고려하지 않음

타겟에 위치에 있는 인덱스만 들어간다 

 

Pip install datasets

hugginface.co/datasets/ag_news 에서 label 값을 가져온다 

 

 

벡터의 연산은 GPU가 CPU보다 빠르다 

 

Bert.

 

Pip install sentence_transformers

 

streamlit

웹 어플리케이션을 빠르게 만들 수 있는 UI 사이트 

pip install streamlit

 

setenceBERT 코드 일부

 

streamlit run main.py

 

numpy.argsort() : 오름차순한 value의 인덱스를 가져와줘 

pickle 라이브러리를 통해 바이너리 파일을 바로 저장할 수 있음

 

임베딩으로 풀수 있는 문제들이 많다 

'자연어 처리' 카테고리의 다른 글

자연어처리_챗봇_23-08-14  (0) 2023.08.14
자연어처리_챗봇_23-08-11  (0) 2023.08.14
자연어처리_챗봇_23-08-09  (2) 2023.08.10
자연어처리_챗봇구축_23-08-08  (0) 2023.08.08
자연어처리_챗봇구축_230807  (0) 2023.08.07