bert生成字/词向量以及模型加载的细节

 这是利用bert生成字向量的完整代码

import torch
import numpy as np
from pytorch_pretrained_bert import BertTokenizer, BertModel, BertForMaskedLM

# Load pre-trained model tokenizer (vocabulary)
# tokenizer = BertTokenizer.from_pretrained('F:\\Code\\Bert-Pre-Pytorch\\bert-base-chinese')


def pad_and_truncate(sequence, maxlen, dtype='int64', padding='post', truncating='post', value=0):
    x = (np.ones(maxlen) * value).astype(dtype)
    if truncating == 'pre':
        trunc = sequence[-maxlen:]
    else:
        trunc = sequence[:maxlen]
    trunc = np.asarray(trunc, dtype=dtype)
    if padding == 'post':
        x[:len(trunc)] = trunc
    else:
        x[-len(trunc):] = trunc
    return x


class Tokenizer4Bert:
    def __init__(self, max_seq_len, pretrained_bert_name):
        self.tokenizer = BertTokenizer.from_pretrained(pretrained_bert_name)
        self.max_seq_len = max_seq_len

    def text_to_sequence(self, text, reverse=False, padding='post', truncating='post'):
        sequence = self.tokenizer.convert_tokens_to_ids(self.tokenizer.tokenize(text))
        if len(sequence) == 0:
            sequence = [0]
        if reverse:
            sequence = sequence[::-1]
        return pad_and_truncate(sequence, self.max_seq_len, padding=padding, truncating=truncating)



max_seq_len =18
pretrained_bert_name = "F:\\Code\\Bert-Pre-Pytorch\\bert-base-chinese"
tokenizer = Tokenizer4Bert(max_seq_len,pretrained_bert_name)

text = "[CLS] Who was Jim Henson are you ? [SEP] Jim Henson was a good puppeteer [SEP]"
wenben_one = "你在干什么呢?"
wenben_two = "我好想你呀"
# textone = "[CLS]"+ wenben+ [SEP] 我好想你呀 [SEP]"
textall = "[CLS]" + wenben_one + "[SEP]" + wenben_two + "[SEP]"
model = BertModel.from_pretrained('F:\\Code\\Bert-Pre-Pytorch\\bert-base-chinese')


wenbenALL_indices = tokenizer.text_to_sequence(textall)
# 将第一个转换成编号
wenben_one_indices = tokenizer.text_to_sequence(wenben_one)
wenben_one_len = np.sum(wenben_one_indices != 0)

# 将第二个转换成编号
wenben_two_indices = tokenizer.text_to_sequence(wenben_two)
wenben_two_len = np.sum(wenben_two_indices != 0)

# indexed_tokens = tokenizer.convert_tokens_to_ids(wenbenALL_indices)

#  text_raw_indices = tokenizer.text_to_sequence(textone)  # 词和 序号一一对应
# 通过这样的一番操作  就可以顺利的拿到   “句子位置编码”  也就是第几个句子    000000000000000 1111111111
# 而 句子编码  表示的句子中每一个字 是多少编号   比如  我爱你,你真可爱    逗号也要计算   0 1 2 3 4 5 6 7
bert_segments_ids = np.asarray([0] * (wenben_one_len + 2) + [1] * (wenben_two_len + 1))
bert_segments_ids = pad_and_truncate(bert_segments_ids, tokenizer.max_seq_len)

# 下面这个是死方法  别人自己直接表示出来的
# segments_ids = [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1]
segments_tensors = torch.tensor([bert_segments_ids])
tokens_tensor = torch.tensor([wenbenALL_indices])

#  主模型最后输出所有的标记表示和整体的序列表示,
#  分别用于针对每个标记的预测任务和针对整个序列的预测任务。
outputs, pooled_outputs = model(tokens_tensor, segments_tensors)

print()
print("这就是输入到LSTM里面去的东西  所谓的编码  batchSize  *  hiddenSize")
# print(pooled_outputs)
print(len(pooled_outputs))
print(pooled_outputs.size())# 这是cls
print(outputs)   # output是list   这是一个装了seqlen
print(len(outputs))  #句子长度
print(outputs[0].size())
print(outputs[1].size())



# 标记编码:[101, 146, 112, 182, 6949, 102, 2508, 1315, 119, 102]
# 位置编码:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 句子位置编码:[0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
# 注意力掩码:[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

 下面是文件路径  还有几点需要注意   请大家仔细观察  bert-base-chinese  这个文件夹里面的内容    词表的文件名字需要进行修改

 

 

 这个bert-base-chinese文件里面  只需要有我红色方框 框住的几个文件即可   词表的名字必须改成   vocab.txt  否则这个在加载模型的时候  一定会报错  。提示找不到词表路径。

 

 

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
bert-base-chinese是一个预训练的中文BERT模型,它可以生成中文文本的词向量。 使用bert-base-chinese生成词向量的步骤如下: 1. 安装相应的Python库:tensorflow、keras-bert。 2. 加载预训练好的bert-base-chinese模型。可以使用keras-bert库中的load_trained_model_from_checkpoint函数加载。 3. 使用加载好的模型对文本进行编码,得到文本的词向量。可以使用keras-bert库中的TokenEmbedding函数实现。 4. 对生成词向量进行进一步处理,如降维、聚类等。 下面是一个使用bert-base-chinese生成词向量的示例代码: ```python import tensorflow as tf from keras_bert import load_trained_model_from_checkpoint, Tokenizer, TokenEmbedding # 加载预训练好的bert-base-chinese模型 config_path = 'bert_config.json' checkpoint_path = 'bert_model.ckpt' model = load_trained_model_from_checkpoint(config_path, checkpoint_path) # 定义tokenizer token_dict = {} with open('vocab.txt', 'r', encoding='utf-8') as reader: for line in reader: token = line.strip() token_dict[token] = len(token_dict) tokenizer = Tokenizer(token_dict) # 对文本进行编码,得到词向量 text = '这是一段中文文本。' tokens = tokenizer.tokenize(text) tokens = ['[CLS]'] + tokens + ['[SEP]'] token_ids = tokenizer.tokens_to_ids(tokens) segment_ids = [0] * len(token_ids) inputs = [token_ids, segment_ids] outputs = TokenEmbedding(name='Token')(model.inputs[:2])(inputs) # 打印词向量 print(outputs) ``` 输出结果为一个形状为(1, 9, 768)的张量,其中768表示词向量的维度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值