词向量

在自然语言处理任务中,首先需要考虑字、词如何在计算机中表示。通常,有两种表示方式:one-hot表示和分布式表示

  • one-hot表示
    把每个词表示为一个长向量。这个向量的维度是词表大小,向量中只有一个维度的值为1,其余维度为0,这个维度就代表了当前的词。 例如:苹果 [0,0,0,1,0,0,0,0,···] 。one-hot表示不能展示词与词之间的关系,且特征空间非常大。
  • 分布式表示
    word embedding指的是将词转化成一种分布式表示,又称词向量。分布式表示将词表示成一个定长的连续的稠密向量。

分布式表示优点:

(1) 词之间存在相似关系:是词之间存在“距离”概念,这对很多自然语言处理的任务非常有帮助。

(2) 包含更多信息:词向量能够包含更多信息,并且每一维都有特定的含义。在采用one-hot特征时,可以对特征向量进行删减,词向量则不能。

NNLM和word2vec

  • 不像图像,其本身输入到计算机中是矩阵,矩阵里的数字就隐含了其各种各样的特征,这些特征可以通过模型去学习和捕捉。而文本的输入,是字符串,这是计算机处理不了的,所以当初人们首先想到的就是独热编码,第一是这样就可以将文本转化为数字,计算机能进行处理;第二就是每个词都可以独一无二的被表示。但是这种表示丢失了词的一个很重要的特征,即语义。为了进行语义信息,联想到了分布式表示,分布式表示一个很重要的核心思想是:语义相近的词在高维度上是相互接近的。这里用一个简单的例子来感受一下分布式表示的魅力:

比如,我们要表示三样东西“红色的正三角形”,“红色的圆正方形”,“绿色的正三角形”,如果用one-hot编码表示,则分别为[1,0,0],[0,1,0],[0,0,1]。可以发现若这样表示,三个向量在三维空间上彼此正交,其之间的潜在特征将会因为这样的表示而消失。若我们在3维空间上,第一个维度空间表示颜色(红色0绿色1),第二个维度空间上表示圆和正(正0圆1),第三个维度空间上表示形状(三角形0正方形1),那么此时这三个向量可以表示为[0,0,0],[0,1,1],[1,0,0],我们发现,这三个向量彼此之间就存在了联系,若在来一个“绿色的圆三角形”,我们也可以轻松的表示为 [1,1,0],而不是独热编码的所有向量由三维变成四维。这也是独热编码的另一个致命缺陷,数据过于稀疏。

Word2Vec

2013 年,Google 团队发表了 word2vec 工具。word2vec 工具主要包含两个模型:跳字模型(skip-gram)和连续词模型(continuous bag of words,简称 CBOW),以及两种高效训练的方法:负采样(negative sampling)和层序 softmax(hierarchical softmax)。值得一提的是,word2vec 词向量可以较好地表达不同词之间的相似度和类比关系。

skip-gram:是根据目标词去预测周围词来训练得到词向量
CBOW:是根据上下文取预测目标词来训练得到词向量

skip-gram

例如,给定文本序列 “the”,“man”,“hit”,“his”,“son”。设背景窗口大小为 2, 跳字模型所关心的是,给定 “hit”,生成它邻近词 “the”,“man”.“his”,“son” 的概率(在这个例子中,“hit” 叫中心词,“the”,“man”,“his”,“son” 叫背景词),即
P(context(wt)∣wt)P(context(w_t)|w_t)P(context(wt)wt)P(the,man,his,son∣hit)P(the,man,his,son|hit)P(the,man,his,sonhit)假设在给定中心词的情况下,背景词的生成是相互独立的,那么上式可以改写成P(the∣hit)⋅P(man∣hit)⋅P(his∣hit)⋅P(son∣hit)P(the|hit)·P(man|hit)·P(his|hit)·P(son|hit)P(thehit)P(manhit)P(hishit)P(sonhit)
我们来描述一下跳字模型。假设词典大小为 ∣V∣|V|V,我们将词典中的每个词与 0 到∣V∣−1|V|-1V1 的整数一一对应:词典索引集 V={0,1,.....,∣V∣−1}V = \{0,1,.....,|V|-1\}V={0,1,.....,V1}。一个词在该词典中所对应的整数称为词的索引,给定一个长度为 TTT的文本序列,ttt 时刻的词为w(t)w^{(t)}w(t) 。当时间窗口大小为 mmm 时,跳字模型需要最大化给定任一中心词生成背景词的概率:
∏t=1T∏−m≤j≤m,j≠0P(w(t+j)∣w(t))\prod \limits_{t=1}^T \prod \limits_{-m\le j\le m,j \ne0} P(w^{(t+j)}|w^{(t)})t=1Tmjm,j=0P(w(t+j)w(t))

简单代码

import torch
import numpy as np
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt
import torch.utils.data as Datadtype = torch.FloatTensor
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
sentences = ["jack like dog", "jack like cat", "jack like animal","dog cat animal", "banana apple cat dog like", "dog fish milk like","dog cat animal like", "jack like apple", "apple like", "jack like banana","apple banana jack movie book music like", "cat dog hate", "cat dog like"]word_sequence = " ".join(sentences).split() # ['jack', 'like', 'dog', 'jack', 'like', 'cat', 'animal',...]
vocab = list(set(word_sequence)) # build words vocabulary
word2idx = {w: i for i, w in enumerate(vocab)} # {'jack':0, 'like':1,...}
# Word2Vec Parameters
batch_size = 8
embedding_size = 2  # 2 dim vector represent one word
C = 2 # window size
voc_size = len(vocab)

假设文本分词之后,转为索引之后的list如下:

设定window_size=2,选中的中心词和背景词如下:

skip-grams为中心词和背景词一一配对后的list:

# 1.
skip_grams = []
for idx in range(C, len(word_sequence) - C):center = word2idx[word_sequence[idx]] # center wordcontext_idx = list(range(idx - C, idx)) + list(range(idx + 1, idx + C + 1)) # context word idxcontext = [word2idx[word_sequence[i]] for i in context_idx]for w in context:skip_grams.append([center, w])# 2.
def make_data(skip_grams):input_data = []output_data = []for i in range(len(skip_grams)):input_data.append(np.eye(voc_size)[skip_grams[i][0]])output_data.append(skip_grams[i][1])return input_data, output_data# 3.
input_data, output_data = make_data(skip_grams)
input_data, output_data = torch.Tensor(input_data), torch.LongTensor(output_data)
dataset = Data.TensorDataset(input_data, output_data)
loader = Data.DataLoader(dataset, batch_size, True)

模型

输入为one-hot
hidden:input * W
output: hidden * V

# Model
class Word2Vec(nn.Module):def __init__(self):super(Word2Vec, self).__init__()# W and V is not Traspose relationshipself.W = nn.Parameter(torch.randn(voc_size, embedding_size).type(dtype))self.V = nn.Parameter(torch.randn(embedding_size, voc_size).type(dtype))def forward(self, X):# X : [batch_size, voc_size] one-hot# torch.mm only for 2 dim matrix, but torch.matmul can use to any dimhidden_layer = torch.matmul(X, self.W) # hidden_layer : [batch_size, embedding_size]output_layer = torch.matmul(hidden_layer, self.V) # output_layer : [batch_size, voc_size]return output_layermodel = Word2Vec().to(device)
criterion = nn.CrossEntropyLoss().to(device)
optimizer = optim.Adam(model.parameters(), lr=1e-3)
# Training
for epoch in range(2000):for i, (batch_x, batch_y) in enumerate(loader):batch_x = batch_x.to(device)batch_y = batch_y.to(device)pred = model(batch_x)loss = criterion(pred, batch_y)if (epoch + 1) % 1000 == 0:print(epoch + 1, i, loss.item())optimizer.zero_grad()loss.backward()optimizer.step()
for i, label in enumerate(vocab):W, WT = model.parameters()x,y = float(W[i][0]), float(W[i][1])plt.scatter(x, y)plt.annotate(label, xy=(x, y), xytext=(5, 2), textcoords='offset points', ha='right', va='bottom')
plt.show()
  • 理论上语义相近的词会更加接近,但是训练数据较少,这里只是简单展示一下效果。

CBOW

与跳字模型最大的不同是,连续词袋模型是用一个中心词在文本序列周围的词 来预测中心词。简单的说就是,跳字模型用中心词预测周围的词;连续词袋模型用周围的词预测中心词。例如,给定文本 “the”,“man”,“hit”,“his”,“son”,连续词袋模型所关心的是,邻近词 “the”,“man”,“his”,“son” 一起生成中心词 “hit” 的概率

连续词袋模型需要最大化由背景词生成任一中心词的概率:
∏t=1TP(w(t)∣w(t−m),...,w(t−1),w(t+1),...,w(t+m))\prod \limits_{t=1}^TP(w^{(t)}|w^{(t-m)},...,w^{(t-1)},w^{(t+1)},...,w^{(t+m)})t=1TPw(t)w(tm),...,w(t1),w(t+1),...,w(t+m)

预训练词向量

word2vec之后,涌现了更多word embedding方式,如Glove、fasttext、ElMo等。如今,已有很多预训练完成的词向量,可直接调用使用,用来初始化,可提升简单网络的收敛速度、精度。

  • 百度AIStudio项目 - 使用预训练词向量优化分类模型效果

参考资料

  1. Word2Vec
  2. word2vec的原理及实现(附github代码)
  3. NLP的初体验

词向量介绍以及Word2Vec的pytorch实现相关推荐

  1. BERT实战(1):使用DistilBERT作为词嵌入进行文本情感分类,与其它词向量(FastText,Word2vec,Glove)进行对比

    这次根据一篇教程Jay Alammar: A Visual Guide to Using BERT for the First Time学习下如何在Pytorch框架下使用BERT. 主要参考了中文翻 ...

  2. 神经网络词向量模型之Word2Vec

    1.前言 基于one-hot对于词汇进行编码的方式着实让人头疼,又无奈.头疼的是占用空间很大,计算量大,无奈的是这么简单粗暴的方式居然一直流传到了现在.今天给大家介绍一款基于神经网络语言模型来生成词向 ...

  3. NLP之词向量:利用word2vec对20类新闻文本数据集进行词向量训练、测试(某个单词的相关词汇)

    NLP之词向量:利用word2vec对20类新闻文本数据集进行词向量训练.测试(某个单词的相关词汇) 目录 输出结果 设计思路 核心代码 输出结果 寻找训练文本中与morning最相关的10个词汇: ...

  4. 从零开始构建基于textcnn的文本分类模型(上),word2vec向量训练,预训练词向量模型加载,pytorch Dataset、collete_fn、Dataloader转换数据集并行加载

    伴随着bert.transformer模型的提出,文本预训练模型应用于各项NLP任务.文本分类任务是最基础的NLP任务,本文回顾最先采用CNN用于文本分类之一的textcnn模型,意在巩固分词.词向量 ...

  5. 【词向量】从Word2Vec到Bert,聊聊词向量的前世今生(一)

     机器学习算法与自然语言处理推荐  来源:https://zhuanlan.zhihu.com/p/58425003 作者:小川Ryan [机器学习算法与自然语言处理导读]BERT并不是凭空而来,如何 ...

  6. bert获得词向量_NLP中的词向量对比:word2vec/glove/fastText/elmo/GPT/bert

    作者:JayLou,NLP算法工程师 知乎专栏:高能NLP之路 https://zhuanlan.zhihu.com/p/56382372 本文以QA形式对自然语言处理中的词向量进行总结:包含word ...

  7. 词向量与词向量拼接_nlp中的词向量对比:word2vec/glove/fastText/elmo/GPT/bert

    本文以QA形式对自然语言处理中的词向量进行总结:包含word2vec/glove/fastText/elmo/bert. 2020年更新:NLP预训练模型的全面总结JayLou娄杰:史上最全!PTMs ...

  8. [NLP]高级词向量表达之Word2vec详解(知识点全覆盖)

    1.词表征(Word Representation) 首先明确句子是 序列化 ,里面携带了大量大信息.在NLP发展的进程里面, 采用了one-hot vector的形式来表示一个句子里面的词是一种方式 ...

  9. NLP系列(10)_词向量之图解Word2vec

    审校:龙心尘 作者:Jay Alammar 编译:张秋玥.毅航.高延 https://blog.csdn.net/longxinchen_ml/article/details/89077048 原文链 ...

最新文章

  1. nmon_analyser 在Aix平台的使用方法
  2. 嵌入式笔录(4)-LC并联电路选频和AM解调
  3. 编写sonar 插件:No SqaleSubCharacteristic annotation was found on class xxx
  4. 机器学习(十一)谱聚类算法
  5. linux系统获取光盘信息api,在Visual C#中运用API函数获取系统信息
  6. JavaScript学习(八)—属性节点和属性值的操作
  7. href 和 src 区别
  8. mysql 删除创建表分区,MySQL分区表创建,分区创建、删除示例
  9. java分页及返回数据封装实例
  10. 修改Maven本地仓库路径,IDEA修改maven位置
  11. windows10卸载edge浏览器并将chrome设为默认浏览器
  12. html超链接自动下划线,html超链接下划线应该加入吗?
  13. mysql查询当前时间的前后几天时间
  14. Python新手的数据批量处理教程(TXT文件)
  15. [Spring Boot 6]企业级开发
  16. 昆明理工大学计算机技术英语翻译,昆明理工大学自动化专业英语翻译学习指导书.ppt...
  17. 吉林大学软件学院编译原理与实现习题(二) 期末复习用
  18. 计算机实验基础1,大学计算机基础上机实验1
  19. python数据收集整理教案_《数据收集整理》精品教案
  20. python获取网页json返回空_Python用requests库爬取返回为空的解决办法

热门文章

  1. 单反相机的传奇—佳能单反50年辉煌之路(连载十八)
  2. python注释第一行_python第一行注释是什么意思?
  3. Word打字延迟卡顿的解决方法
  4. 虚幻gameframe_Unreal Engine 4 Gameplay框架介绍
  5. ORAN架构和功能划分
  6. OM_销售订单的四个主要环节和每个环节用到的常用表
  7. Vue-常用加密(MD5,DES,SHA256,BASE64,SHA1,RSA)
  8. 应用计算机怎么弹ink,Win7系统打开计算机管理提示computer management.Ink的解决方法教程[多图]...
  9. Python Gstreamer播放rtsp视频(含音频)(海康IPCAM)
  10. 微信二维码线下推广是否有效