当前位置:   article > 正文

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

torchtext.vocab.glove

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

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) #不存在该单词出现错误
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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'))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/378329
推荐阅读
相关标签
  

闽ICP备14008679号