# 词向量

> 词向量(word embedding)是为了让计算机能够处理的一种词的表示。
自然语言处理(NLP)相关任务中,要将自然语言交给机器学习中的算法来处理,通常需要首先将语言数学化,因为机器不是人,机器只认数学符号。向量是人把自然界的东西抽象出来交给机器处理的东西,基本上可以说向量是人对机器输入的主要方式。
词向量就是用来将语言中的词进行数学化的一种方式,顾名思义,词向量就是把一个词表示成一个向量。

----------
词向量表示的方式主要有两种:

- **One-Hot Representation**

> NLP相关任务中最常见的第一步是创建一个词表库并把每个词顺序编号。这实际就是词表示方法中的One-hot Representation,这种方法把每个词顺序编号,每个词就是一个很长的向量,向量的维度等于词表大小,只有对应位置上的数字为1,其他都为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 1 0 0 0 0 0 0 0 …]
这种 One-hotRepresentation 如果采用稀疏方式存储,会非常简洁:也就是给每个词分配一个数字 ID。比如刚才的例子中,话筒记为 3,麦克记为 8(假设从 0 开始记)。如果要编程实现的话,用 Hash 表给每个词分配一个编号就可以了。这么简洁的表示方法配合上最大熵、SVM、CRF 等等算法已经很好地完成了 NLP 领域的各种主流任务。这种表示方法一个最大的问题是无法捕捉词与词之间的相似度,就算是近义词也无法从词向量中看出任何关系。此外这种表示方法还容易发生维数灾难,尤其是在Deep Learning相关的一些应用中。

----------

- **Distributed Representation**

> Distributed representation 最早是 Hinton 在 1986 年的论文《Learning distributed representations of concepts》中提出的。其基本思想是通过训练将每个词映射成K维实数向量(K一般为模型中的超参数),通过词之间的距离(比如cosine相似度、欧氏距离等)来判断它们之间的语义相似度。虽然这篇文章没有说要将词做 Distributed representation,但至少这种先进的思想在那个时候就在人们的心中埋下了火种,到 2000 年之后开始逐渐被人重视。Distributed representation 用来表示词,通常被称为“Word Representation”或“Word Embedding”,中文俗称“词向量”。
Distributed representation 最大的贡献就是让相关或者相似的词,在距离上更接近了。向量的距离可以用最传统的欧氏距离来衡量,也可以用余弦夹角来衡量。用这种方式表示的向量,“麦克”和“话筒”的距离会远远小于“麦克”和“天气”。可能理想情况下“麦克”和“话筒”的表示应该是完全一样的,但是由于有些人会把英文名“迈克”也写成“麦克”,导致“麦克”一词带上了一些人名的语义,因此不会和“话筒”完全一致。word2vec使用的就是这种Distributed representation的词向量表示方式。

----------
# word2vec

### 简介
> Word2vec 是 Google 在 2013 年开源的一款将词表征为实数值向量的高效工具,利用深度学习思想,通过训练,把对文本内容的处理简化为 K 维向量空间中的向量运算,而向量空间上的相似度可以用来表示文本语义上的相似度。
Word2vec输出的词向量可以被用来做很多 NLP 相关的工作,比如聚类、找同义词、词性分析等等。如果换个思路,把词当做特征,那么Word2vec就可以把特征映射到 K 维向量空间,可以为文本数据寻求更加深层次的特征表示。

----------

> Word2vec 使用的是 Distributed representation 的词向量表示方式。采用一个三层的神经网络“输入层-隐层-输出层”。有个核心的技术是根据词频用Huffman编码,使得所有词频相似的词隐藏层激活的内容基本一致,出现频率越高的词语,他们激活的隐藏层数目越少,这样有效的降低了计算的复杂度。
而Word2vec大受欢迎的一个原因正是其高效性,Mikolov在[论文](https://arxiv.org/pdf/1301.3781.pdf?)中指出,一个优化的单机版本一天可训练上千亿词。
这个三层神经网络本身是对语言模型进行建模,但也同时获得一种单词在向量空间上的表示,而这个副作用才是Word2vec的真正目标。

----------

### 建模方式

![Figure1](leanote://file/getImage?fileId=5ae96814ab6441251c00104c)

- ***Continuous Bag-of-Words Model (CBOW,连续词袋模型)***

> 它的做法是,将一个词所在的上下文中的词作为输入,而那个词本身作为输出,也就是说,看到一个上下文,希望大概能猜出这个词和它的意思。通过在一个大的语料库训练,得到一个从输入层到隐含层的权重模型。例如第l个词的上下文词是i,j,k,那么i,j,k作为输入,它们所在的词汇表中的位置的值置为1。然后,输出是l,把它所在的词汇表中的位置的值置为1。训练完成后,就得到了每个词到隐含层的每个维度的权重,就是每个词的向量。
这是一种与前向NNLM类似的模型,不同点在于CBOW去掉了最耗时的非线性隐层且所有词共享隐层。如上图所示。可以看出,CBOW模型是预测
$P(w(t)|w(t-k),w(t-(k-1))…,w(t-1),w(t+1),w(t+2)…,w(t+k))$
即用上下文来预测目标词。

----------

- ***Skip-Gram (跳字模型)***

> 它的做法是,将一个词所在的上下文中的词作为输出,而那个词本身作为输入,也就是说,给出一个词,希望预测可能出现的上下文的词。通过在一个大的语料库训练,得到一个从输入层到隐含层的权重模型。例如第l个词的上下文词是i,j,k,那么i,j,k作为输出,它们所在的词汇表中的位置的值置为1。然后,输入是l,把它所在的词汇表中的位置的值置为1。训练完成后,就得到了每个词到隐含层的每个维度的权重,就是每个词的向量。
具体来说,给定一个训练的句子:$w1,w2,w3,…,wt$
$skip-gram$模型的目标是最大化以下极大似然估计: 
$$\frac{1}{T} \sum_{t=1}^T \sum_{-c \leq j \leq c,j\neq 0} \log P(w_{t+j}|w_t) $$
其中t表示单词表中的词数。j表示上下文窗口的大小。
如上图所示,输入一个词的向量表示,利用一个隐含层进行抽象,输出层节点数目等于单词表中词的数目。表示预测各词组成输入词上下文的概率,通常选用softmax来表示输出。
损失函数常选以上极大似然估计的相反数。可以选用一些常见的,如随机梯度下降(SGD)来训练模型。
即用一个词来预测一段目标上下文。

----------
### 实现方式

> 回想word2vec的目的,是找出一种可以表达词与词之间隐含的相互关联的信息的词表示。那如何捕捉这些信息呢? 有一句话是这么说的:“词是没有意义的,除非它在语境之中。” 也就是说,我们要找出想要的信息,需要从词及其语境信息中得到。从概率的角度,也就是说我们要建模,使:
$$maxP(s(w,context(w_t))) \quad \quad \quad if\quad w==w_t$$
或者
$$max\prod_{t}P(s(w_t,context(w_t))) \quad \quad \quad w_t\in Corpus$$
其中$s(a,b)$表示$a,b$的某个关系函数。

- ***Hierarchical Softmax (层序softmax)***

> 层序softmax利用了二叉树。树的每个叶子节点代表着词典V中的每个词。每个词$w_i$相应的词向量为$v_i$。以下图为例,来描述层序softmax的工作机制。

![1](leanote://file/getImage?fileId=5ae9742bab6441251c001277)

> 假设$l( w )$为从二叉树的根到代表词$w$的叶子节点的路径上的节点数,并设$n(w,i)$为该路径上第$i$个节点,该节点的向量为$\vec u_{n ( w , i )}$。以上图为例,$l(w_3)=4$。那么,跳字模型和连续词袋模型所需要计算的任意词$w_i$生成词$w$的概率为:

![2](leanote://file/getImage?fileId=5ae97532ab6441232a0012ff)

> 我们可以使用随机梯度下降在跳字模型和连续词袋模型中不断迭代计算字典中所有词向量$v$和非叶子节点的向量$u$。每次迭代的计算开销由$O ( | V | )$降为二叉树的高度$O ( \log | V | )$。

----------

- ***negative sampling  (负采样)***

> 以跳字模型为例讨论负采样。
词典$V$大小之所以会在目标函数中出现,是因为中心词$w_c$生成背景词$w_o$的概率$P ( w_o ∣ w_c )$使用了$softmax$,而$softmax$正是考虑了背景词可能是词典中的任一词,并体现在$softmax$的分母上。
我们不妨换个角度,假设中心词$w_c$生成背景词$w_o$由以下相互独立事件联合组成来近似。
中心词 $w_c$ 和背景词$w_o$同时出现在该训练数据窗口
中心词 $w_c$ 和第$1$个噪声词$w_1$不同时出现在该训练数据窗口(噪声词 $w_1$ 按噪声词分布 $P ( w )$ 随机生成,假设一定和$w_c$不同时出现在该训练数据窗口)...
中心词 $w_c$ 和第$k$个噪声词 $w_k$ 不同时出现在该训练数据窗口(噪声词 $w_k$ 按噪声词分布 $P ( w )$ 随机生成,假设一定和 $w_c$ 不同时出现在该训练数据窗口)...
我们可以使用$σ ( x ) = 1 / ( 1 + exp ( − x ) )$函数来表达中心词$w_c$和背景词$w_o$同时出现在该训练 数据窗口的概率:
![3](leanote://file/getImage?fileId=5ae9776bab6441232a001357)

当我们把$K$取较小值时,每次随机梯度下降的梯度计算开销将由$O(|V|)$降为$O(K)$。
![4](leanote://file/getImage?fileId=5ae9799eab6441232a0013a1)

同样地,当我们把$K$取较小值时,每次随机梯度下降的梯度计算开销将由$O(|V|)$降为$O(K)$。

----------

[word2vec词向量处理英文语料示例](https://blog.csdn.net/churximi/article/details/51472203)

词向量工具——word2vec相关推荐

  1. 毕业设计 - NLP:词向量Skip-gram word2vec

    文章目录 简介 0 前言 1 项目介绍 2 数据集介绍 3 项目实现 3.1 数据预处理 3.2 配置网络 3.3 网络训练 3.4 模型评估 4 最后-毕设帮助 简介 今天学长向大家介绍NLP基础 ...

  2. 什么是词向量?word2vec、Glove、FastText分别是什么?

    什么是词向量?word2vec.Glove.FastText分别是什么? 在任何一种基于深度学习的自然语言处理系统中,词嵌入和句子嵌入已成为重要组成部分.它们使用固定长度的稠密向量对词和句子进行编码, ...

  3. nlp-tutorial代码注释1-2,词向量、Word2Vec、Skip-gram简述

    系列语:本系列是nlp-tutorial代码注释系列,github上原项目地址为:nlp-tutorial,本系列每一篇文章的大纲是相关知识点介绍 + 详细代码注释. one-hot 传统的自然语言处 ...

  4. 词向量模型Word2Vec

    文章目录 1.词向量模型通俗解释 1.1Word2Vec 1.2如何训练词向量 1.3构建训练数据 2.CBOW与Skip-gram模型对比 2.1CBOW模型 2.2Skip-gram模型 2.2. ...

  5. Word2vec词向量工具带你发现不一样的《天龙八部》

    词向量技术是将词语转化成为稠密向量.在自然语言处理应用中,词向量作为机器学习.深度学习模型的特征进行输入.因此,最终模型的效果很大程度上取决于词向量的效果. Word2vec 是 Google 在 2 ...

  6. 学习笔记CB009:人工神经网络模型、手写数字识别、多层卷积网络、词向量、word2vec...

    人工神经网络,借鉴生物神经网络工作原理数学模型. 由n个输入特征得出与输入特征几乎相同的n个结果,训练隐藏层得到意想不到信息.信息检索领域,模型训练合理排序模型,输入特征,文档质量.文档点击历史.文档 ...

  7. 系统学习NLP(十三)--词向量(word2vec原理)

    词向量简介 自然语言是一套用来表达含义的复杂系统.在这套系统中,词是表义的基本单元.在机器学习中,如何使用向量表示词? 顾名思义,词向量是用来表示词的向量,通常也被认为是词的特征向量.近年来,词向量已 ...

  8. NLP(词向量、word2vec和word embedding)

    最近在做一些文本处理相关的任务,虽然对于相关知识有所了解,而且根据相关开源代码也可以完成相应任务:但是具有有些细节,尤其是细节之间的相互关系,感觉有些模糊而似懂非懂,所以找到相关知识整理介绍,分享如下 ...

  9. Python Word2vec训练医学短文本字/词向量实例实现,Word2vec训练字向量,Word2vec训练词向量,Word2vec训练保存与加载模型,Word2vec基础知识

    一.Word2vec概念 (1)Word2vec,是一群用来产生词向量的相关模型.这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本.网络以词表现,并且需猜测相邻位置的输入词,在word2 ...

最新文章

  1. PAT1127 如何根据后序遍历中序遍历建树?
  2. aspose.words for java操作文档doc,设置一级二级三级标题以及段落表格等详情
  3. html jQuery/bootstrap通过网络bootcdn导入连接
  4. 新顶级域名、Cloud域名
  5. Leetcode: 2. Add Two Numbers
  6. 自然语言处理中的Attention机制
  7. c语言———链表的创建
  8. 产品学习---互联网形势
  9. app开发者帐号(个人开发帐号、团队帐号、企业帐号、教育帐号)
  10. 如何做一个基于微信校园运动场地预约小程序系统毕业设计毕设作品
  11. 大邑移动团支部学校联谊活动
  12. Mybatis缓存机制(一级缓存、二级缓存、三级缓存)
  13. ExecuteNoQuery()返回值
  14. 项目经理辞职后,可以干嘛?
  15. 计算机组成原理第三次实验(静态随机存储器实验)
  16. 51nod 1072 威佐夫游戏
  17. 圣诞树-前端代码html--动态
  18. ERP-库存与存货-原料采购单
  19. 将Qt QCheckBox 默认选中样式改为对号选中
  20. mysql数据库通过高德地图经纬度计算两点之间的距离

热门文章

  1. 华为p60art参数配置 华为p60art怎么样
  2. 《Linux基础》06. 进程管理 · 服务管理
  3. 03.07:BT下载&区块链技术
  4. Dharma家族变体,.adobe后缀勒索病毒解密
  5. linux下ftp搭建流程
  6. 【C语言】从扫雷玩家到开发者
  7. 东莞地铁1号线黄江北站主体结构全面封顶
  8. 云知声深耕智慧医疗,推出单病种质控平台赋能单病种质量控制
  9. 零基础做油管搬运二创项目的正确方式,短视频小白玩家套利的可能
  10. VMware的linux虚拟机玩耍 [2] (环境配置与一些软件安装)