bert得到向量

2021-10-07 17:05:43 字數 2224 閱讀 8923

from bert_demo import modeling

from bert_demo import tokenization

import numpy as np

import tensorflow as tf

class bert_vec():

def __init__(self):

# graph

self.input_ids = tf.placeholder(tf.int32, shape=[none, none], name='input_ids')

self.input_mask = tf.placeholder(tf.int32, shape=[none, none], name='input_masks')

self.segment_ids = tf.placeholder(tf.int32, shape=[none, none], name='segment_ids')

bert_config = modeling.bertconfig.from_json_file('chinese_l-12_h-768_a-12/bert_config.json')

# 初始化bert

self.model = modeling.bertmodel(

config=bert_config,

is_training=false,

input_ids=self.input_ids,

input_mask=self.input_mask,

token_type_ids=self.segment_ids,

use_one_hot_embeddings=false

)# bert模型位址

init_checkpoint = "chinese_l-12_h-768_a-12/bert_model.ckpt"

# 模型的訓練引數

tvars = tf.trainable_variables()

# 載入模型

(assignment_map, initialized_variable_names) = modeling.get_assignment_map_from_checkpoint(tvars,init_checkpoint)

tf.train.init_from_checkpoint(init_checkpoint, assignment_map)

self.sess = tf.session()

self.sess.run(tf.global_variables_initializer())

def get_embedding(self,char_lists,mask_lists,seg_lists):

# 獲取最後一層和倒數第二層

encoder_last_layer = self.model.get_sequence_output()

# encoder_last2_layer = model.all_encoder_layers[-2]

feed_data =

embedding = self.sess.run(encoder_last_layer, feed_dict=feed_data)

return embedding

if __name__ == '__main__':

#資料處理

string = '設定乙個隨機種子'

char_list = ['[cls]'] + list(string) +['[sep]']

#不做masked處理

mask_list = [1] * (len(string)+2)

#不做分詞處理

seg_list = [0] * (len(string)+2)

# 根據bert的詞表做乙個char_to_id的操作

# 未登入詞會報錯,更改報錯**使未登入詞時為'[unk]'

# 也可以自己實現

token = tokenization.fulltokenizer(vocab_file='chinese_l-12_h-768_a-12/vocab.txt')

char_list = token.convert_tokens_to_ids(char_list)

bertvec = bert_vec()

#得到bert的embedding

embedding = bertvec.get_embedding([char_list], [mask_list], [seg_list])

BERT 輸出 句向量,字元向量

有什麼區別?bert輸出的句向量是什麼樣的?output layer model.get sequence output 這個獲取每個token的output 輸出 batch size,seq length,embedding size 如果做seq2seq 或者ner 用這個 output la...

bert生成句子向量

2.如何使用bert的詞向量 3.直接使用bert原始碼生成詞向量 bert本質上是乙個兩段式的nlp模型。第乙個階段叫做 pre training,跟wordembedding類似,利用現有無標記的語料訓練乙個語言模型。第二個階段叫做 fine tuning,利用預訓練好的語言模型,完成具體的nl...

使用BERT獲取中文詞向量

bert其中的乙個重要作用是可以生成詞向量,它可以解決word2vec中無法解決的一詞多義問題。然而bert獲取詞向量的門檻要比word2vec要高得多。筆者在這裡介紹一下如何獲取bert的詞向量。筆者在獲取bert詞向量的時候用到了肖涵博士的bert as service,具體使用方式如下。接著可...