bert实现词嵌入及其参数详解

文章详细介绍了如何加载BERT预训练模型和tokenizer,使用tokenizer.encode_plus将文本转化为模型输入格式,以及如何通过BERT模型获取文本的隐藏状态表示,为后续的NLP任务提供特征。
摘要由CSDN通过智能技术生成

实现步骤

  1. 加载BERT预训练好的模型和tokenizer
    如果你已经将bert的预训练模型下载到本地,那么你可以从本地加载
tokenizer = BertTokenizer.from_pretrained('/home/wu/david/demo/bert_base_chinese')
model = BertModel.from_pretrained('/home/wu/david/demo/bert_base_chinese')

如果没有下载,也可以在线加载

tokenizer = BertTokenizer.from_pretrained('bert_base_chinese')
model = BertModel.from_pretrained('bert_base_chinese')
  1. 使用tokenizer.encode_plus将每个文本转换为BERT输入格式
inputs = tokenizer.encode_plus(
        text,
        add_special_tokens=True,
        max_length=512,
        padding='max_length',
        truncation=True,
        return_attention_mask=True,
        return_tensors='pt',
    )

解释一下每个参数的意义:

  • text:要编码的文本字符串。
  • add_special_tokens:指示是否在编码中添加特殊令牌(如 [CLS] 和 [SEP])。默认为 True。在BERT中,特殊令牌用于标识句子的开头和结尾,以及句子对任务中的分隔符。
  • max_length:编码后的最大长度。如果文本长度超过此值,将进行截断。默认为 None,表示不进行截断。
  • padding:指示是否对编码进行填充,使其达到 max_length。默认为 False。如果设置为 ‘max_length’,则会将文本填充到 max_length 的长度。填充通常在批处理中使用,确保批处理中的所有样本具有相同的长度。
  • truncation:指示是否对文本进行截断,使其达到 max_length。默认为 False。如果设置为 True,则会将文本截断到 max_length 的长度。
  • return_attention_mask:指示是否返回注意力掩码。默认为 False。如果设置为 True,则会返回一个表示注意力掩码的张量。注意力掩码标识出哪些令牌是真实输入,哪些是填充的,以便模型在处理时忽略填充令牌。
  • return_tensors:指定返回的编码结果的张量类型。可选值为 “tf”(返回 TensorFlow 张量)或 “pt”(返回 PyTorch 张量)。默认为 None,表示返回标准 Python 列表。

inputs返回值有三部分:

  • input_ids:编码后的文本的令牌 ID 列表,可以被模型直接使用。
  • attention_mask:(可选)如果 return_attention_mask=True,则返回一个表示注意力掩码的列表。该列表标识出编码中哪些令牌应该被模型关注,哪些应该被忽略。
  • token_type_ids:(可选)如果 return_token_type_ids=True,则返回一个表示句子类型的列表。在句对任务中,它标识出不同句子的令牌属于哪个句子。
  1. 使用BERT模型进行嵌入
        #调用模型,传入上一步得到的inputs
        outputs = model(**inputs)
        # 获取最后一个隐藏层表示,其形状为 [batch_size, sequence_length, hidden_size]
        last_hidden_state = outputs.last_hidden_state 
        print(last_hidden_state.shape)
        token_embeddings = torch.squeeze(last_hidden_state, dim=0) #去掉batch_size这个维度,得到BERT模型编码后的每个令牌的隐藏状态表示

注:

  • last_hidden_state 代表了BERT模型对输入文本的编码表示,其维度为[batch_size, sequence_length, hidden_size],其中,batch_size表示批处理中的样本数量;sequence_length表示每个样本的序列长度,即输入文本的令牌数量;hidden_size表示BERT模型的隐藏状态的维度大小,通常是预训练模型的参数之一。
  • torch.squeeze() 是一个PyTorch函数,用于从张量中移除维度为1的维度,因此,token_embeddings 是经过挤压后的最后一个隐藏状态张量,形状为 [sequence_length, hidden_size],表示BERT模型编码后的每个令牌的隐藏状态表示

完整代码

import torch
import torch.nn as nn
from transformers import BertTokenizer, BertModel
import pandas as pd
from torch.utils.data import Dataset,DataLoader

# 本地加载BERT模型和tokenizer
tokenizer = BertTokenizer.from_pretrained('/home/wu/david/demo/bert_base_chinese')
model = BertModel.from_pretrained('/home/wu/david/demo/bert_base_chinese')

# 在线加载BERT模型和tokenizer
# tokenizer = BertTokenizer.from_pretrained('bert_base_chinese')
# model = BertModel.from_pretrained('bert_base_chinese')

data=["欢迎学习bert!","万丈高楼平地起,成功只能靠自己","希望我们都有一个光明的未来!"]

for index,text in enumerate(data):
    print("对第",index,"个文本进行词嵌入...")

    # tokenizer.encode_plus负责将每个文本转换为BERT输入格式
    inputs = tokenizer.encode_plus(
        text,
        add_special_tokens=True,
        max_length=512,
        padding='max_length',
        truncation=True,
        return_attention_mask=True,
        return_tensors='pt',
    )
    with torch.no_grad():
        # 使用BERT模型进行嵌入
        outputs = model(**inputs)
        # 获取最后一个隐藏层表示,其形状为 [batch_size, sequence_length, hidden_size]
        last_hidden_state = outputs.last_hidden_state
        print(last_hidden_state.shape)
        token_embeddings = torch.squeeze(last_hidden_state, dim=0)
BERT,即Bidirectional Encoder Representations from Transformers,是由Google提出的深度学习模型,它预先训练了一个大型的自然语言处理模型,可以生成高质量且有意义的词嵌入BERT中文词嵌入则是通过预训练的方式将中文文本转换为词向量,使其可以在中文文本分类等任务中得到应用。 朴素贝叶斯分类器是一种简单但效果不错的文本分类算法,它最初被用于垃圾邮件过滤,但也适用于其他的自然语言处理任务。它的核心思想是通过先验概率和条件概率来推断出文本的类别。在这里,我们可以使用朴素贝叶斯分类器来将BERT中文词嵌入应用于中文文本分类。 首先,我们需要提供一个训练集和一个测试集。训练集包含一些已经被分好类的中文文本数据,每个文本都对应一个标签,比如新闻、体育、娱乐等。测试集则包含一些待分类的中文文本数据。 接下来,我们将训练集的中文文本数据输入BERT中文词嵌入模型中,得到每个文本对应的词向量表示。然后,我们使用这些词向量表示来训练朴素贝叶斯分类器,得到每个类别的先验概率和条件概率。 最后,我们将测试集的中文文本数据也输入BERT中文词嵌入模型中,得到每个文本对应的词向量表示。然后,我们使用先验概率和条件概率来预测每个文本的类别。最终,我们可以计算出分类器的准确率、召回率和F1值等评价指标。 总之,BERT中文词嵌入搭配朴素贝叶斯分类器可以用于中文文本分类等任务,它可以提高分类器的准确度和效率。它也可以应用于其他的自然语言处理任务,比如命名实体识别、情感分析等。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂的小强呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值