pyTorch 导入预训练词向量

pyTorch 导入预训练词向量

现在的预训练词向量很多,如glove,word2vec等。在做实验时,这次词向量基本能够满足自己的需求,只需要从特定的网址把预训练词向量下载下来即可。

笔者就是遇到了这样的一个需求,在torch中使用预训练的词向量。于是写下此份笔记,便于后面查询。

一、官方API以及示例

先从torch的API看起:

from_pretrained(embeddings, freeze=True, padding_idx=None, max_norm=None, 
norm_type=2.0, scale_grad_by_freq=False, sparse=False)

主要介绍一下freeze 这个参数:若为True,那么这个词向量文件在不会在后续被训练。

>>> # FloatTensor containing pretrained weights
>>> weight = torch.FloatTensor([[1, 2.3, 3], [4, 5.1, 6.3]])
>>> embedding = nn.Embedding.from_pretrained(weight)
>>> # Get embeddings for index 1
>>> input = torch.LongTensor([1])
>>> embedding(input)
tensor([[ 4.0000,  5.1000,  6.3000]])

上面是官方给出的代码的实例。

二、导入word2vec或者glove预训练词向量

那么怎么使用自己所下载或者是训练的词向量文件呢?这里需要使用word2vec来作为中间桥梁,具体的导入代码如下,代码里面存在较为详细的注释,一般看一下就可以懂的:

````python
import torch
import gensim
import torch.nn as nn

wvmodel = gensim.models.KeyedVectors.load_word2vec_format("data/word2vec/word2vec.bin",binary=False,encoding='utf-8')
# 需要在字典的位置加上1是需要给UNK添加一个位置
vocab_size=len(wvmodel.vocab)+1
vector_size=wvmodel.vector_size

# 随机生成weight
weight = torch.randn(vocab_size, vector_size)

words=wvmodel.wv.vocab

word_to_idx = {
     word: i+1 for i, word in enumerate(words)}
# 定义了一个unknown的词.
word_to_idx[''] = 0
idx_to_word = {
     i+1: word for i, word in enumerate(words)}
idx_to_word[0] = ''

for i in range(len(wvmodel.index2word)):
    try:
        index = word_to_idx[wvmodel.index2word[i]]
    except:
        continue
    vector=wvmodel.wv.get_vector(idx_to_word[word_to_idx[wvmodel.index2word[i]]])
    weight[index, :] = torch.from_numpy(vector)

embedding = nn.Embedding.from_pretrained(weight,freeze=True)

好了,结束,希望能帮到你。

你可能感兴趣的:(Deep,learning,自然语言处理,pytorch,深度学习)