单词嵌入提供了单词的密集表示及其相对含义,它们是对简单包模型表示中使用的稀疏表示的改进,可以从文本数据中学习字嵌入,并在项目之间重复使用。它们也可以作为拟合文本数据的神经网络的一部分来学习。

1. Word Embedding

单词嵌入是使用密集的矢量表示来表示单词和文档的一类方法。
词嵌入是对传统的词袋模型编码方案的改进,传统方法使用大而稀疏的矢量来表示每个单词或者在矢量内对每个单词进行评分以表示整个词汇表,这些表示是稀疏的,因为每个词汇的表示是巨大的,给定的词或文档主要由零值组成的大向量表示。相反,在嵌入中,单词由密集向量表示,其中向量表示将单词投影到连续向量空间中。向量空间中的单词的位置是从文本中学习的,并且基于在使用单词时围绕单词的单词。学习到的向量空间中的单词的位置被称为它的嵌入:Embedding。

从文本学习单词嵌入方法的两个流行例子包括:
1)Word2Vec.
2)GloVe.
除了这些精心设计的方法之外,还可以将词嵌入学习作为深度学习模型的一部分。这可能是一个较慢的方法,但可以通过这样为特定数据集定制模型。

2. Keras Embedding Layer

Keras提供了一个嵌入层,适用于文本数据的神经网络。它要求输入数据是整数编码的,所以每个字都用一个唯一的整数表示。这个数据准备步骤可以使用Keras提供的Tokenizer API来执行。嵌入层用随机权重进行初始化,并将学习训练数据集中所有单词的嵌入。它是一个灵活的图层,可以以多种方式使用,例如:
1)它可以单独使用来学习一个单词嵌入,以后可以保存并在另一个模型中使用。
2)它可以用作深度学习模型的一部分,其中嵌入与模型本身一起学习。
3)它可以用来加载预先训练的词嵌入模型,这是一种迁移学习。

嵌入层被定义为网络的第一个隐藏层。它必须指定3个参数:
1)input_dim:这是文本数据中词汇的取值可能数。例如,如果您的数据是整数编码为0-9之间的值,那么词汇的大小就是10个单词;
2)output_dim:这是嵌入单词的向量空间的大小。它为每个单词定义了这个层的输出向量的大小。例如,它可能是32或100甚至更大,可以视为具体问题的超参数;
3)input_length:这是输入序列的长度,就像您为Keras模型的任何输入层所定义的一样,也就是一次输入带有的词汇个数。例如,如果您的所有输入文档都由1000个字组成,那么input_length就是1000。

3. 相关语法

例如,下面我们定义一个词汇表为200的嵌入层(例如从0到199的整数编码的字,包括0到199),一个32维的向量空间,其中将嵌入单词,以及输入文档,每个单词有50个单词。

e = Embedding(inputdim=200, outputdim=32, input_length=50)

嵌入层自带学习的权重,如果将模型保存到文件中,则将包含嵌入图层的权重。嵌入层的输出是一个二维向量,每个单词在输入文本(输入文档)序列中嵌入一个。如果您希望直接将Dense层接到Embedding层后面,则必须先使用Flatten层将Embedding层的2D输出矩阵平铺为一维矢量。