NLP의 CBOW(Continuous Bag of Words)

NLP의 CBOW(Continuous Bag of Words)

컴퓨터가 쓰여진 텍스트를 이해할 수 있도록 하기 위해 단어를 수치 벡터로 표현할 수 있습니다. 이를 수행하는 한 가지 방법은 Word 임베딩을 사용하는 것입니다. 이는 단어를 숫자 벡터로 표현하는 방법입니다. 이러한 벡터는 단어의 의미와 언어의 다른 단어와의 관계를 포착합니다. 단어 임베딩은 다음과 같은 비지도 학습 알고리즘을 사용하여 생성될 수 있습니다. Word2vec, 장갑 , 또는 FastText .

Word2vec은 의미론적 의미와 관계를 포착하는 단어의 밀집된 벡터 표현인 단어 임베딩을 생성하기 위한 신경망 기반 방법입니다. Word2vec을 구현하는 데는 두 가지 주요 접근 방식이 있습니다.

    연속 단어백(CBOW)
  • 그램 건너뛰기

CBOW(Continuous Bag of Words)란 무엇입니까?

CBOW(Continuous Bag of Words)는 단어 임베딩을 생성하는 데 사용되는 인기 있는 자연어 처리 기술입니다. 단어 임베딩은 언어의 단어 간의 의미론적 및 구문론적 관계를 포착하기 때문에 많은 NLP 작업에 중요합니다. CBOW는 주변 문맥 단어를 바탕으로 목표 단어를 예측하는 신경망 기반 알고리즘입니다. 그것은 일종의 감독되지 않은 학습은 레이블이 지정되지 않은 데이터로부터 학습할 수 있음을 의미하며 감정 분석, 기계 번역과 같은 다양한 NLP 작업에 사용할 수 있는 단어 임베딩을 사전 훈련하는 데 자주 사용됩니다.

CBOW 모델의 예

CBOW 모델의 예

BoW(Bag-of-Words) 모델과 CBOW(Continuous Bag-of-Words) 모델 간에 차이점이 있습니까?

  • Bag-of-Words 모델과 Continuous Bag-of-Words 모델은 모두 컴퓨터가 읽을 수 있는 형식으로 텍스트를 표현하기 위해 자연어 처리에 사용되는 기술이지만 컨텍스트를 캡처하는 방법이 다릅니다.
  • BoW 모델은 텍스트를 주어진 문서나 말뭉치에서 단어와 빈도의 모음으로 나타냅니다. 단어가 나타나는 순서나 문맥을 고려하지 않으므로 텍스트의 전체 의미를 포착하지 못할 수 있습니다. BoW 모델은 간단하고 구현하기 쉽지만 언어의 의미를 포착하는 데에는 한계가 있습니다.
  • 이에 비해 CBOW 모델은 단어의 맥락을 포착하는 신경망 기반 접근 방식입니다. 주어진 컨텍스트 창에서 앞뒤에 나타나는 단어를 기반으로 대상 단어를 예측하는 방법을 학습합니다. 주변 단어를 고려함으로써 CBOW 모델은 주어진 맥락에서 단어의 의미를 더 잘 포착할 수 있습니다.

CBOW 모델의 아키텍처

CBOW 모델은 문맥 단어 주변의 목표 단어를 사용하여 예측합니다. 위의 예를 고려해보세요 그녀는 훌륭한 댄서입니다. CBOW 모델은 이 문구를 문맥 단어와 대상 단어의 쌍으로 변환합니다. pairings라는 단어는 다음과 같이 나타납니다. ([그녀, a], 이다), ([이다, 훌륭하다], a) ([a, 댄서], 훌륭하다) 창 크기=2입니다.

CBOW 아키텍처

CBOW 아키텍처

모델은 문맥 단어를 고려하고 대상 용어를 예측하려고 시도합니다. 4개의 1*W 입력 벡터는 하나의 목표 단어를 예측하는 데 사용되는 문맥 단어로 4개의 단어가 있는 경우 입력 레이어로 전달됩니다. 은닉층은 입력 벡터를 수신한 다음 이를 W*N 행렬로 곱합니다. 은닉층의 1*N 출력은 최종적으로 합산층에 들어가며, 여기서 벡터는 최종 활성화가 수행되기 전에 요소별로 합산되고 출력은 출력층에서 얻어집니다.

CBOW의 코드 구현

CBOW 모델을 사용하여 단어의 유사성을 보여주기 위해 단어 임베딩을 구현해 보겠습니다. 이 기사에서는 나만의 단어 모음을 정의했으며, 어떤 데이터세트라도 사용할 수 있습니다. 먼저 필요한 모든 라이브러리를 가져오고 데이터 세트를 로드합니다. 다음으로, 각 단어를 토큰화하고 이를 정수 벡터로 변환합니다.

파이썬3




import> tensorflow as tf> from> tensorflow.keras.models> import> Sequential> from> tensorflow.keras.layers> import> Dense,> > Embedding, Lambda> from> tensorflow.keras.preprocessing.text> import> Tokenizer> import> numpy as np> import> matplotlib.pyplot as plt> from> sklearn.decomposition> import> PCA> # Define the corpus> corpus> => [> 'The cat sat on the mat'> ,> > 'The dog ran in the park'> ,> > 'The bird sang in the tree'> ]> # Convert the corpus to a sequence of integers> tokenizer> => Tokenizer()> tokenizer.fit_on_texts(corpus)> sequences> => tokenizer.texts_to_sequences(corpus)> print> ('After converting our words> in> the corpus> into vector of integers:')> print> (sequences)>

산출:

After converting our words in the corpus into vector of integers: [[1, 3, 4, 5, 1, 6], [1, 7, 8, 2, 1, 9], [1, 10, 11, 2, 1, 12]] 

이제 창 크기 = 2인 CBOW 모델을 구축하겠습니다.

파이썬3




# Define the parameters> vocab_size> => len> (tokenizer.word_index)> +> 1> embedding_size> => 10> window_size> => 2> # Generate the context-target pairs> contexts> => []> targets> => []> for> sequence> in> sequences:> > for> i> in> range> (window_size,> len> (sequence)> -> window_size):> > context> => sequence[i> -> window_size:i]> +> > > sequence[i> +> 1> :i> +> window_size> +> 1> ]> > target> => sequence[i]> > contexts.append(context)> > targets.append(target)> # Convert the contexts and targets to numpy arrays> X> => np.array(contexts)> # Define the CBOW model> model> => Sequential()> model.add(Embedding(input_dim> => vocab_size,> > output_dim> => embedding_size,> > input_length> => 2> *> window_size))> model.add(Lambda(> lambda> x: tf.reduce_mean(x, axis> => 1> )))> model.add(Dense(units> => vocab_size, activation> => 'softmax'> ))> model.save_weights(> 'cbow_weights.h5'> )> # Load the pre-trained weights> model.load_weights(> 'cbow_weights.h5'> )>

다음으로 모델을 사용하여 임베딩을 시각화하겠습니다.

파이썬3




# Get the word embeddings> embeddings> => model.get_weights()[> 0> ]> # Perform PCA to reduce the dimensionality> # of the embeddings> pca> => PCA(n_components> => 2> )> reduced_embeddings> => pca.fit_transform(embeddings)> # Visualize the embeddings> plt.figure(figsize> => (> 5> ,> 5> ))> for> i, word> in> enumerate> (tokenizer.word_index.keys()):> > x, y> => reduced_embeddings[i]> > plt.scatter(x, y)> > plt.annotate(word, xy> => (x, y), xytext> => (> 5> ,> 2> ),> > textcoords> => 'offset points'> ,> > ha> => 'right'> , va> => 'bottom'> )> plt.show()>

산출:

CBOW 모델을 사용한 단어의 벡터화된 표현

CBOW 모델을 사용한 단어의 벡터화된 표현

이 시각화를 통해 임베딩을 기반으로 단어의 유사성을 관찰할 수 있습니다. 의미나 맥락이 유사한 단어는 줄거리에서 서로 가까이 있을 것으로 예상됩니다.