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,具體使用方式如下。接著可...