NLP入门-情感分析系列教程-A Closer Look at Word Embeddings学习笔记

之前的教程中非常简要地介绍了如何使用词嵌入(也称为词向量),附录中将仔细研究这些嵌入原理。

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'))
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值