参考:《深度学习从0到1-基于Tensorflow2》

【参考:深入浅出Word2Vec原理解析 - 知乎】

总结

word2vec的前生 NNLM(神经网络语言模型)

【参考:词向量技术原理及应用详解(二) - 木屐呀 - 博客园】

word2vec有哪几种实现方式?

共两种:
1)用上下文预测中心词cbow(continue bag of word)
2)利用中心词预测上下文 skip-gram

从实现方式上看两者只是输入输出发生了变化。

word2vec的本质是什么?

当然是无监督学习,因为输出并没有label。但是从输入的和输出的形式上来看,输入的是一对对单词,看起来像是有监督,其实并不是。

因为词向量的本质可以看出是一个只有一层的神经网络,因此必须有输入,输出。而训练过程或者说目的不是得到预测结果单词,或对单词进行分类。最为关键的是获得hidden layer的权重。也就是说借助了sequence2sequence模型训练过程,得到hidden layer的权重。

CBOW

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

CBOW 模型是给神经网络传入上下文词汇,然后预测目标词汇

比如我们有一个用于训练的句子是“我爱北京天安门“,可以给模型传入“爱”和“天安门“,然后用”北京“作为要预测的目标词汇。

而最简单的CBOW 模型就是传入前一个词然后再预测后一个词。

Skip-Gram

Skip-Gram 模型是给神经网络传入一个词汇,然后预测其上下文词汇

PyTorch实现(乞丐版)

【参考:nlp-tutorial/Word2Vec-Skipgram.py at master · graykode/nlp-tutorial】

【参考:Word2Vec的PyTorch实现_哔哩哔哩_bilibili】

【参考:Word2Vec的PyTorch实现(乞丐版) - mathor】


总结:

构建word2id
构建数据
- 窗口内的单词为【C-2,C-1,C,C+1,C+2- 数据 [[C,C-2],[C,C-1],[C,C+1],[C,C+2]]
- np.eye(voc_size) 用onehot表示单词送入模型训练
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,'dog':2,...}# Word2Vec Parameters
batch_size = 8
embedding_size = 2  # 2 dim vector represent one word
C = 2 # window size 窗口内的单词为【C-2,C-1,C,C+1,C+2】
voc_size = len(vocab)# 中心词 center
# 背景词 context 即上下文词汇skip_grams = []
# 这里必须起始从第三个词开始,因为window size为2
for idx in range(C, len(word_sequence) - C):# 举例 idx=2 对应word_sequence[idx]单词为'dog',对应的word2idx索引为2 前面两个是'jack', 'like',后面两个是'jack', 'like'center = word2idx[word_sequence[idx]] # center word# [0,1,3,4] 即前C个词和后C个词context_idx = list(range(idx - C, idx)) + list(range(idx + 1, idx + C + 1)) # context word idx 上下文单词的在word_sequence中的下标# word_sequence[i]分别对应'jack', 'like' ,'dog', 'jack' 对应的word2idx索引为0,1,0,1context = [word2idx[word_sequence[i]] for i in context_idx]for w in context:skip_grams.append([center, w])# skip_grams:[[2,0],[2,1],[2,0],[2,1]]def make_data(skip_grams):input_data = []output_data = []for i in range(len(skip_grams)):# eye 是单位矩阵,维度为voc_size 以skip_grams[i][0]的值为下标取出在单位矩阵对应的行向量# 举例 [2,0] skip_grams[0][0]为2,即取出单位矩阵的第三行(相当于把单词用onehot表示)input_data.append(np.eye(voc_size)[skip_grams[i][0]])# 标签值 output_data 即为skip_grams[i][1]:0output_data.append(skip_grams[i][1])return input_data, output_datainput_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)# Model
class Word2Vec(nn.Module):def __init__(self):super(Word2Vec, self).__init__()# W and V is not Traspose relationship# 技巧:先确定输入输出的shape,再来推出超参数的shape# 下面就是先确定输入X和隐藏层输出的shape,再来反推W# 因为X : [batch_size, voc_size],隐藏层需要输出[batch_size, embedding_size],所以W应该是[voc_size,embedding_size]self.W = nn.Parameter(torch.randn(voc_size, embedding_size).type(dtype))# V 同理self.V = nn.Parameter(torch.randn(embedding_size, voc_size).type(dtype))def forward(self, X):# X : [batch_size, voc_size] one-hot  batch_size就相当于图中的minibatch行,图中有voc_size列# 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]# 相当于有voc_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() # WT就是self.Vx,y = float(W[i][0]), float(W[i][1]) # embedding_size = 2print(label)print(x,y)plt.scatter(x, y)plt.annotate(label, xy=(x, y), xytext=(5, 2), textcoords='offset points', ha='right', va='bottom')
plt.show()
1000 0 2.187922716140747
1000 1 2.1874611377716064
1000 2 2.1020612716674805
1000 3 2.1360023021698
1000 4 1.6479374170303345
1000 5 2.1080777645111084
1000 6 2.117255687713623
1000 7 2.5754618644714355
1000 8 2.375575065612793
1000 9 2.4812772274017334
1000 10 2.2279186248779297
1000 11 1.9958131313323975
1000 12 1.9666472673416138
1000 13 1.792773723602295
1000 14 1.9790289402008057
1000 15 2.150097370147705
1000 16 1.8230916261672974
1000 17 1.9916845560073853
1000 18 2.2354393005371094
1000 19 2.253058910369873
1000 20 1.8957509994506836
2000 0 2.1660408973693848
2000 1 1.9071791172027588
2000 2 1.9131343364715576
2000 3 2.0996546745300293
2000 4 1.9192123413085938
2000 5 1.6349347829818726
2000 6 2.433778762817383
2000 7 2.4247307777404785
2000 8 2.1594560146331787
2000 9 1.9543298482894897
2000 10 1.8078333139419556
2000 11 2.490055561065674
2000 12 2.1941933631896973
2000 13 2.463453531265259
2000 14 2.2849888801574707
2000 15 1.7784088850021362
2000 16 1.8803404569625854
2000 17 1.9645321369171143
2000 18 2.036078453063965
2000 19 1.9239177703857422
2000 20 2.261594772338867
animal
-0.5263756513595581 3.4223508834838867
apple
-0.3384515941143036 1.3274422883987427
milk
-1.2358342409133911 0.3438951075077057
hate
-1.556404709815979 9.134812355041504
music
0.31392836570739746 0.2262829840183258
movie
2.375382661819458 1.1577153205871582
dog
-0.9016568064689636 0.2671743929386139
jack
-0.5878503322601318 0.6020950078964233
cat
-0.9074932932853699 0.2849980890750885
banana
0.47850462794303894 1.1545497179031372
book
0.4761728048324585 0.21939511597156525
like
-0.1496874839067459 0.6957748532295227
fish
-2.37762188911438 0.04009028896689415

因为数据集 jack like 动物名 比较多,所以这几个词在空间中也挨得比较近

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"]

for epoch in range(10000):

【NLP】word2vec 模型相关推荐

  1. NLP基础入门:Word2Vec模型

    文章目录 0.结构 1.语言模型基础 1.1.概念 1.2.缺陷 1.3.K-Gram语言模型 1.4.评价指标:困惑度 2.NNLM与RNNLM模型 2.1.NNLM 2.1.1.结构 2.1.2. ...

  2. NLP | Word2Vec之基于Negative Sampling的 CBOW 和 skip-gram 模型

    前面介绍了基于Hierarchical Softmax的 skip-gram 和 CBOW 模型,虽然我们使用霍夫曼树代替传统的神经网络,可以提高模型训练的效率.但是如果我们的训练样本里的中心词www ...

  3. 是否有可能从python中的句子语料库重新训练word2vec模型(例如GoogleNews-vectors-negative300.bin)?

    是否有可能从python中的句子语料库重新训练word2vec模型(例如GoogleNews-vectors-negative300.bin)? http://www.voidcn.com/artic ...

  4. 自然语言处理一大步,应用Word2Vec模型学习单词向量表征

    选自TowardsDataScience,作者:Suvro Banerjee,机器之心编译,参与:Pedro.张倩. 在常见的自然语言处理系统中,单词的编码是任意的,因此无法向系统提供各个符号之间可能 ...

  5. 268G+训练好的word2vec模型(中文词向量)

    268G+训练好的word2vec模型(   从网上了解到,很多人缺少大语料训练的word2vec模型,在此分享下使用268G+语料训练好的word2vec模型. 查看全文 http://www.ta ...

  6. 基于gensim实现word2vec模型(附案例实战)

    目录 什么是word2vec? Word2Vec的原理 gensim实现word2vec模型(实战) 什么是word2vec? Word2Vec是google在2013年推出的一个NLP工具,它的特点 ...

  7. word2vec模型训练保存加载及简单使用

    目录 word2vec模型训练保存加载及简单使用 一 word2vec简介 二.模型训练和保存及加载 模型训练 模型保存和加载 模型的增量训练 三.模型常用API 四.文本相似度计算--文档级别 wo ...

  8. 使用中文维基百科语料库训练一个word2vec模型

    本篇文章主要介绍如何通过中文维基百科语料库来训练一个word2vec模型. 相关资料下载: 中文维基百科下载地址:https://dumps.wikimedia.org/zhwiki/20180720 ...

  9. 使用中文维基百科语料库训练一个word2vec模型 12.1

    转自:https://blog.csdn.net/sinat_29957455/article/details/81432846 本篇文章主要介绍如何通过中文维基百科语料库来训练一个word2vec模 ...

  10. 【地理人工智能交叉】通过整合兴趣点和Word2Vec模型感知城市土地利用的空间分布

    [IJGIS]Sensing spatial distribution of urban land use by integrating points-of-interest and Google W ...

最新文章

  1. Android studio第一次使用配置(三)gradle项目构建
  2. C语言:一个涉及指针函数返回值与printf乱码、内存堆栈的经典案例
  3. WEB前端学习笔记01利用纯CSS书写二级水平导航菜单
  4. 上有硬核理论下能操刀AI落地,这里走出来的人都有“开挂人生”
  5. Spring Boot快速搭建入门程序
  6. PHP获取用户地址方法
  7. 虚幻4皮肤材质_虚幻4渲染编程(材质编辑器篇)【第六卷:各向异性材质amp;玻璃材质】...
  8. 【三】Java运算符
  9. 人工智能将助力智能家居产业发展
  10. 安全架构--14--企业安全管理体系建设总结
  11. layui 表格序号累加 翻页序号也累加
  12. 密码学之前后向安全性
  13. 为什么程序员容易猝死
  14. 在不规则四边形的内部随机一个点
  15. 阿里达摩院最新FEDformer,长程时序预测全面超越SOTA | ICML 2022
  16. html表格内容居中且自动换行
  17. VS 2017生成exe(msi)文件
  18. 网络准入认证系统方案评估_七夕小子_新浪博客
  19. too many unprocessed floats
  20. java实现斗地主发牌项目

热门文章

  1. Vue3 JSON编辑器
  2. VMware workstations pro16.23已经安装vmware tool,Ubuntu仍然无法复制粘贴
  3. python 转doc为txt
  4. 访问线上平台出现http状态码“502”和“504”
  5. appium-desktop 1.13 windows 版本网盘下载
  6. SSH、myBatis下载地址
  7. sha256算法细节详解
  8. 事务实例--银行转账
  9. Docker下载Nginx镜像并运行Nginx容器
  10. 谷歌浏览器官网默认只能下载在线安装包(只有几兆大小)若想下载完整的离线安装包,可以用以下官方链接