自然语言处理的第一步就是获取词向量,获取词向量的方法总体可以分为两种两种,一个是基于统计方法的,一种是基于语言模型的。

1 Glove - 基于统计方法

  Glove是一个典型的基于统计的获取词向量的方法,基本思想是:用一个词语周边其他词语出现的次数(或者说两个词共同出现的次数)来表示每一个词语,此时每个词向量的维度等于词库容量,每一维存储着词库对应序号的词语出现在当前词语周围的次数,所有这些词向量组成的矩阵就是共现矩阵。
  我们也可以换一个角度来理解共现矩阵,共现矩阵就是两个词同时出现的次数,共现矩阵的i行j列的数值表示词库中第i个词和第j个词同时出现的次数,同时共现矩阵是对角线为零的斜对称矩阵。
  大家可以通过下边这个例子来更直观的理解共生矩阵:

  1.1 实现步骤

  1. 统计所有语料当中任意两个单词出现在同一个窗口中的频率,结果表现为共现矩阵 X
  2. 直接统计得到的共现矩阵 X,大小为 |V| x |V|(V=词库容量)
  3. 实践当中通常对原始统计矩阵施加 SVD(Singular Value Decomposition)来降低矩阵维度,同时降低矩阵的稀疏性

  1.2 优点

  • 训练速度快
  • 充分利用了全局的统计信息

  1.3 存在的问题

  • 对于单一词语,只有少部分词与其同时出现,导致矩阵极其稀疏,因此需要对词频做额外处理来达到好的矩阵分解效果
  • 矩阵非常大,维度太高
  • 需要手动去掉停用词(如although, a,...),不然这些频繁出现的词也会影响矩阵分解的效果

2 基于语言模型的方法

  按照语言模型的演进历史,大体可分为三类:文法型语言模型、统计语言模型、神经概率语言模型;文法型语言模型是人工撰写的语言规则,这里不做赘述

  2.1 基于 n-gram 的语言模型

  基于 n-gram 的语言模型是基于统计的语言模型,在NLP任务中,我们往往要计算一个句子出现的概率,通常的做法是:
  1. 对于句中的每个词,计算在给定前边所有词的条件下每个词出现的条件概率:
 
 
 
 
  2. 将每个词出现的条件概率连乘,从而得到当前句子出现的概率(当前句子对应词语组合出现的概率)公式如下:
但是上述方法有两个缺陷:
  1. 参数空间过大,概率  的参数有 O(n)O(n)O(n) 个。
  1. 数据稀疏严重,有些词同时出现的情况可能没有,组合阶数高时尤其明显。
  为了解决上述问题,n-gram 模型使用n阶马尔可夫假设对上述 $p(s)$公式进行了简化处理,即用前 n-1 个词代替当前词前边的所有词计算当前词出现的条件概率,简化后的 $p(s)$公式如下:
 
 
 
  每个单词出现的条件概率如下:
  简单解释一下n阶马尔可夫假设:
  • 简单来说,n阶马尔可夫假设的意思就是:符合马尔科夫过程的随机变量,当前状态只和前n-1个状态有关,即N阶马尔可夫假设认为,当前词出现的概率只依赖于前 n-1 个词
  • 1阶马尔科夫假设当前状态只和当前状态有关,1阶马尔科夫假设不会考虑上下和当前次的关系,因此 n 一般大于1

  这里插一嘴,笔者认为 虽然 n-gram 只用到了前 n-1 个数据,但是这前 n-1 个数据也是由前边数据得出的,因此 n-gram 也间接用到了前边的数据

  2.2 基于神经网络的语言模型

  基于神经网络的语言模型根据学习方法不同大体可以分为两大类,分别是 Feature-based 和 Fine-tune,其中 Feature-based 学习方法就是通过神经网络获取词向量 ,ELMO、fastText、word2vec、NNLM都是 Feature-based 模型的例子
   虽然 ELMO、FastText、Word2vec等都是获取词向量的模型,但是fastText、word2vec、NNLM 得到的是静态词向量,静态词向量不考虑上下文(对于不同语境下的同一单词给出的词向量是相同的),因此不能够解决一次多义的问题。
  而 ELMO 等语言模型会根据词语的上下文的不同对同一词语给出不同的词向量,从而解决的一词多义的问题。

  2.2.1 word2vec

  word2vec 思想是训练一个神经网络,然后提取神经网络中的参数作为词语的词向量;训练网络的方式有两种,一种是cbow 一种是 skip-gram,前者是通过上下文词语预测中间词,后者是通过中间词预测周围词;哪种训练方法并不重要,我们也不会用这个模型去做预测,训练的目的是提取最终网络中的参数作为词语的词向量

  2.2.2 fastText

  fastText 设计之初是为了解决文本分类问题的,只不过在解决分类问题的同时 fastText 也能产生词向量,因此后来也被用来生成词向量。
  fastText 和 word2vec 类似,也是通过训练一个神经网络,然后提取神经网络中的参数作为词语的词向量,只不过 fastText 训练网络的方法是对文本进行分类;此外 word2vec 的输入是多个词语的 noe-hot 编码,fastText的输入是多个单词及其n-gram特征;同时fastText为了解决类别过多导致的softmax函数计算量过大的问题,使用了层次softmax代替标准的softmax。
  fastText 和 word2vec 最主要的区别如下:
  1. 输入增加了n-gram特征
  2. 使用 层次softmax做多分类
  3. 通过文本分类的方式来训练模型

  2.2.3 ELMO

  ELMO 模型是一个双向的动态语言模型,在给出词语的词向量时会考虑词语的上文和下文,从而解决word2vec所遇到的一词多义问题;
  1、 ELMO得到词向量的过程
  • 用通用语言模型(如word2vec、fastText、glove等)去训练一个静态词向量,ELMO内部使用 CNN-BIG-LSTM 语言模型得到的词向量,得到词向量的维度为 512
  • 使用得到的静态词向量去训练ELMO网络
  • 下游任务中使用词向量时,加载预训练的ELMO网络参数,根据当前上下文去动态调整词向量,从而得到一个动态的词向量。
  2、 ELMO网络结构

   上图展示的就是ELMO的网络结构,ELMO由两层网络组成,每层网络用于提取不同层级的特征;其中每层由两个方向相反的RNN网络构成(双向LSTM,简称BiLSTM),分别记录上文信息和下文信息

同时,为了保证网络的稳定,ELMO从最底层词嵌入层到第一层biLSTM输出层之间还有一个残差链接。
  3. 得到ELMO的词向量
  对于输入的第 i 个静态词向量(因为静态词向量通过 CNN-BIG-LSTM 得到,因此维度为512),ELMO最终会出输出1个静态词向量和两个动态词向量,分别是:
  • $h(i,0)$:将两个输入的静态词(复制一份)向量拼接在一起,维度是512+512=1024,拼接的目的是为了和后边两个词向量的维度统一。
  • $h(i,1)$:将ELMO第1层两个反向LSTM的输出拼接,维度是512+512=1024。
  • $h(i,2)$:将ELMO第2层两个反向LSTM的输出拼接,维度是512+512=1024。
  ELMo 中不同层的词向量往往的侧重点往往是不同的,输入层采用的 CNN-BIG-LSTM 词向量可以比较好编码词性信息,第 1 层 LSTM 可以比较好编码句法信息,第 2 层 LSTM 可以比较好编码单词语义信息。
  ELMO 的作者提出了两种使用词向量的方法:
  • 是直接使用最后一层 biLSTM 的输出作为词向量,即  $h(i,2)$ 。
  • 更加通用的做法,将 $h(i,0)$ 、$h(i,1)$ 、$h(i,2)$ 三个输出加权融合在一起,公式如下。其中γ 是一个与任务相关的系数,允许不同的 NLP 任务缩放 ELMO 的向量,可以增加模型的灵活性。  $s_{j}^{task}$是使用 softmax 归一化的权重系数;此方法得到的elmo词向量可以看成是各层向量与初始静态词向量的ensemble
  通过下面这张图片能形象地理解使用第二种方法获取词向量的过程:

4. ELMO优点

  • ELMO的各层参数实际上就是为各种有监督的下游任务准备的,因此ELMO可以被认为是一种迁移学习(transfer learning)。
  • 通过这样的迁移策略,那些对词义消歧有需求的任务就更容易通过训练给第二隐层一个很大的权重,而对词性、句法有明显需求的任务则可能对第一隐层的参数学习到比较大的值(实验结论)。总之,这样便得到了一份”可以被下游任务定制“的特征更为丰富的词向量。

5. ELMO缺点

  • lstm是串行机制,训练时间长,从这一点来看ELMO注定成为不了大哥,
  • 相比于Transformer,lstm提取特征的能力还是不够的,我觉得未来lstm可能会被淘汰,毕竟屁股决定脑袋,时间为上!
  • ELMO 的两个RNN网络是分别计算的,导致计算时上下文的信息不会相互通信,进而导致ELMO得到的词向量有一定的局限性
  • 输出的结果只是讲两个RNN网络得到的结果拼接在一起,上下文信息并不会相互影响

转载于:https://blog.csdn.net/lch551218/article/details/114836207

NLP获取词向量的方法(Glove、n-gram、word2vec、fastText、ELMo 对比分析)的更多相关文章

  1. 深度学习之NLP获取词向量

    1.代码 def clean_text(text, remove_stopwords=False): """ 数据清洗 """ text = ...

  2. NLP︱高级词向量表达(一)——GloVe(理论、相关测评结果、R&python实现、相关应用)

    有很多改进版的word2vec,但是目前还是word2vec最流行,但是Glove也有很多在提及,笔者在自己实验的时候,发现Glove也还是有很多优点以及可以深入研究对比的地方的,所以对其进行了一定的 ...

  3. NLP︱高级词向量表达(三)——WordRank(简述)

    如果说FastText的词向量在表达句子时候很在行的话,GloVe在多义词方面表现出色,那么wordRank在相似词寻找方面表现地不错. 其是通过Robust Ranking来进行词向量定义. 相关p ...

  4. NLP︱高级词向量表达(二)——FastText(简述、学习笔记)

    FastText是Facebook开发的一款快速文本分类器,提供简单而高效的文本分类和表征学习的方法,不过这个项目其实是有两部分组成的,一部分是这篇文章介绍的 fastText 文本分类(paper: ...

  5. NLP之词向量

    1.对词用独热编码进行表示的缺点 向量的维度会随着句子中词的类型的增大而增大,最后可能会造成维度灾难2.任意两个词之间都是孤立的,仅仅将词符号化,不包含任何语义信息,根本无法表示出在语义层面上词与词之 ...

  6. pytroch 权重初始化和加载词向量的方法

    1.几种不同的初始化方法 import torch.nn as nn embedding = torch.Tensor(3, 5) #如下6种初始化方法 #正态分布 nn.init.normal_(e ...

  7. 【paddle学习】词向量

    http://spaces.ac.cn/archives/4122/   关于词向量讲的很好 上边的形式表明,这是一个以2x6的one hot矩阵的为输入.中间层节点数为3的全连接神经网络层,但你看右 ...

  8. NLP教程(2) | GloVe及词向量的训练与评估

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www.showmeai.tech/article-det ...

  9. NLP学习(1)---Glove模型---词向量模型

    一.简介: 1.概念:glove是一种无监督的Word representation方法. Count-based模型,如GloVe,本质上是对共现矩阵进行降维.首先,构建一个词汇的共现矩阵,每一行是 ...

随机推荐

  1. Winform同步调用异步函数死锁原因分析、为什么要用异步

    1.前言 几年前,一个开发同学遇到同步调用异步函数出现死锁问题,导致UI界面假死.我解释了一堆,关于状态机.线程池.WindowsFormsSynchronizationContext.Post.co ...

  2. Java和jmeter环境变量的配置来这就对了!

    java环境变量设置 1.新建JAVA_HOME 变量 点击 新建按钮 变量名:JAVA_HOME 变量值:电脑上JDK安装的绝对路径 2.新建/修改 CLASSPATH 变量 如果存在 CLASSP ...

  3. 如何从一台OPC Server访问多个PLC

    项目中遇到如下情况: 1. 整条生产线由多个PLC分别控制,但是所有PLC在同一个局域网内.PLC采用西门子的S7-200 Smart 2. 客户希望在操作工站的电脑(跟PLC在同一个局域网内)上提供 ...

  4. Java:并发笔记-09

    Java:并发笔记-09 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 7. 共享模型之工具-2 原理:AQS 原理 对于 AQS 的原理这部分内容,没很好的 ...

  5. OO_JAVA_四个单元的总结

    总结本单元两次作业的架构设计 设计目标 尽量减少特殊容器的存在,能通用就通用,减少重复的类同代码. 基础容器的存在,就是为上述目标而服务的. 设计概要 底层:基础的.类型无关.无依赖的容器以及对应的查 ...

  6. 2021.6.29考试总结[NOIP模拟10]

    T1 入阵曲 二位前缀和暴力n4可以拿60. 观察到维护前缀和时模k意义下余数一样的前缀和相减后一定被k整除,前缀和维护模数,n2枚举行数,n枚举列, 开一个桶记录模数出现个数,每枚举到该模数就加上它 ...

  7. 公众号H5页面接入微信登录流程

    公众号H5页面接入微信登录流程 源码地址 https://gitee.com/szxio/h5_weixin 起步 首先创建一个项目,我们采用uni-app来作为我们的前端框架 环境安装 全局安装vu ...

  8. Spring Cache 带你飞(一)

    Spring 3.1 版本引入基于 annotation 的 cache 技术,提供了一套抽象的缓存实现方案,通过注解方式使用缓存,基于配置的方式灵活使用不同缓存组件.代码具有相当的灵活性和扩展性,本 ...

  9. sort命令的学习与实践

    一.用man sort 查看sort的帮助文档 *sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. [rocrocket@ro ...

  10. Serverless 工程实践|自建 Apache OpenWhisk 平台

    作者 | 刘宇(江昱) 前言:OpenWhisk 是一个开源.无服务器的云平台,可以在运行时容器中通过执行扩展的代码响应各种事件,而无须用户关心相关的基础设施架构. OpenWhisk 简介 Open ...