目录
1.One-hot Vector
在自然语言处理(NLP)中,为了让计算机可以识别我们的自然语言,比如中文,英语等等,需要将自然语言进行向量化,即用一个向量来表示一个单词,一个句子或者一篇文章,最基本的向量表示方式叫做one-hot vector,也叫作独热向量,该类向量是指只有一个位置为1,其他位置全为0的向量。举个例子,有个句子是 { 我们,爱,打,手机,游戏 },对其中的每个字进行向量化,可以得到
我们 : [1, 0, 0, 0 ,0]
爱: [0, 1, 0, 0, 0]
打: [0, 0, 1, 0, 0]
手机: [0, 0, 0, 1, 0]
游戏: [0, 0, 0, 0, 1]
每个词语都对应于一个单独的one-hot向量,不同的词语对应于不同的one-hot向量,但是每个词语和one-hot向量之间的对应关系是随意的,也就是说爱的one-hot向量为 [1, 0, 0, 0 ,0],我们的one-hot向量为[0, 1, 0, 0, 0]也是完全没问题的,总的来说,就是指不同的词语要用不同的one-hot向量进行表示,但是对应关系是随意的,那么要用多少维度,多少个的one-hot向量来表示一个句子呢?
答案是一个句子进行分词后总共分为了几个部分,如上面例子中的5部分,就用多少维度的向量来进行表示每个词语,如上例中的向量是5维的,然后分成了几个词语,就总共有几个one-hot向量,当然也可以用大于5维的维度来表示每个one-hot向量,但是这样就会造成明显的浪费。
也就是说如果有一个词典Dict,它里面词语的数量为V,那么用one-hot进行表示的话,就总共有V个向量,每个向量的维度为V(这里维度也可以大于V,但是会造成维度上的浪费),并且每个向量都不一样。这样就将每个词语用向量进行了表示,但one-hot 向量在实际使用中存在很多不足的地方,因此在实际NLP任务中,直接用one-hot 向量表示词语来进行训练的情况非常罕见,要么不使用one-hot,要么进行一些修改。
One-hot vector的缺点在于:
1. 无法使用该方法进行单词之间的相似度计算,比如余弦相似度
任意两个one-hot向量之间的余弦相似度结果都为0,因为任意两个向量之间都是正交垂直的,所有结果没有区分度,无法区分词语之间的相似程度。
2. 如果词典的词语个数V 非常庞大的情况下,就会存在V个ont-hot向量,并且每个向量的维度也是V, 所占据的资源和内存空间非常庞大,而且维度为V的向量中,只有一个位置为1,剩余的V-1个位置都为0,从矩阵学的角度来说,也就是说这样的向量,这样的向量所组成的矩阵非常稀疏,非常sparsity,显然这样稀疏的表示方法不适用于我们的要求。
3. 因为每个词语都对应于一个one-hot向量,但是对应关系是随意的,想对应哪个one-hot向量都可以,只要没有重复就可以,这样的表示方式就无法表明词语之间的关系和联系,因为你想用哪个one-hot向量表示都行,所以每个向量之间没有任意的联系,是彼此独立的,但是在实际情况中,一个句子中的词语可能存在上下文的联系和其他的关系,因此这样表示不太符合实际情形。
所以在2013年Google提出了Word2vec,来解决one-hot的缺陷,并且提出了一系列新的表示自然语言的向量表示方法,在这里提出一个专业名次,在NLP领域中,把词语用向量来进行的技术统一叫做词嵌入(word embedding)或者 word representation。把句子用向量来进行表示,则就叫做sentence embedding。
Word2vec这种 word embedding表示方式的优点在于它可以表示词语之间的联系,如果将大于二维的word embedding向量投射到二维空间中,可以看出它使得关系比较紧密的词语之间距离更近,相对应的,比较疏远的词语就会距离相对更大,比如乒乓球可能和乒乓球拍的距离就会比较近,乒乓球和笔记本之类词语的距离就会比较远。这样的一个表示形式就可以更好的让我们了解到词语之间的关系,也可以更好的对于一个句子进行操作。