达观杯”文本智能处理挑战赛——(三)word2vec理论并实践

一、word2vec词向量

1.简介
在自然语言处理的任务中,无论哪种算法都需要将文本形态的词转换成为向量形式的词向量(word embedding)。良好的词向量可以达到语义相近的词在词向量空间里聚集在一起,这对后续的文本分类,文本聚类等等算法提供良好的数据样本。
word2vec也叫word embeddings,中文名“词向量”,作用就是将自然语言中的字词转为计算机可以理解的稠密向量(Dense Vector)。在word2vec出现之前,自然语言处理经常把字词转为离散的单独的符号,也就是One-Hot Encoder,但这种表示方式存在很大缺陷,例如以下示例:

杭州 [0,0,0,0,0,0,0,1,0,……,0,0,0,0,0,0,0]
上海 [0,0,0,0,1,0,0,0,0,……,0,0,0,0,0,0,0]
宁波 [0,0,0,1,0,0,0,0,0,……,0,0,0,0,0,0,0]
北京 [0,0,0,0,0,0,0,0,0,……,1,0,0,0,0,0,0]

在语料库中采用这样一种方式来表示单词无疑会面临一些问题,例如忽略了单词之间的相关性,当语料库很大的时候,维度太高且矩阵稀疏。随后出现了word2vec词向量这种方式,它可以将独热编码转化为低维度的连续值即稠密向量,并且其中意思相近的词被映射到向量空间中相近的位置。如下图所示经过一个简单的神经网络学习到一个权值矩阵,将独热编码转化为稠密低维度向量。
在这里插入图片描述
2.word2vec词向量有两种模式,CBOW(continuous bag of words)和skip-gram
CBOW是根据目标单词所在原始语句的上下文来推测目标单词本身,而skip-gram则是利用该目标单词推测原始语句信息即它的上下文。
举个例子:美国对中国进口钢铁采取了反倾销调查。那么CBOW的目标可以是:{中国,钢铁}—>进口,{采取了,调查}—>反倾销,{美国,中国}—>对;skip-gram的目标可以是:{进口}—>{中国,钢铁},{了}—>{采取,反倾销}。

1)CBOW
CBOW去除了上下文各词的词序信息,使用上下文各词的平均值。
例如一段散文“The recently introduced continuous Skip-gram model is an efficient method for learning high-quality distributed vector representations that capture a large number of precises syntatic and semantic word relationships.”,想象这段文字上有一个滑动窗口,包括当前的词和前后的四个词。
上下文词组成了输入层,每一个词都用one-hot形式来表示,如果词汇量是V,则每个词就表示成V维向量,相应的词对应元素被设置成1,其余的为0。下图表示一个单隐层和一个输出层。
在这里插入图片描述
训练的目标是最大限度的观察实际输出词(焦点词)在给定输入上下文且考虑权重的条件概率,在我们的例子中,给出了输入(“一个”,“有效”,“方法”,“为”,“高”,“质量”,“分布式”,“向量”),我们要最大限度的获得“学习”作为输出的概率。
在这里插入图片描述
由于我们的输入向量是用one-hot来表示的,与权重矩阵W1相乘就相当于简单的选择W1中的一行。
如果输入了C个词向量,隐层的激活函数其实就是用来统计矩阵中的热点行,然后除以C来取平均值。这意味着,隐含层单元的激活函数就是简单的线性运算(直接将权重和作为下一层的输入)。
从 隐层到输出层,我们用一个权重矩阵W2来为每一个词计算词汇表中的得分,然后使用softmax来计算词的后验分布。

2)skip-gram

skip-gram和CBOW正好相反,它使用单一的焦点词作为输入,经过训练然后输出它的目标上下文,如下图所示:

在这里插入图片描述

正如之前提到的,隐层的激活函数只是权重矩阵W1对应行的简单统计。在输出层,我们输出C个词向量。训练的最终目标就是减少输出层所有上下文词的预测错误率。例如,如果输入“learn”,我们可能在输出层得到“an”,“efficient”,“method”,“for”,“high”,“quality”,“distributed”,“vector”。

3.skip-gram为例做详细介绍
以The president walked into the White House这句话为例,首先选取句子中的一个词作为输入词input word,比如我们把president作为输入词;有了输入词之后,再定义一个skip_window的参数,当skip_window=2时代表从当前输入词input word的左右两侧各选取两个单词,即窗口中的词就是【The,president,walked,into】。另一个重要的参数为num_skips,当num_skips=2时,代表我们从整个窗口中选取2个不同的词作为我们的output word:(president,The),(president,walked)。神经网络通过学习这样的训练数据最终输出一个概率分布,这个概率分布表征了词汇表中每个单词出现在president之后的概率大小。我们直观的理解一下就会明白动作词、政治话题等出现在总统之后的概率将会更大,因为这些单词将会有更大的可能性出现在president的窗口之中。
在这里插入图片描述通过训练数据学习得到的模型,我们需要的是模型隐藏层的权重矩阵,这些权重实际上就是我们试图去学习的“词向量”。通过{ president the }、{ president walked }这样的样本,模型就会知道经常出现在“总统”附近的单词有哪些,在这个过程中我们需要的是训练模型的副产物即隐藏层权重矩阵,通过这个权重矩阵就可以将独热编码的单词转换为低维的稠密词向量,而这样的词向量恰恰是作为特征向量输入到神经网络的输出层softmax层的。
注意:
我们发现,如果语料库比较巨大,例如有10万单词,隐藏层结点200个,即每个单词使用200维度特征表示,那么权重矩阵就是[100000,200],此时采用随机梯度下降等方法来训练神经网络将是十分缓慢的,所以提出了Hierarchical Softmax、Negative Sampling等方法来加速训练。例如,负采样(negative sampling)是用来提高训练速度并且改善所得到词向量的质量的一种方法。不同于原本每个训练样本更新所有的权重,负采样每次让一个训练样本仅仅更新一小部分的权重,这样就会降低梯度下降过程中的计算量。

4.gensim中word2vec函数使用说明

from gensim.model import word2vec
构建模型
word2vec(corpus_token, size=feature_size, min_count=min_count, window=window, sample=sample)

参数说明:
corpus_token已经进行切分的列表数据,数据格式是list of list
size表示的是特征向量的维度,即映射的维度
min_count表示最小的计数词,如果小于这个数的词,将不进行统计
window表示滑动窗口,表示滑动窗口的大小,用于构造训练集和测试集,
sample表示对出现次数频繁的词进行一个随机下采样
model.wv[‘sky’] 表示输出sky这个词的特征映射结果
model.wv.index2words 输出经过映射后的特征名,输出经过映射词的名字

5.代码步骤:
第一步:DataFrame化数据
第二步:进行分词和去除停用词,使用’ '.join连接列表
第三步:np.vectorize 向量化函数和调用函数进行停用词的去除
第四步:构建gensim.models import word2vec 构造单个词的特征向量,使用model.wv[‘sky’]
第五步:对第三步的字符串进行切分,将切分后的数据送入到word2vec建立模型,使用model.wv.index2word打印出当前的特征名,使用循环找出每个列表中词的特征向量,最后对每个列表中的词做一个特征向量的平均,作为列表的特征向量

二、Word2vec实践

在这里插入图片描述输出词的字典以观察理解函数:
在这里插入图片描述输出词的特征权重向量:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值