中文分词、向量化,这两篇写的很好!!!
https://www.cnblogs.com/Newsteinwell/p/6034747.html
https://blog.csdn.net/sinat_29694963/article/details/79177832
最初,人们想用一串数字表示一段文字,用的是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]
one-hot编码的好处就是简单,缺点也是显而易见的,词向量的维度会随着词汇表的增大而急剧增大,词向量里面大多数的元素都是0,十分浪费存储空间,表达效率低下。也没有考虑到上下文等语义信息。
针对以上缺点,改进的分布式编码算法产生了。
分布式编码
分布式的思想就是通过训练出来的模型,把每个词都计算并且映射到一个比较短的词向量上来。这个词向量上每一个元素的值不再只是单纯的用0,1表示,而是某种含义的离散值。词向量的维度也不再是词汇表的长度,而是可以根据需求自己设置的。那么它长什么样子呢?
比如说engineer映射成四维空间的一个词向量 [0.56,0.12,0.67,0.92]
分布式编码的一个典型就是word2vector。
word2vector采用的语言模型
word2vector一般采用的模型有两种,CBOW模型和Skip-gram模型,本文以CBOW模型为例。(后面关于这两个模型的介绍太负责了,略。。。。。)
.什么是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