利用pytorch_pretrained_bert得到wordEmbedding (batch_size,1024),保存为稀疏矩阵sparse.dok_matrix( )

1.注意本方法只适用于保存2维embedding

因为直接将完整的Bert加入到其他模型中,训练时会出现内存不够用的情况,考虑将通过Bert得到的Embedding保存为文件,再在其他模型中导入使用,试过很多保存的方法(numpy.savetxt等),都不成功,最后采用稀疏矩阵sparse.dok_matrix的方式保存wordEmbdedding,然后利用toarray()方法转换为矩阵形式,发现这是一个不错的方法。

2.使用pytorch_pretrained_bert得到embedding的简单流程

//st为一行文本,多行文本加个for循环即可
from pytorch_pretrained_bert import BertTokenizer,BertModel

test_input_ids=[]
tokenizer = BertTokenizer.from_pretrained('bert-large-uncased', do_lower_case=True)

text = tokenizer.tokenize(st)

text_id=tokenizer.convert_tokens_to_ids(text)

test_input_ids.append(text_id)

model=BertModel.from_pretrained('bert-large-uncased')

Input_ids = torch.tensor(test_input_ids).view(1, len(test_input_ids[i]))
//pooled_output即为embedding= [1,分词长度,1024]

all_encoder_layers, pooled_output = model(Input_ids)

//然后将pooled_output降维成[分词长度,1024],再按行累加得到一个embedding=[1,1024]
//传入多行文本,即得到embedding=[batch_size,1024]


3.保存Bert得到的Embedding

import scipy.sparse as sparse


//注意通过Bert之后得到Embedding我处理成了(batch_size,1024)的形式
//每一行代表一个文档向量
//embedding是一个(batch_size,1024)list

sparse_raw_matrix = sparse.dok_matrix((batch_size,1024))
for i in range(0,batch_size):
    for j in range(1024):
        sparse_raw_matrix[i,j]=embedding[i][j]
sparse.save_npz('embedding.npz', sparse_raw_matrix.tocsr())        

4.导入Embedding

import scipy
from scipy import sparse
test=scipy.sparse.load_npz('embedding.npz')
test=test.toarray()

你可能感兴趣的:(Python,自然语言处理(NLP))