【从零开始学习深度学习】48.Pytorch_NLP实战案例:如何使用预训练的词向量模型求近义词和类比词
目录
- 1. 下载预训练的词向量
- 2. 应用预训练词向量
- 2.1 求近义词
- 2.2 求类比词
本文将介绍如何使用已经在大规模语料上预训练的词向量模型来求近义词和类比词。
1. 下载预训练的词向量
基于PyTorch的关于自然语言处理的常用包有官方的torchtext以及第三方的pytorch-nlp等等。你可以使用pip
很方便地按照它们,例如命令行执行
pip install torchtext
详情请参见其README。
本节我们使用torchtext进行练习。下面查看它目前提供的预训练词嵌入的名称。
import torch
import torchtext.vocab as vocabvocab.pretrained_aliases.keys()
输出:
dict_keys(['charngram.100d', 'fasttext.en.300d', 'fasttext.simple.300d', 'glove.42B.300d', 'glove.840B.300d', 'glove.twitter.27B.25d', 'glove.twitter.27B.50d', 'glove.twitter.27B.100d', 'glove.twitter.27B.200d', 'glove.6B.50d', 'glove.6B.100d', 'glove.6B.200d', 'glove.6B.300d'])
下面查看查看该glove
词嵌入提供了哪些预训练的模型。每个模型的词向量维度可能不同,或是在不同数据集上预训练得到的。
[key for key in vocab.pretrained_aliases.keys()if "glove" in key]
输出:
['glove.42B.300d','glove.840B.300d','glove.twitter.27B.25d','glove.twitter.27B.50d','glove.twitter.27B.100d','glove.twitter.27B.200d','glove.6B.50d','glove.6B.100d','glove.6B.200d','glove.6B.300d']
预训练的GloVe模型的命名规范大致是“模型.(数据集.)数据集词数.词向量维度”。下面我们使用基于维基百科子集预训练的50维GloVe词向量。第一次创建预训练词向量实例时会自动下载相应的词向量到cache
指定文件夹(默认为.vector_cache
),因此需要联网。
cache_dir = "./Datasets/glove" # 预训练模型的下载目录
# glove = vocab.pretrained_aliases["glove.6B.50d"](cache=cache_dir)
glove = vocab.GloVe(name='6B', dim=50, cache=cache_dir) # 与上面等价
返回的实例主要有以下三个属性:
stoi
: 词到索引的字典:itos
: 一个列表,索引到词的映射;vectors
: 词向量。
打印词典大小。其中含有40万个词。
print("一共包含%d个词。" % len(glove.stoi))
输出:
一共包含400000个词。
我们可以通过词来获取它在词典中的索引,也可以通过索引获取词。
glove.stoi['beautiful'], glove.itos[3366] # (3366, 'beautiful')
2. 应用预训练词向量
下面我们以GloVe模型为例,展示预训练词向量的应用。
2.1 求近义词
为了在求类比词时重用其中的求kkk近邻(kkk-nearest neighbors)的逻辑,我们将这部分逻辑单独封装在knn
函数中。
def knn(W, x, k):# 添加的1e-9是为了数值稳定性cos = torch.matmul(W, x.view((-1,))) / ((torch.sum(W * W, dim=1) + 1e-9).sqrt() * torch.sum(x * x).sqrt())_, topk = torch.topk(cos, k=k)topk = topk.cpu().numpy()return topk, [cos[i].item() for i in topk]
然后,我们通过预训练词向量实例embed
来搜索近义词。
def get_similar_tokens(query_token, k, embed):# query_token:待搜索词# k:最相近的k个词# embed:预训练好的词向量模型topk, cos = knn(embed.vectors,embed.vectors[embed.stoi[query_token]], k+1)for i, c in zip(topk[1:], cos[1:]): # 除去输入词print('cosine sim=%.3f: %s' % (c, (embed.itos[i])))
已创建的预训练词向量实例glove_6b50d
的词典中含40万个词和1个特殊的未知词。除去输入词和未知词,我们从中搜索与“chip”语义最相近的3个词。
get_similar_tokens('chip', 3, glove)
输出:
cosine sim=0.856: chips
cosine sim=0.749: intel
cosine sim=0.749: electronics
接下来查找“baby”和“beautiful”的近义词。
get_similar_tokens('baby', 3, glove)
输出:
cosine sim=0.839: babies
cosine sim=0.800: boy
cosine sim=0.792: girl
get_similar_tokens('beautiful', 3, glove)
输出:
cosine sim=0.921: lovely
cosine sim=0.893: gorgeous
cosine sim=0.830: wonderful
2.2 求类比词
除了求近义词以外,我们还可以使用预训练词向量求词与词之间的类比关系。例如,“man”(男人): “woman”(女人):: “son”(儿子) : “daughter”(女儿)是一个类比例子:“man”之于“woman”相当于“son”之于“daughter”。求类比词问题可以定义为:对于类比关系中的4个词 a:b::c:da : b :: c : da:b::c:d,给定前3个词aaa、bbb和ccc,求ddd。设词www的词向量为vec(w)\text{vec}(w)vec(w)。求类比词的思路是,搜索与vec(c)+vec(b)−vec(a)\text{vec}(c)+\text{vec}(b)-\text{vec}(a)vec(c)+vec(b)−vec(a)的结果向量最相似的词向量。
def get_analogy(token_a, token_b, token_c, embed):vecs = [embed.vectors[embed.stoi[t]] for t in [token_a, token_b, token_c]]x = vecs[1] - vecs[0] + vecs[2]topk, cos = knn(embed.vectors, x, 1)return embed.itos[topk[0]]
验证一下“男-女”类比。
get_analogy('man', 'woman', 'son', glove) # 输出:'daughter'
“首都-国家”类比:“beijing”(北京)之于“china”(中国)相当于“tokyo”(东京)之于什么?答案应该是“japan”(日本)。
get_analogy('beijing', 'china', 'tokyo', glove) # 输出:'japan'
“形容词-形容词最高级”类比:“bad”(坏的)之于“worst”(最坏的)相当于“big”(大的)之于什么?答案应该是“biggest”(最大的)。
get_analogy('bad', 'worst', 'big', glove) # 输出:'biggest'
“动词一般时-动词过去时”类比:“do”(做)之于“did”(做过)相当于“go”(去)之于什么?答案应该是“went”(去过)。
get_analogy('do', 'did', 'go', glove) # 输出:'went'
如果文章对你有帮助,感谢点赞+关注!
欢迎关注下方GZH:阿旭算法与机器学习,共同学习交流~
【从零开始学习深度学习】48.Pytorch_NLP实战案例:如何使用预训练的词向量模型求近义词和类比词相关推荐
- 从零开始搭建深度学习验证码识别模型
文章目录 从零开始搭建深度学习验证码识别模型 CNN模型与图像识别 验证码数据集介绍 生成数据集 生成EasyCaptcha 生成Kcaptcha 搭建模型 EasyNet模型 KCapNet模型 模 ...
- 从零开始编写深度学习库(四)Eigen::Tensor学习使用及代码重构
从零开始编写深度学习库(四)Eigen::Tensor学习使用及代码重构 博客:http://blog.csdn.net/hjimce 微博:黄锦池-hjimce qq:1393852684 一. ...
- 从零开始编写深度学习库(三)ActivationLayer网络层CPU实现
从零开始编写深度学习库(三)ActivationLayer网络层CPU实现 博客:http://blog.csdn.net/hjimce 微博:黄锦池-hjimce qq:1393852684 一 ...
- 从零开始编写深度学习库(二)FullyconnecteLayer CPU编写
从零开始编写深度学习库(二)FullyconnecteLayer CPU编写 博客:http://blog.csdn.net/hjimce 微博:黄锦池-hjimce qq:1393852684 ...
- 从零开始编写深度学习库(一)SoftmaxWithLoss CPU编写
从零开始编写深度学习库(一)SoftmaxWithLoss CPU编写 博客:http://blog.csdn.net/hjimce 微博:黄锦池-hjimce qq:1393852684 一.C ...
- 【从零开始学深度学习编译器】十三,如何在MLIR里面写Pass?
[GiantPandaCV导语]这篇文章是学习了比较久然后按照自己的理解步骤重新总结了下来,主要是MLIR Toy Tutorials第3,4篇文章的内容.这里主要讲解了如何在MLIR中自定义Pass ...
- 【从零开始学深度学习编译器】十二,MLIR Toy Tutorials学习笔记一
本笔记由学习MLIR Tutorials总结而成,欢迎批评指正. Chapter1: Toy语言和AST MLIR提供了一种Toy语言来说明MLIR的定义和执行的流程.Toy语言是一种基于张量的语言, ...
- 从零开始的深度学习(一) 经典CNN网络 LeNet-5
从零开始的深度学习(一) 经典CNN网络 LeNet-5 之前的四篇博客围绕着一个大作业项目来进行的入门,由于小白初涉,因此行文中有时侧重于某些并不重要的东西,同时也忽略了许多其实蛮重要的东西,再加上 ...
- 如何从零开始构建深度学习项目?这里有一份详细的教程
点击上方"迈微AI研习社",选择"星标★"公众号 重磅干货,第一时间送达 来源丨机器之心 在学习了有关深度学习的理论课程之后,很多人都会有兴趣尝试构建一个属于自 ...
最新文章
- 【Network Security!】入侵痕迹清除,修改系统日志
- 30天敏捷结果(4):放弃一些事情
- Android踩坑日记:点击变暗效果的ImageView实现原理
- HCIE Security 二层攻击防范 备考笔记(幕布)
- 【渝粤教育】国家开放大学2018年春季 8639-22T食品营养与健康 参考试题
- tuxedo 强制重启
- Layui table隐藏某一列
- Zookeeper之事件监听机制
- Python爬取当当网图书数据
- 解决vue+php跨域问题
- 监控--CactiEZ使用
- MongoDB之Robo3T客户端安装
- 如何利用任意波形发生器创建你想要的波形并输出
- 韩寒首度回应小三事件:望女友妻子和平相处_陕西频道_凤凰网
- 集群服务器中定时任务多次执行的解决方案
- Android 图片文件读取
- vue3 render函数的写法
- 基于传统方法的单目深度估计
- 指针、野指针、指针常量、常量指针
- 零基础看得懂的C语言入门教程