如何使用已训练好的预训练词向量

如果你有一个词表,怎么和别人的预训练向量里的词表统一

首先要明确,一个别人训练好的预训练词向量的文件应该是什么样的,分为词和向量两个部分。

下图中的预训练词向量来自于https://github.com/Embedding/Chinese-Word-Vectors

昨天就是词,向量则是其后跟着的数字(图中共300维),查找的时候是根据词来找到对应的向量(可以用python中的字典来存储)。

如何使用已训练好的预训练词向量_第1张图片

 于是会出现两种情况,一种是预训练里有的词我们没有,只需要在读入embedding文件时去掉就好,另一种是我们自己词表里有的预训练向量里没有,一般的做法是赋一个随机向量。

def load_word_embeddings(vocab, dim,embedded_vector_file):
    '''
    对于vocab中的每个词,都去查它的embedding vector
    :param vocab: 我们的词汇表:一个字典,键为词,值为id
    :param dim: embedding向量维数,上文中为300
    :param embedded_vector_file:embedding文件
    :return:embeddings:一个字典,键为词id,值为对应的embedding向量
    '''
    vectors = load_embed_vectors(embedded_vector_file, dim) #一个字典,键为字,值为对应的embedding
    vocab_size = len(vocab)
    embeddings = np.zeros((vocab_size + 1, dim), dtype='float32')
    # 遍历词表,看对应的预训练embedding里有没有,有的话就将对应的位置更新,没有就随机一个
    for word, code in vocab.items():
        if word in vectors:
            embeddings[code] = vectors[word]
        else:
            embeddings[code] = np.random.uniform(-0.25, 0.25, dim)

    return embeddings

如果有一个和别人的预训练向量统一的embedding,怎么插入

import torch.nn as nn
t=torch.tensor(load_word_embeddings(vocab,dim,embedding_file),dtype=torch.float32)
class AModel(nn.Module):
    def __init__(self,vocab_size,embedding_size):
        super(AModel, self).__init__()
        self.emb=nn.Embedding().from_pretrained(t)
    def forward(self,input):
        return self.emb(input)

 

你可能感兴趣的:(人工智能,深度学习)