最近在接触深度学习,在自然语言处理的应用中,不可避免的要把文本转换成词向量,那么如何转化它呢?以及目前几种主要转化方式是有什么不一样呢?
接下来借助我最近做的文本分类的问题加以解释说明,主要理清word2vec和keras提供的Embedding层的差别,这也是一度使我比较困惑的地方。
一、one-hot
一切要从one-hot编码开始。我们在对文本进行预处理时,一般会根据自己的训练文档来构建一个词汇表,再对单词进行one-hot编码。
比如说在我们的所有的训练集中存在10000个互不相同的单词,那么就可以利用这10000个单词构成词汇表。我们对这10000个单词进行one-hot编码时,每个单词的向量表示都是10000维,且其中只有1和0的表示方式。假设一个单词my出现在第5个位置,那么my这个单词的10000维的向量表示中,只有第5个位置为1,其余的都为0,即[0,0,0,0,1,0,0,......]的形式。
这样就造成了一个问题,就是用one-hot编码表示的词向量会很高维也很稀疏,尤其当词汇表(字典)很大时,其效率更是低下。
二、Word Embedding(词嵌入)
由于one-hot编码表示稀疏的问题,那么词嵌入的表示表示方法就出现了。词嵌入是使用密集的矢量表示来表示单词和文档的一类方法。单词由密集向量表示,其中向量表示将单词投影到连续向量空间中。向量空间中的单词的位置是从文本中学习的,并且基于在使用单词时围绕单词的单词。学习到的向量空间中的单词的位置被称为它的嵌入:Embedding。
词嵌入有两种方式:一是单词嵌入方法(如Word2Vec)、二是神经网络中的embedding层(如keras的embedding层)
那么二者有什么关系呢?
其实二者的目标是一样的,都是我们为了学到词的稠密的嵌入表示。只不过学习的方式不一样。
<