语义很重要,因为在NLP中,这是正在研究的单词之间的关系。最简单但最有效的过程之一是连续的单词袋(CBOW),将单词映射到称为单词向量的高度有意义的向量。 CBow在Word2Vec框架中使用,并根据与之相邻的单词预测一个单词,该单词捕获了语言的语义和语法含义。在本文中,读者将了解CBOW模型的操作以及其使用方法。
连续的单词袋(CBOW)也是一种模型,它在使用神经网络确定嵌入单词时使用,并且是Tomas Mikolov的Word2Vec模型的一部分。 CBow试图根据给定句子观察的上下文单词预测目标词。这样,它就能捕获语义关系,因此在高维空间中密切表示近距离表示。
例如,在“猫坐在垫子上”的句子中,如果上下文窗口大小为2,则“ sat”的上下文单词是[“”,“”,“ cat”,“ on”,“ the”] ,并且该模型的任务是预测“ sat”一词。
CBOW通过汇总上下文单词(例如,平均嵌入)并使用此汇总表示来预测目标单词来运行。该模型的体系结构涉及上下文单词的输入层,用于嵌入生成的隐藏层以及使用概率分布预测目标单词的输出层。
这是一个适合处理频繁单词的快速高效模型,非常适合需要语义理解的任务,例如文本分类,推荐系统和情感分析。
CBow是根据上下文的最简单,有效的技术之一,用于单词嵌入,其中整个单词的词汇映射到向量。本节还将CBOW系统的操作描述为在其最基本的层面上理解该方法的一种手段,讨论了基于CBOW方法的主要思想,并为CBOW命中计算系统的架构布局提供了综合指南。
CBow依靠两个关键概念:上下文单词和目标词。
通过分析上下文与大型语料库中的目标单词之间的关系,CBOW生成嵌入,以捕获单词之间的语义关系。
这是CBOW工作原理的细分,分步:
基于词汇大小,将上下文单词和目标单词转换为单热矢量。对于大小5的词汇,“爱”一词的单次表示可能看起来像[0、1、0、0、0、0] 。
通过嵌入层传递单热编码的上下文单词。该层将每个单词映射到密集的向量表示,通常比词汇大小较低。
汇总所有上下文单词的嵌入(例如,平均或求和它们)形成单个上下文向量。
重复语料库中所有上下文目标对的过程,直到模型收敛为止。
连续的单词(CBOW)模型架构旨在根据其周围上下文单词进行预测目标单词。它是一个具有直接但有效结构的浅神经网络。 CBOW架构由以下组件组成:
输入:
句子: “我爱机器学习” ,目标词: “机器” ,上下文词: [“我”,“爱”,“学习”] 。
单速编码:
词汇: [“我”,“爱”,“机器”,“学习”,“ AI”]
嵌入层:
嵌入:
聚合:
输出层:
输入层:[“ i”,“ love”,“学习”] - >一式编码 - >嵌入层 - >密集的嵌入 - >汇总上下文向量 - >完全连接的层Softmax 输出:预测单词“机器”
现在,我们将浏览Python中从头开始实施CBOW模型。
第一个尖峰是将文本转换为代币,将文字与上下文对键对面生成的单词与上下文作为包含目标单词的单词。
copus =“快速棕狐跳过懒狗” colpus = colpus.lower()。split()#tokenization和lowercase转换 #定义上下文窗口大小 C = 2 context_target_pairs = [] #生成上下文目标对 对于我的范围(c,len(corpus) - c): context = copus [i -c:i] copus [i 1:i c 1] target = copus [i] context_target_pairs.append(((上下文,目标))) print(“上下文 - 目标对:”,context_target_pairs)
输出:
上下文目标对:[([['the','quick','fox',跳跃'],'brown'),(['quick'','','brown','''','off''],'fox'),(['brown'','fox'over'over'over'off'' “超过”,“懒惰”,“狗”],“'')]]
我们构建了一个词汇(独特的单词集),然后将每个单词映射到唯一的索引,反之亦然,以期在训练过程中进行有效的查找。
#创建词汇并将每个单词映射到索引 vocab = set(语料库) word_to_index = {word:idx for IDX,枚举(vocab)中的字}} index_to_word = {idx:Word Word,word_to_index.items()}中的idx 打印(“ word to Index字典:”,Word_to_index)
输出:
单词到索引字典:{'brown':0,'dog':1,'quick':2,'跳跃':3,'fox':4,'over':5,'the':6,'lazy':7}
单速编码作品是通过将单词形成系统中的每个单词转换为向量的,其中该单词的指标为“ 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 = [one_hot_encode(word,word_to_index)for ['the'the','quick']]中的字 print(“'quick''的单速编码:”,context_one_hot [1])
输出:
单速编码为“快速”:[0。 0。1。0。0。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向前(self,context_words): #计算隐藏层(上下文单词的平均值) h = np.mean(context_words,axis = 0) #计算输出层(SoftMax概率) 输出= np.dot(h,self.w2) 返回输出 向后def(self,context_words,target_word,Learning_rate = 0.01): #正向通行证 h = np.mean(context_words,axis = 0) 输出= np.dot(h,self.w2) #计算错误和梯度 错误= 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 = [one_hot_encode(word,word_to_index)for ['the'the','quick','fox','跃跳']中的字 context_words = np.array(context_words) context_words = np.mean(context_words,axis = 0)#普通上下文单词 target_word = one_hot_encode('brown',word_to_index) #向前通过CBOW模型 输出= cbow_model.forward(context_words) 打印(“ CBOW向前通行证的输出:”,输出)
输出:
CBOW向前通行证的输出:[[-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.177773069 -0.02340574 -0.22222151 -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通过定义使用嵌入层来学习单词表示和输出密集层的神经网络来简化过程,并使用上下文单词预测目标单词。
导入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呼叫(self,context_words): embedded_context = self.embeddings(context_words) context_avg = tf.reduce_mean(embedded_context,axis = 1) 输出= 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) #正向通行证 输出=模型(context_input) 打印(“ Tensorflow Cbow型号的输出:”,output.numpy())
输出:
TensorFlow CBOW模型的输出:[[0.12362909 0.12616573 0.12758036 0.12601459 0.12477358 0.1237749 0.1231998 0.12486169]]]
Gensim在Word2Vec()函数中提供了现成的CBOW实现,其中无需在培训上劳动,因为Gensim训练文本语料库的单词嵌入。
导入Gensim 来自Gensim.models导入Word2vec #准备数据(单词列表列表) copus = [[“”,“ Quick”,“ Brown”,“ Fox”],[“跳”,“ Over”,“ The”,“ lazy”,“ dog”]] #使用CBOW训练Word2Vec型号 model = word2vec(colpus,vector_size = 5,window = 2,min_count = 1,sg = 0) #获取单词的向量表示 vector = model.wv ['fox'] 打印(“'fox'的向量表示:”,向量)
输出:
“福克斯”的矢量表示:[-0.06810732 -0.01892803 0.11537147 -0.15043275 -0.07872207]
现在,我们将探索连续袋的优势:
现在让我们讨论CBOW的局限性:
事实证明,连续的单词(CBOW)模型是通过利用周围环境来生成单词嵌入的一种有效而直观的方法。通过其简单而有效的架构,Cbow弥合了原始文本和有意义的向量表示之间的差距,从而实现了广泛的NLP应用程序。通过了解CBOW的工作机制,其优势和局限性,我们可以更深入地了解NLP技术的发展。 Cbow凭借其在嵌入生成中的基本作用,继续成为探索先进语言模型的垫脚石。
答:CBOW使用上下文单词预测目标单词,而Skip-gram则使用目标单词预测上下文单词。
Q2:为什么CBOW计算速度比Skip-gram快?答:CBOW同时处理多个上下文单词,而跳过gram独立评估每个上下文单词。
Q3:CBOW可以有效处理稀有单词吗?答:不,Skip-gram通常更好地倾向于学习稀有词的学习表示。
Q4:CBOW中嵌入层的作用是什么?答:嵌入层将稀疏的单热矢量转化为密集的表示形式,从而捕获单词语义。
Q5:CBOW今天仍然有意义吗?答:是的,尽管存在像伯特这样的新模型,但CBOW仍然是单词嵌入中的基础概念。
以上是了解连续的单词袋(CBOW)的详细内容。更多信息请关注PHP中文网其他相关文章!