NLP入门-情感分析系列教程-A Closer Look at Word Embeddings学习笔记
2020-07-29 10:12
686 查看
之前的教程中非常简要地介绍了如何使用词嵌入(也称为词向量),附录中将仔细研究这些嵌入原理。
Embedding层将一个稀疏的one-hot向量转变为维度更低的稠密向量,出现在相似上下文中词的词向量空间是接近的,例如:
"I purchased some items at the shop"和
"I purchased some items at the store"两句中
'shop'和
'store'在向量空间中是相邻的。
在PyTorch中使用
nn.Embedding layer将
[句长, 批处理大小]大小的张量转换为
[句长, 批处理大小, 向量维度]的张量
在之前的教程中,我们还使用了TorchText提供的预训练单词嵌入(如GloVe向量)。 这些词嵌入已经在巨大的语料库上进行了训练。 我们可以在任何模型中使用这些经过预训练的向量,由于它们已经学习了每个词的上下文,因此提供更好的词向量初始状态,这通常可以缩短训练时间和提高准确性。但在本篇教程中不使用预训练词向量。
1 - 加载Glove
import torchtext.vocab # 6B是语料库中包含60亿个单词 # 其维度有 50, 100, 200 ,300 本文选择100 glove = torchtext.vocab.GloVe(name='6B',dim=100) print(f'There are {len(glove.itos)} words in the vocabulary') #词汇表中同样可以使用索引获取单词 #先获取与单词索引,然后使用该索引获得词向量 def get_vector(embeddings, word): #若词汇表中不包含所查询单词则会引发错误 assert word in embeddings.stoi, f'*{word}* is not in the vocab!' return embeddings.vectors[embeddings.stoi[word]] #获取词向量 print(get_vector(glove, 'the').shape) print(get_vector(glove, 'the')) #print(get_vector(glove, 'Hyper-enhancement').shape) #不存在该单词出现错误
2 - 相似文本
如果要查找与某个输入单词相似的单词,请先找到该输入单词的向量,然后遍历词汇表,计算每个单词的向量与输入单词向量之间的距离,从最远到最远进行排序。
import torch #最接近的10个单词返回到输入单词向量 def closest_words(embeddings, vector, n=10): distances = [(word, torch.dist(vector, get_vector(embeddings, word)).item()) for word in embeddings.itos] return sorted(distances, key=lambda w: w[1])[:n] word_vector = get_vector(glove, 'korea') print(closest_words(glove, word_vector))
3 - 类比
def analogy(embeddings, word1, word2, word3, n=5): # get vectors for each word word1_vector = get_vector(embeddings, word1) word2_vector = get_vector(embeddings, word2) word3_vector = get_vector(embeddings, word3) # calculate analogy vector analogy_vector = word2_vector - word1_vector + word3_vector # find closest words to analogy vector candidate_words = closest_words(embeddings, analogy_vector, n + 3) # filter out words already in analogy candidate_words = [(word, dist) for (word, dist) in candidate_words if word not in [word1, word2, word3]][:n] print(f'{word1} is to {word2} as {word3} is to...') return candidate_words print_tuples(analogy(glove, 'man', 'king', 'woman'))
相关文章推荐
- NLP:文本情感分析快速入门
- NLP入门-文本翻译系列教程-Sequence to Sequence Learning with Neural Networks学习笔记
- 数据挖掘入门系列教程(一)之亲和性分析
- ArcGIS Python API可视化及分析系列教程(一):入门与简介
- 大数据入门环境搭建整理、大数据入门系列教程合集、大数据生态圈技术整理汇总、大数据常见错误合集、大数据的离线和实时数据处理流程分析
- ArcGIS Python API可视化及分析系列教程(一):入门与简介(2)安装与配置
- NLP入门(十)使用LSTM进行文本情感分析
- Django系列教程:一、Django的安装和入门
- 【Web API系列教程】1.1 — ASP.NET Web API入门
- Spring MVC 基础教程,快速入门,深入分析
- 基于DDD的现代ASP.NET开发框架--ABP系列之2、ABP入门教程
- iPhone开发入门守则:Objective-C编码规范--系列教程
- python数据分析系列教程(3) —— Pandas模块1
- Spring MVC 教程,快速入门,深入分析
- 云星数据---Scala实战系列(精品版)】:Scala入门教程059-Scala实战源码-Scala package 包
- Quartz.NET 架构与源代码分析系列 part 1 :Quartz.NET 入门
- Spring MVC 教程,快速入门,深入分析
- Spring MVC 教程,快速入门,深入分析
- Joe's OpenGL ES 2.0 系列经典入门教程(第一课:Introduction)
- ActiveMQ 快速入门教程系列 第二章 发布-订阅者模式实现