参考:link
1、获取glove预训练内容,并解压得到多份txt文件,不同文件包含的向量信息长度是不同的。
wget http://nlp.stanford.edu/data/glove.6B.zip
unzip glove.6B.zip
2、从50维的文件中读取单词表vocab
和每个单词的预训练向量信息embeddings
。
vocab,embeddings = [],[]
with open('glove.6B.50d.txt','rt') as fi:
full_content = fi.read().strip().split('\n')
for i in range(len(full_content)):
i_word = full_content[i].split(' ')[0]
i_embeddings = [float(val) for val in full_content[i].split(' ')[1:]]
vocab.append(i_word)
embeddings.append(i_embeddings)
3、将list转化为numpy形式
import numpy as np
vocab_npa = np.array(vocab)
embs_npa = np.array(embeddings)
4、向词汇表中添加特定的新词
#insert '<pad>' and '<unk>' tokens at start of vocab_npa.
vocab_npa = np.insert(vocab_npa, 0, '<pad>')
vocab_npa = np.insert(vocab_npa, 1, '<unk>')
print(vocab_npa[:10])
pad_emb_npa = np.zeros((1,embs_npa.shape[1])) #embedding for '<pad>' token.
unk_emb_npa = np.mean(embs_npa,axis=0,keepdims=True) #embedding for '<unk>' token.
#insert embeddings for pad and unk tokens at top of embs_npa.
embs_npa = np.vstack((pad_emb_npa,unk_emb_npa,embs_npa))
print(embs_npa.shape)
5、使用glove词汇表对dataset中的token进行编码。使用词汇表的向量信息初始化nn.embedding
# 1 对token编码
tokenid = np.where(vocab_npa==token)[0][0]
# 2 初始化模型embedding层参数
self.embed = nn.Embedding.from_pretrained(torch.from_numpy(embs_npa).float())
6、保存词汇表,以便以后使用
with open('vocab_npa.npy','wb') as f:
np.save(f,vocab_npa)
with open('embs_npa.npy','wb') as f:
np.save(f,embs_npa)