NLP—————word_embedding

Embedding这个词接触过深度学习的同学都不陌生,它在keras官方文档中的解释为:嵌入层将正整数(下标)转换为具有固定大小的向量。(这个解释太模糊了啊!!!)

实际上,embedding这个词来源于wordEmbedding。使用嵌入层主要有三大原因:

  • 使用onehot编码会使向量的维度很高,而且十分稀疏,假如字典包含了2000个词,那么每一个词的onehot向量表示将有2000个整数组成,其中只有一个1,其余都是0。这是十分浪费的,而且效率极低。
  • onehot编码来说,任意两个词之间都是独立的,仅仅将词进行了符号化,不含有任何语义信息,而embedding能够表达语义层面上的词汇之间的关系。
  • 在网络训练的过程中,每个嵌入的向量都会更新,能够可视化多维空间中的词与词之间的相似性。

举个栗子:deeplearning is very deep根据onehot编码:

deeplearning==>[1,0,0,0]

is==>[0,1,0,0]

very==>[0,0,1,0]

deep==>[0,0,0,1]

这个句子较短,还是用了4*4维度的向量空间存储,如果词表大了,那存储空间就呈指数形式增长,效率会很低。

而wordEmbedding则不同,它对索引分配潜在因子,如果分配n个潜在因子,那么嵌入之后的向量表示每一个长度都是n。用2个潜在因子表示以上的例子:deep==>[0.32,0.02]...可见这个向量的长度将不受词表大小制约。当然了embedding的具体数值是有语音信息的,因此我们平常使用训练好的嵌入如word2vec等,这里不赘述。

这里再举一个实际项目中的例子,这个项目是github上的很火的开源项目,textcnn,我这里只说预处理词的一小部分。

self.W = tf.Variable(tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0),name="W")
#第一行的意思是创建一个高度为词表大小vocab_size,长度为之前提到的embedding的潜在因子embedding_size的一个二位矩阵,用来存储词表,同时其中每个元素都是[-1,1]之间的随机均匀分布

self.embedded_chars = tf.nn.embedding_lookup(self.W, self.input_x)
#第二行是通过输入input_x去词表中查找每一个句子中单词对应的embedding向量,input_x维度为[batch_size,sequence_size]长度为句子长度,因此查找结果为三维[batch_size,sequence_size,embedding_size]

self.embedded_chars_expanded = tf.expand_dims(self.embedded_chars, -1)
#扩充一维,最有一维为输入通道数

这段代码是构建网络模型时的构造输入input的规模的,最重要的就是弄清其中的维度变化,完整的例子可以去项目地址查看。

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值