最初,人们想用一串数字表示一段文字,用的是one-hot置换法。就是将一篇文章中所有不重复的词的个数,作为词汇表的大小,词汇表有多大,这个向量就有多长。那么对于词汇表中每一个词的向量,就在相应的位置置1. 比如说一篇文章中有:
语料:“I am Shirley Zhang”, "I am an engineer", "I am a lovely girl"
那么由语料中出现的所有不重复的单词构成的词汇表就是[Shirley, Zhang, I, am, an, engineer, a, lovely, girl]
那么根据以上词汇表,得出Shirley这个词的词向量就是[1, 0, 0, 0, 0, 0, 0, 0, 0]
那么对于文本“I am Shirley Zhang”, 通过one-hot这种词向量转化就变为
[0, 0, 1, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 1, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 0, 0, 0, 0]
针对以上缺点,改进的分布式编码算法产生了。
比如说engineer映射成四维空间的一个词向量 [0.56,0.12,0.67,0.92]
word2vector采用的语言模型
我们先来看一个问题,假如有一个句子 " the dog bark at the mailman"。
假如用向量来表示每个单词,我们最先想到的是用one hot 编码的方式来表达每个单词,具体来说。
the 可以表示为 [1,0,0,0,0]
dog 可以表示为 [0,1,0,0,0]
bark 可以表示为 [0,0,1,0,0]
at 可以表示为[0,0,0,1,0]
mailman可以表示为[0,0,0,0,1]
我们可以看到每个单词其实就用一个向量来表示。我们发现几个问题:
第一,每个向量之间相互正交的(内积为0)。也就是说词与词之间是没有任何关系的。
第二,每个词的向量维度和不同词的个数有关。比方说,在上面的这个句子里,有5个不同的词,所以向量的维度是5。然而往往现实中,一篇文章的中不同的词的个数是很多的。这样,向量的维度会非常的高。
这种对词的向量表示方法存在着以上的问题,忽略了词与词之间的关系(比如说,dog和cat都是动物,并非完全无关系)。维度太高的向量作为模型输入会导致模型变的复杂(模型复杂需要更多的训练样本才能够收敛)
那么是否存在一种更加合理的对词的用向量的表达方式呢?有的,其实就是word embedding。
word embedding说的简单一点其实就是将高维稀疏的向量降维成稠密的低维向量。(一种高维到低维的映射)
那么如和实现word embedding?
w2v其实就是一种高效实现word embedding的工具。
所以,如果用一句话来描述word2vector的话你会怎么描述?简单的说,我觉得可以这么说w2v其实是一种将单词转化向量的工具。这一种向量的其实是对单词更有效的表达。
中文分词、向量化,这两篇写的很好!!!
https://www.cnblogs.com/Newsteinwell/p/6034747.html
https://blog.csdn.net/sinat_29694963/article/details/79177832