[NLP] Bag of Words & Word Embedding

Jeonghyun·2022년 10월 12일
0

NLP

목록 보기
1/8

Trend of NLP
Word2Vec or GloVe → RNN(LSTMs and GRUs) → Transformer → self attention models(BERT, GPT-3...)

Bag-of-Words Representation

  1. 여러 문장의 unique한 단어들을 vocabulary로 constructing
  2. unique words를 one-hot vector로 인코딩
    ex) {"John","loves","movie"}
    John : [1 0 0], loves : [0 1 0], movie : [0 0 1]
  3. 각 문장은 one-hot vector의 합으로 표현
    "John loves movie movie" : [1 1 2]
  4. document를 d, class를 c, consists of a sequence of words를 w
    P(dc)P(c)=P(w1,w2,...,wnc)P(c)p(c)wiWP(wic)P(d|c)P(c) = P(w_1,w_2,...,w_n|c)P(c) → p(c) \prod_{w_i\in W}P(w_i|c)

KoNLPy - Hannanum, KKma : 문장의 품사 분석
Khaiii : 카카오 CNN기반 한국어 형태소 분석기
PyKoSpacing : GRU와 CNN을 사용한 띄어쓰기 전처리기

네*이버 맞춤법 검사기 기반 Py-Hanspell

!pip install git+https://github.com/ssut/py-hanspell.git

from hanspell import spell_checker

sent = "맞춤법 틀리면 외 않되? 쓰고싶은대로쓰면돼지 "
spelled_sent = spell_checker.check(sent)

hanspell_sent = spelled_sent.checked
print(hanspell_sent)

Word Embedding

Word2Vec & GloVe
Word2Vec과 GloVe는 하나의 차원에 단어의 모든 의미를 표현하는 one-hot-encoding과 달리 단어의 distributed representation을 학습하고자 고안된 모델

  • 3차원 공간상의 단어마다 한 점을 부여
  • 비슷한 단어가 비슷한 좌표상에 맵핑되도록 함(유사할수록 short distance)

Word2Vec

  • 같은 문장에서 단어들이 특정한 유사성을 갖는다고 생각
  • 한 target 단어의 의미를 주변 단어들에 의해 알 수 있음
  • target 단어 주변의 단어들의 확률분포를 예측
  1. 문장의 unique vocabulary를 만듦
  2. 각 단어들의 one-hot vector 형성
  3. 각 단어별로 중심단어라 했을 때 주변 단어 하나씩 쌍을 만듦 (sliding window)
  • 내적은 벡터들의 유사도를 나타내는 과정 👉 좌표 평면 상에서 내적은 코사인이므로 내적값의 상향은 유사도를 높힘
  • 입력 단어의 W1상의 벡터, 출력 단어의 w2상의 벡터 간 내적에 기반한 유사도가 커지도록
  • 다른 단어들의 w2상 벡터간 내적은 작게 하도록 조정해가며 학습을 진행

GloVe

  • 입,출력 단어쌍들에서 학습 데이터 상의 window 내에 총 몇 번 등장했는지를 미리 계산하여 log를 취한 뒤 입출력 embedding vector의 내적에서 빼줌
    J(θ)=12i,j=1Wf(Pij)(uiTvjlogPij)2J(\theta) = \frac{1}{2}\sum_{i,j=1}^W f(P_{ij})(u_i^Tv_j - logP_{ij})^2
  • 미리 계산함으로써 학습 중 중복된 계산의 횟수를 줄여줌
  • 상대적으로 Word2Vec보다 빠르게 학습 진행

nn.Embedding(num_embeddings, embedding_dim)

# 3 차원짜리 임베딩 10개 생성
embedding = nn.Embedding(10, 3)

# [1, 2, 4, 5], [4, 3, 2, 9]에 대한 임베딩 값 구하기
input = torch.LongTensor([[1,2,4,5],[4,3,2,9]])
embedding(input)

>>> # 3차원 공간 상에서 1,2,3,4,5,9의 상대적 위치를 나타내는 듯?
tensor([[[-0.0251, -1.6902,  0.7172],
         [-0.6431,  0.0748,  0.6969],
         [ 1.4970,  1.3448, -0.9685],
         [-0.3677, -2.7265, -0.1685]],

        [[ 1.4970,  1.3448, -0.9685],
         [ 0.4362, -0.4004,  0.9400],
         [-0.6431,  0.0748,  0.6969],
         [ 0.9124, -2.3616,  1.1151]]])

LaBSE (Language-agnostic BERT Sentence Embedding) 다국어 임베딩
: 서로 다른 언어의 두 문장 간 유사도가 높은 문장끼리 매칭

💡 토큰화(tokenization)는 무엇인가요?


토큰화는 주어진 입력 데이터를 자연어처리 모델이 인식할 수 있는 단위로 변환해주는 방법입니다.


💡 단어 단위 토큰화(word tokenization)는요?


단어단위 토큰화의 경우 "단어"가 자연어처리 모델이 인식하는 단위가 됩니다. "I have a meal"이라고 하는 문장을 가지고 단어 단위 토큰화를 하면 다음과 같습니다.
['I', 'have', 'a', 'meal']


영어의 경우 대부분 공백(space)을 기준으로 단어가 정의되기 때문에 .split()을 이용해 쉽게 단어 단위 토큰화를 구현할 수 있습니다. 특히, 영어에서 공백을 기준으로 단어를 구분한 단어 단위 토큰화는 공백 단위 토큰화 (space tokenization)이라고도 할 수 있습니다.




출처 - 부스트캠프 AI tech 교육자료


[부스트캠프 AI Tech] Week 4 - Day 2

0개의 댓글