如果你有一个词表,怎么和别人的预训练向量里的词表统一
首先要明确,一个别人训练好的预训练词向量的文件应该是什么样的,分为词和向量两个部分。
下图中的预训练词向量来自于https://github.com/Embedding/Chinese-Word-Vectors
昨天就是词,向量则是其后跟着的数字(图中共300维),查找的时候是根据词来找到对应的向量(可以用python中的字典来存储)。
于是会出现两种情况,一种是预训练里有的词我们没有,只需要在读入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)