什么是词向量:
词向量(Word Vector)是对词语义或含义的数值向量表示,包括字面意义和隐含意义。 词向量可以捕捉到词的内涵,将这些含义结合起来构成一个稠密的浮点数向量,这个稠密向量支持查询和逻辑推理。
词向量也称为词嵌入,其英文均可用 Word Embedding,是自然语言处理中的一组语言建模和特征学习技术的统称,其中来自词表的单词或短语被映射为实数的向量,这些向量能够体现词语之间的语义关系。从概念上讲,它涉及从每个单词多维的空间到具有更低维度的连续向量空间的数学嵌入。当用作底层输入表示时,单词和短语嵌入已经被证明可以提高 NLP 任务的性能,例如文本分类、命名实体识别、关系抽取等。
词向量作为词的分布式表示方法,经过多年研究,产生了非常多的词向量的生成模型。
1.one-hot(独热)编码
one-hot(独热)编码是最简单的词向量表达方式。它以字典建立向量,每个词都单独用一个很长的向量表示,该向量的维度是词典大小。向量中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。
2.基于共现矩阵的模型
通过考虑词和词的共现问题,可以反映词之间的语义关系。最简单的方法是使用基于文档的方式来表示词向量。 共现矩阵(Co-Occurrence Matrix)首先指定窗口大小,然后统计窗口(和对称窗口) 内词语共同出现的次数作为词的向量。
3.Word2vec
基于共现矩阵的模型实际是 one-hot 的一种优化,仍然存在维度灾难以及语义鸿沟的问题。因此后来的工作着重于构建分布式低维稠密词向量。Word2vec(Word to Vector)顾名思义,即为把单词转换成向量的一种方法。
用上下文来预测目标词的概率,词向量可以作为它的副产物学习到这种基于序列共现的语境信息。
4.glove
glove 是由斯坦福 NLP 研究小组在 2014 年提出的一种词向量表示算法,是一个基于全局词频统计的词表征工具。利用共现矩阵来弥补Word2vec基于局部窗口的、忽略了全局信息的缺点,同时考虑局部信息和整体的信息。
采用基于共现矩阵去训练词向量的方法,词之间的关系可以由共现矩阵体现,又可以用词向量表示,因此可以建立起共现次数与词向量之间的关系。
5.FastText
Word2vec 训练出的词向量,难以很好地表征形态相近的词汇的语义, 在应用过程中针对未登录词也无能为力。基于以上问题,FastText 词向量的研发者提出了基于子词信息 N-gram 的词汇表示形式。FastText 由脸书的 FAIR 实验室在 2016 年开源,用于实现快速文本分类以及训练词向量的资料库。
首先FastText 模型输入一个词的序列,输出这个词序列属于不同类别的概率。
6.ELMo
以上的词向量技术本质上都是静态方式, 构造的都是独立于上下文的、静态的词向量,单词训练好之后就固定了,无论下游任务是什么,输入的向量始终是固定的,无法解决一词多义等问题。ELMo是一种动态词向量技术,词向量不再用固定的映射表来表达。
ELMo 使用双向语言模型来进行预训练,用两个分开的双层 LSTM 作为编码器。ELMo 先用一个语言模型去学习单词的词向量,当在使用时,可以根据上下文的语义去调整单词的词向量。
7.GPT
GPT 模型提出一种半监督的方式来处理语言理解的任务。使用非监督的预训练和监督方式的微调。模型的目标是学习一个通用的语言表示,可以经过很小的调整就应用在各种任务中。这个模型的设置不需要目标任务和非标注的数据集在同一个领域。
使用编码能力更强的 Transformer。同时是使用单向语言模型, 也就是只根据上文来预测当前词。先通过无标签的文本去训练生成语言模型,再根据具体的 NLP 任务,来通过有标签的数据对模型进行微调。
8.BERT
BERT模型真正实现了双向语言模型。ELMo 虽然是双向语言模型,但实际上是分开执行再组合 loss 值;GPT 在预训练时使用的基于 Transformer 模型的单向语言模型,使 embedding 获得的上下文信息不完整。此外,BERT 模型还增加了一个特性,使神经网络学习句子之间是否具有连贯的关系,最终能在智能问答等领域得到很好的结果。
Word2vec 是一个计算词向量的开源工具。当我们在说 Word2vec 算法或模型的时候,其实指的是其背后用于计算词向量的 CBOW 模型和 Skip-Gram 模型。在向量空间中,词之间的相互关系、上下文关系都以向量之间的关系来表征,如通过词之间的距离(欧氏距离等)来判断它们之间的语义相似度。
Word2vec 预测词向量时都只使用了当前词的局部上下文,且以当前词为中心进行对称选取,我们将当前词到左(右)侧的距离称为滑动窗口大小。
基本原理:
输入 :给定的上下文。 输出 :预测的中心词。假设目标词前后各取 k 个词,即窗口的大小是 k,那么 CBOW 模型预测的将是 :
(_ |_(−),_(−(−1)),⋯,_(+(−1)),_(+))
特点:
对于 CBOW 模型,每次输入的是滑动窗口内的除当前词之外的上下文。
基本原理:
输入 :给定的中心词。 输出 :预测的上下文。如果 _t 前后各取 k 个单词,即窗口大小为 k,那么 Skip-Gram 模型预测的将是 :
例如,当k=2时, Skip-Gram 模型预测的是 :
特点:
与 CBOW 模型相反,Skip-Gram 是使用目标词去预测周围词来训练得到词向量。
案例分析:
Word2vec 是 Google 公司在 2013 年开源的一款将词表征为实数值向量的高效工具。 gensim 是著名的向量空间模型包,里面提供了 Word2vec 的 python 接口,在实际应用中,可以在 python 中方便的调用,轻松实现对自定义语料的词向量训练。
以美团外卖的评论集为语料训练词向量,并使用训练出来的词向量模型。
(1)安装所需工具
pip install pandas
pip install gensim
(2)对文本进行预处理、分词(jieba)
(3)进行模型训练
# 导入所需包
import pandas as pd
import jieba
from gensim.models.word2vec import Word2Vec
# 导入数据集
data = pd.read_csv('./train.csv')
corpus = data['comment'].values.astype(str) # 转字符串数组
# 分词,再重组为字符串数组
corpus = [jieba.lcut(corpus[index] .replace(",", "") .replace("!", "") .replace(" ! ", "")
.replace("。", "") .replace("~", "") .replace(" ;", "") .replace(" ? ", "")
.replace("?", "") .replace("【", "") .replace("】", "") .replace("#", "") )
for index in range(len(corpus))]
# 词向量模型训练
model = Word2vec(corpus, sg=0, vector_size=300, window=5, min_count=3)
print(' 模型参数 :',model,'\n’)
print(' 最匹配的词是 :',model.wv.most_similar(positive=[' 点赞 ', ' 不错 '], negative=[' 难吃 ']),'\n’)
print(' 相似度 =',model.wv.similarity(' 推荐 ',' 好吃 '),'\n’)
# 坐标返回
print(model.wv.__getitem__(' 地道 '))
注意力机制不是词向量生成技术,但它在使用预训练模型生成词向量的过程中具有非常重要的意义,目前被广泛使用在 Transformer 模型以及其他自然语言处理任务中。
Encoder- Decoder 框架是目前大多数注意力模型的基础,但值得注意的是,注意力模型作为一种通用思想本身并不依赖于任何框架。它是由一个输入序列(句子或者篇章)得到一个输出序列(句子或者篇章)的通用处理模型。对于序列对
自注意力机制: 在 Encoder-Decoder 框架中,自注意力机制(Self-Attention)是指只发生在 Encoder 或者 Decoder 中的注意力机制,而注意力机制本身没有这个束缚。在机器翻译的 Encoder-Decoder 框架中,通常 Query 来自于 Decoder,Key 和 Value 来自于 Encoder, 注意力机制发生在 Encoder-Decoder 之间。自注意力机制可以用于解决代词指代问题。相比于LSTM和RNN,自注意力机制不必经过漫长的传递,能极大地缩短长距离依赖特征之间的距离,提高远距离特征的利用率。
多头注意力机制: 多头注意力机制(Multi-Head Attention)是利用多个查询,来平行地从输入信息中选 取多个信息。每个注意力关注输入信息的不同部分。基本框架如下图所示。