您的位置:首页 > 其它

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'))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: