Semantics는 NLP에서는 연구중인 단어 간의 관계이기 때문에 중요합니다. 가장 간단하지만 매우 효과적인 절차 중 하나는 단어를 Word 벡터라고하는 매우 의미있는 벡터에 맵핑하는 연속적인 Word (Cbow)입니다. CBOW는 Word2Vec 프레임 워크에 사용되며 언어의 구문 적 의미뿐만 아니라 의미를 포착하는 단어에 근거한 단어를 예측합니다. 이 기사에서 독자는 CBOW 모델의 작동과 그 사용 방법에 대해 배울 것입니다.
연속적인 단어 백 (cbow)은 또한 신경망을 사용하여 단어 임베딩을 결정할 때 사용되는 모델이며 Tomas Mikolov의 Word2Vec 모델의 일부입니다. Cbow는 주어진 문장에서 그것을 관찰하는 컨텍스트 단어에 따라 대상 단어를 예측하려고합니다. 이렇게하면 의미 론적 관계를 포착 할 수 있으므로 고 차원의 공간에서 밀접한 단어가 밀접하게 표시됩니다.
예를 들어, “고양이가 매트에 앉아 앉아있는” 문장에서, 컨텍스트 창 크기가 2 인 경우, “sat” 의 컨텍스트 단어는 [“The”,“Cat”,“On”,“The”] 이며 모델의 작업은 “sat”이라는 단어를 예측하는 것입니다.
CBOW는 컨텍스트 단어를 집계하고 (예 : 임베딩 평균) 집계 하고이 집계 표현을 사용하여 대상 단어를 예측하여 작동합니다. 모델의 아키텍처에는 컨텍스트 단어에 대한 입력 계층, 임베딩 생성을위한 숨겨진 레이어 및 확률 분포를 사용하여 대상 단어를 예측하기위한 출력 레이어가 포함됩니다.
텍스트 분류, 권장 시스템 및 감정 분석과 같은 의미 론적 이해가 필요한 작업에 이상적이고 효율적인 모델로서 빠르고 효율적인 모델입니다.
Cbow는 단어의 전체 어휘가 벡터에 매핑되는 단어 임베딩에 대한 컨텍스트에 따라 가장 간단하지만 효율적인 기술 중 하나입니다. 이 섹션에서는 CBOW 시스템의 작동을 가장 기본적인 수준에서 방법을 이해하는 수단으로 설명하고 CBOW 방법을 뒷받침하는 주요 아이디어를 논의하고 CBOW 히트 계산 시스템의 아키텍처 레이아웃에 대한 포괄적 인 안내서를 제공합니다.
Cbow는 컨텍스트 단어와 대상 단어의 두 가지 주요 개념에 의존합니다.
Cbow는 대구에서 문맥과 대상 단어 간의 관계를 분석함으로써 단어 간의 의미 론적 관계를 포착하는 임베딩을 생성합니다.
다음은 Cbow의 작동 방식에 대한 분석입니다. 단계별 :
어휘 크기에 따라 컨텍스트 단어와 대상 단어를 한 번의 벡터로 변환하십시오. 크기 5의 어휘의 경우, "사랑"이라는 단어의 원격 표현은 [0, 1, 0, 0, 0] 처럼 보일 수 있습니다.
임베딩 층을 통해 원 호트 인코딩 된 컨텍스트 단어를 전달하십시오. 이 층은 각 단어를 조밀 한 벡터 표현, 일반적으로 어휘 크기보다 더 낮은 차원입니다.
단일 컨텍스트 벡터를 형성하기 위해 모든 컨텍스트 단어의 임베딩 (예 : 평균화 또는 합산)의 임베딩을 집계하십시오.
모델이 수렴 될 때까지 코퍼스의 모든 컨텍스트 표적 쌍에 대한 프로세스를 반복하십시오.
CBOW (Continuous Bag of Word) 모델의 아키텍처는 주변 컨텍스트 단어를 기반으로 대상 단어를 예측하도록 설계되었습니다. 간단하지만 효과적인 구조를 가진 얕은 신경망입니다. Cbow 아키텍처는 다음 구성 요소로 구성됩니다.
입력 :
문장 : “나는 기계 학습을 좋아한다” , 대상 단어 : “기계” , 맥락 단어 : [“I”,“Love”,“Learning”] .
일대일 인코딩 :
어휘 : [“나”,“사랑”,“기계”,“학습”,“ai”]]]
임베딩 레이어 :
임베딩 :
집계 :
출력 레이어 :
입력 계층 : [ "I", "Love", "Learning"]]] -> 한 가지 인코딩 -> 임베딩 레이어 -> 조밀 한 임베딩 -> 집계 된 컨텍스트 벡터 -> 완전히 연결된 레이어 SoftMax 출력 : 예측 된 단어 "machine"
이제 Python에서 Cbow 모델을 처음부터 구현할 것입니다.
첫 번째 스파이크는 텍스트를 토큰으로 변환하는 것입니다. 단어는 대상 단어가 포함 된 단어로 컨텍스트를 가진 컨텍스트 표적 쌍으로 생성되는 단어입니다.
코퍼스 = "빠른 갈색 여우가 게으른 개를 뛰어 넘는다" Corpus = corpus.lower (). split () # 토큰 화 및 소문자 변환 # 정의 컨텍스트 창 크기 c = 2 context_target_pairs = [] # 컨텍스트-표적 쌍을 생성합니다 IN RANGE (C, LEN (Corpus) -C)의 경우 : 문맥 = 코퍼스 [i -c : i] 코퍼스 [i 1 : i c 1] 대상 = 코퍼스 [i] context_target_pairs.append ((컨텍스트, 대상)) print ( "Context-target 쌍 :", context_target_pairs)
산출:
문맥-표적 쌍 : [[ 'The', 'Quick', 'Fox', 'jumps'], 'brown'), 'brown'), ([ 'Quick', 'Brown', 'Jumps', 'Over', 'Fox'), 'fox'), 'fox'), 'fox'), 'fox', 'over', ''], ''fox ',' '', '', ',', ',' ',' ',' ',' ',' ',' ',' ',' ',' ' 'Over', 'Lazy', 'Dog'], 'The')]]]
우리는 어휘 (고유 한 단어 세트)를 구축 한 다음 각 단어를 고유 한 색인에 매핑하고 교육 중 효율적인 조회를 위해 그 반대도 마찬가지입니다.
# 어휘 생성 및 각 단어를 색인에 매핑하십시오. 어휘 = 세트 (코퍼스) Word_to_index = {Word : idx에 대한 idx, enumerate (vocab)}} index_to_word = {idx : Word의 Word, idx in Word_to_index.items ()} print ( "인덱스 사전으로 단어 :", word_to_index)
산출:
인덱스 사전 : { 'brown': 0, 'dog': 1, 'Quick': '2,'Jumps ': 3,'Fox ': 4,'Over ': 5,'The ': 6,'Lazy ': 7}
단어 형성 시스템에서 각 단어를 벡터로 변환하여 하나의 hot 인코딩은 단어의 표시기가 '1'인 반면 나머지 장소는 '0'을 취합니다.
def one_hot_encode (Word, Word_to_index) : ONE_HOT = np.zeros (len (word_to_index)) ONE_HOT [Word_to_index [Word]] = 1 one_hot을 반환하십시오 # "빠른"단어의 예제 예제 context_one_hot = [ 'the', 'quick']에서 Word의 경우 [one_hot_encode (Word, Word_to_index)]]] print ( "Quick '을위한 원본 인코딩 :", context_one_hot [1])
산출:
'Quick'에 대한 원호 인코딩 : [0. 0. 1. 0. 0. 0. 0.]
이 단계에서는 두 개의 계층이있는 기본 신경망을 만듭니다. 하나는 단어 임베딩을위한 것과 다른 하나는 컨텍스트 단어를 기반으로 출력을 계산하여 컨텍스트를 평균화하고 네트워크를 통해 전달합니다.
클래스 Cbow : def __init __ (self, vocab_size, embedding_dim) : # 임베딩 및 출력 레이어에 대한 가중치를 무작위로 초기화합니다. self.w1 = np.random.randn (vocab_size, embedding_dim) self.w2 = np.random.randn (embedding_dim, vocab_size) def forward (self, context_words) : # 숨겨진 레이어 계산 (컨텍스트의 평균 단어) h = np. mean (context_words, axis = 0) # 출력 계층 계산 (SoftMax 확률) 출력 = np.dot (h, self.w2) 반환 출력 Def Backward (self, context_words, target_word, learning_rate = 0.01) : # 포워드 패스 h = np. mean (context_words, axis = 0) 출력 = np.dot (h, self.w2) # 오류 및 그라디언트를 계산합니다 ERROR = target_word- 출력 self.w2 = Learning_rate * np.outer (h, 오류) self.w1 = Learning_rate * np.outer (context_words, 오류) # cbow 객체 생성의 예 vocab_size = len (word_to_index) embedding_dim = 5 # 5 차원 임베딩을 가정 해 봅시다 cbow_model = cbow (vocab_size, embedding_dim) # 랜덤 컨텍스트 단어 및 대상 사용 (예로) context_words = [ '', 'Quick', 'Fox', 'Jumps']의 Word에 대한 [one_hot_encode (Word, Word_to_index)]]]]] context_words = np.array (context_words) context_words = np.mean (context_words, axis = 0) # 평균 컨텍스트 단어 target_word = one_hot_encode ( 'brown', word_to_index) # CBOW 모델을 통해 전진합니다 output = cbow_model.forward (context_words) print ( "Cbow Forward Pass의 출력 :", 출력)
산출:
Cbow Forward Pass의 출력 : [[-0.20435729 -0.23851241 -0.08105261 -0.14251447 0.20442154 0.14336586 -0.06523201 0.0255063] [-0.0192184 -0.12958821 0.1019369 0.11101922 -0.17773069 -0.02340574 -0.2222151 -0.23863179] [0.21221977 -0.15263454 -0.015248 0.27618767 0.02959409 0.21777961 0.16619577 -0.20560026] [0.05354038 0.06903295 0.0592706 -0.13509918 -0.00439649 0.18007843 0.1611929 0.2449023] [0.01092826 0.19643582 -0.07430934 -0.16443165 -0.01094085 -0.27452367 -0.13747784 0.31185284]]
Tensorflow는 컨텍스트 단어를 사용하여 대상 단어를 예측하기 위해 삽입 된 층을 사용하고 출력을 위해 밀도가 높은 레이어를 학습하는 신경망을 정의하여 프로세스를 단순화합니다.
텐서 플로우를 tf로 가져옵니다 # Tensorflow를 사용하여 간단한 Cbow 모델을 정의하십시오 클래스 cbowmodel (tf.keras.model) : def __init __ (self, vocab_size, embedding_dim) : Super (cbowmodel, self) .__ init __ () self.embeddings = tf.keras.layers.embedding (input_dim = vocab_size, output_dim = embedding_dim) self.output_layer = tf.keras.layers.dense (vocab_size, activation = 'softmax') DEF CALL (self, context_words) : embedded_context = self.embeddings (context_words) context_avg = tf.reduce_mean (embedded_context, axis = 1) output = self.output_layer (context_avg) 반환 출력 # 예제 사용 model = cbowmodel (vocab_size = 8, embedding_dim = 5) context_input = np.random.randint (0, 8, size = (1, 4)) # 랜덤 컨텍스트 입력 context_input = tf.convert_to_tensor (context_input, dtype = tf.int32) # 포워드 패스 output = model (context_input) print ( "Tensorflow Cbow 모델의 출력 :", output.numpy ())
산출:
Tensorflow Cbow 모델의 출력 : [[0.12362909 0.12616573 0.12758036 0.12601459 0.12477358 0.1237749 0.12319998 0.12486169]]
Gensim은 Word2Vec () 함수에서 Cbow의 기성품 구현을 제공합니다. 여기서 Gensim은 텍스트 코퍼스에서 Word Embedings를 훈련시키기 때문에 훈련에 노동 할 필요가 없습니다.
수입 세대 gensim에서 모들 import Word2Vec # 데이터 준비 (단어 목록 목록) Corpus = [[ "The", "Quick", "Brown", "Fox"], [ "점프", "Over", "The", "Lazy", "Dog"]]]]]] # cbow를 사용하여 Word2Vec 모델을 훈련시킵니다 model = word2vec (corpus, vector_size = 5, window = 2, min_count = 1, sg = 0) # 단어의 벡터 표현을 얻으십시오 벡터 = model.wv [ 'fox'] print ( "Fox '의 벡터 표현 :", 벡터)
산출:
'폭스'의 벡터 표현 : [-0.06810732 -0.01892803 0.11537147 -0.15043275 -0.07872207]
우리는 이제 연속적인 단어 가방의 장점을 탐구 할 것입니다.
이제 cbow의 한계에 대해 논의합시다.
연속적인 단어 (CBOW) 모델은 주변 컨텍스트를 활용하여 단어 임베딩을 생성하기위한 효율적이고 직관적 인 접근법으로 입증되었습니다. Cbow는 간단하면서도 효과적인 아키텍처를 통해 원시 텍스트와 의미있는 벡터 표현 사이의 간격을 연결하여 광범위한 NLP 응용 프로그램을 가능하게합니다. Cbow의 작업 메커니즘, 강점 및 한계를 이해함으로써 NLP 기술의 진화에 대한 더 깊은 통찰력을 얻습니다. Cbow는 생성을 포함시키는 기본적 역할을 통해 고급 언어 모델을 탐색하기위한 디딤돌입니다.
A : Cbow는 컨텍스트 단어를 사용하여 대상 단어를 예측하는 반면 Skip-Gram은 대상 단어를 사용하여 컨텍스트 단어를 예측합니다.
Q2 : CBOW가 Skip-Gram보다 계산적으로 빠른 이유는 무엇입니까?A : CBOW는 여러 컨텍스트 단어를 동시에 처리하는 반면 Skip-Gram은 각 문맥 단어를 독립적으로 평가합니다.
Q3 : Cbow가 희귀 단어를 효과적으로 처리 할 수 있습니까?A : 아니요, Skip-Gram은 일반적으로 희귀 단어의 학습 표현에 더 좋습니다.
Q4 : Cbow에서 삽입 층의 역할은 무엇입니까?A : 임베딩 층은 희소 한 원산지 벡터를 조밀 한 표현으로 변환하여 단어 의미를 캡처합니다.
Q5 : Cbow는 오늘날에도 여전히 관련이 있습니까?A : 그렇습니다. Bert와 같은 최신 모델이 존재하지만 Cbow는 단어 임베딩의 기본 개념으로 남아 있습니다.
위 내용은 연속적인 단어 가방 이해 (cbow)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!