gensim匯入pytorch embedding

qq_43645301發表於2020-09-24

gensim 匯入word2vec模型

使用KeyedVector.load_word2vec_format() ,這樣將模型載入到一個keyvector例項中

import gensim
model = gensim.models.KeyedVectors.load_word2vec_format('vectors.bin', binary=True)

此處匯入了 word2vec的模型,vectors.bin是模型檔案

  • 如果是glove檔案應該怎麼辦呢
    如果我們的glove檔案是一個txt檔案,那麼就需要將它轉成word2vec的形式
import gensim
glove_file = 'test_glove.txt'
word2vec_file = 'word2vec.txt'#這是轉換後的檔名
from gensim.scripts.glove2word2vec import glove2word2vec
glove2word2vec(glove_file, word2vec_file )

# 載入轉化後的檔案
model = KeyedVectors.load_word2vec_format(tmp_file) #這樣就可以將glove檔案載入
  • 也可以將glove檔案儲存使用save_word2vec_format儲存詞向量檔案
model.wv.save_word2vec_format("model.bin", binary=True)

下次載入時,直接從model.bin中獲取即可。

gensim 構建pytorch的預訓練embedding

  • 首先,一般可以統計出我們的訓練語料的詞表vocab,將它與gensim載入的詞表求交集,這樣可以減少embedding的大小
  • 匯入pytorch nn.embedding的程式碼
def creat_embedding():#注意要先確定好訓練語料裡面有的單詞
    word_vectors =torch.randn([vocab_size,300])# 這裡的vocab_size 是指 訓練語料的vocabsize
    word_to_idx = train_word2idx
    word_vectors[1,:] = torch.zeros([1,300]) # 這裡是讓 第1個向量成為0向量,此處是<pad>
    for i in range(2,vocab_size):
        
        word = train_idx2word[i]
        if word in wvmodel:

            vector = wvmodel[word]
            word_vectors[i,:] = torch.from_numpy(vector)
            
    print(word_vectors.size())
    #embedding = nn.Embedding.from_pretrained(word_vectors)
    
    #embedding.weight.requires_grad = True
    return word_vectors,word_to_idx  #最終輸出一個詞表和一個arrary 用於輸入embedding

最後使用nn.Embedding.from_pretrained(weight) weight 需要是tensor

相關文章