Bert模型特征提取代码实现

细节简述

Bert官网已经有训练好的Bert模型,即下载可以使用,在训练模型时,需要保证不对Bert模型参数进行修改。

Bert模型中下载会发现几个文件:

Bert_config.json是存储了Bert的相关模型参数,在后面训练会用到

Bert_model_ckpt等文件是Google保存的一份权重参数

vocat.txt存储的语料库

from transformers import BertModel, BertTokenizer, BertConfig

tokenizer = BertTokenizer.from_pretrained('./model/dl_model/bert')

model = BertModel.from_pretrained('./model/dl_model/bert',)

BERT模型及其衍生体中,输入文本首先经过一个分词处理流程,其中文本被细分为单词或子单词(subwords),每个分词随后映射到一个唯一的整数标识符。这些标识符组成了所谓的input_ids数组,其代表文本的数字化形式。

# 分词

tokenized_text = tokenizer.tokenize(text)

# 转换为ID索引
indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text)

input_ids

为了适应模型处理的需要,input_ids的长度被规范化为一个固定的值。在这个规范化过程中,长度超出预定值的输入会被截断,而短于此长度的输入则通过添加特定的填充标记([PAD],通常对应的整数标识符为0)来补齐。这种处理机制确保了模型输入的一致性,允许模型批量处理不同长度的文本数据。

attention_mask

与input_ids并行的,attention_mask数组标识了模型应当"关注"的输入部分。具体而言,attention_mask对于实际文本内容的位置赋值为1,而对于填充部分则赋值为0。这使得模型能够区分原始文本与为了长度规范化而添加的填充内容,从而仅对有意义的文本部分进行分析。attention_mask在处理可变长文本输入时尤其关键,因为它直接指导模型聚焦于重要的信息,忽视那些无关紧要的填充部分。

inputs = self.tokenizer(

    self.sequences[idx],

    padding='max_length',

    truncation=True,

    return_tensors='pt',

    max_length=128

)

·  self.sequences[idx]: 从序列列表中获取第 idx 个文本序列。

·  self.tokenizer(...): 使用 BERT 分词器对文本进行处理。

  • padding='max_length': 将序列填充到最大长度(128),以确保所有输入具有相同的长度。
  • truncation=True: 如果文本长度超过最大长度,进行截断。
  • return_tensors='pt': 返回 PyTorch 格式的张量。
  • max_length=128: 设置最大序列长度为 128。

input_ids = inputs['input_ids'].squeeze(0)  # 去掉多余的维度

·  inputs['input_ids']: 获取输入的 token IDs。

·  .squeeze(0): 去掉第一维(batch size 为 1 时的多余维度),使得 input_ids 的形状为 (128,)

attention_mask = inputs['attention_mask'].squeeze(0)

·  inputs['attention_mask']: 获取注意力掩码(指示哪些 token 是填充的)。

·  .squeeze(0): 去掉多余的维度,得到的形状同样为 (128,)。

label = torch.tensor(self.labels[idx], dtype=torch.long)  # 转换为 Long 类型

·  self.labels[idx]: 从标签列表中获取第 idx 个标签。

·  torch.tensor(..., dtype=torch.long): 将标签转换为 PyTorch 的 Long 类型张量,以便与模型输出匹配。

return input_ids, attention_mask, label

返回三个元素:输入 IDs、注意力掩码和标签,这些将用于模型训练或推理。

 

 

self.bert(...) 返回的 bert_output 包含两个主要部分:

  1. last_hidden_state:每个 token 的表示,通常用于下游任务(如分类或命名实体识别)。
  2. pooler_output:通常用于句子级别的任务,表示 [CLS] token 的向量。

对于文本情感分类采用哪个呢?既是句子级别任务,又是分类问题

 

代码汇总

class SimpleModel(nn.Module):
    def __init__(self, output_dim, dropout_prob=0.2):
        super(SimpleModel, self).__init__()
        # 从本地加载加载 BERT 模型
        self.bert = BertModel.from_pretrained('./Bert_pretrain')

.....

def forward(self, input_ids, attention_mask):
     with torch.no_grad():
         # 获取 BERT 输出
         bertOutput = self.bert(input_ids=input_ids,   attention_mask=attention_mask)

seq_out,pooled_out = bertOutput[0],bertOutput[1]

......

 

sequences = df['input_sequence'].tolist()
labels = df['is_anomaly'].tolist()
# 划分数据集
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
dataset = CustomDataset(sequences, labels, tokenizer)

# 自定义数据集类
class CustomDataset(Dataset):
    def __init__(self, sequences, labels, tokenizer):
        self.sequences = sequences
        self.labels = labels
        self.tokenizer = tokenizer

    def __len__(self):
        return len(self.sequences)

    def __getitem__(self, idx):
        inputs = self.tokenizer(
            self.sequences[idx],
            padding='max_length',
            truncation=True,
            return_tensors='pt',
            max_length=128
        )
        input_ids = inputs['input_ids'].squeeze(0)  # 去掉多余的维度
        attention_mask = inputs['attention_mask'].squeeze(0)
        label = torch.tensor(self.labels[idx], dtype=torch.long)  # 转换为 Long 类型
        return input_ids, attention_mask, label

 

 

### 回答1: BERT(Bidirectional Encoder Representations from Transformers)是一种基于Transformer模型深度学习算法,能够以无监督的方式预训练出高效的自然语言处理模型。它可以通过预训练模型来提取文本的情感特征,并用于情感分析任务中。 BERT模型通常由多个层级组成,每个层级都包含多个自注意力头和一个前向神经网络。在预训练过程中,它使用基于语料库的Masked语言建模(Masked Language Modeling,MLM)和下一句预测(Next Sentence Prediction,NSP)来学习文本的表示。 在情感分析任务中,可以利用BERT模型的预训练表示来进一步微调模型,以适应特定情感任务。具体实现方法如下: 1.首先,导入所需的库和模型: ``` python import torch from transformers import BertTokenizer, BertModel tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertModel.from_pretrained('bert-base-uncased', output_hidden_states=True) model.eval() ``` 2.接下来,我们可以将需要进行情感分析的文本转换为BERT可接受的输入格式: ``` python text = "I love apples." encoded_text = tokenizer.encode_plus( text, add_special_tokens=True, max_length=32, pad_to_max_length=True, return_attention_mask=True, return_tensors='pt' ) ``` 3.然后,我们可以将该文本输入BERT模型,并获取每个隐藏层的输出: ``` python with torch.no_grad(): outputs = model( input_ids=encoded_text['input_ids'], attention_mask=encoded_text['attention_mask'] ) hidden_states = outputs[2] ``` 4.最后,我们可以将每个隐藏层的输出向量平均,得到整个文本的BERT表示: ``` python sentence_embedding = torch.mean(hidden_states[-1], dim=1) ``` 通过以上步骤,我们可以获取文本的BERT表示,从而进行情感分析等自然语言处理任务。此外,还可以使用BERT的fine-tuning模型来进行情感分析任务,并在实际应用中进行情感文本分类、舆情分析、社交媒体情感分析等场景。 ### 回答2: BERT是一种预训练的基于Transformer的神经网络模型,可以提取文本中的情感特征。下面是一个简单的Python代码示例: ``` import torch from transformers import BertTokenizer, BertModel # 加载BERT模型BertTokenizer model = BertModel.from_pretrained('bert-base-uncased') tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') # 要分析的句子 text = "I love this product! It's amazing!" # 分词和编码 tokens = tokenizer.tokenize(text) input_ids = tokenizer.convert_tokens_to_ids(tokens) input_ids = torch.tensor([input_ids]) # 用BERT进行编码 outputs = model(input_ids) # 提取情感特征 pooler_output = outputs[1] emotion_scores = torch.softmax(pooler_output, dim=1) positive_score = emotion_scores[0][3893].item() # 3893对应"love"的编码 negative_score = emotion_scores[0][5469].item() # 5469对应"amazing"的编码 print('Positive score:', positive_score) print('Negative score:', negative_score) ``` 该代码将文本分词和编码,然后将编码输入BERT模型进行处理。通过提取池化层的输出,可以将整个句子表示为一个向量。最后通过softmax函数得到每个字的情感得分,并输出正面情感得分和负面情感得分。 ### 回答3: BERT是一种基于深度学习的自然语言处理技术,可以用于文本分类、情感分析等任务。如果要使用BERT提取文本情感特征,首先需要进行预处理,将文本转换成BERT可以接受的格式。这可以通过使用BERT的tokenizer实现。 在预处理完成之后,可以使用BERT的预训练模型进行文本情感分析。BERT预训练模型可以通过使用Python中的Transformers库来实现,这个库可以方便地加载BERT预训练模型,并将文本数据输入模型中进行情感分析。 下面是一个简单的BERT情感分析代码示例: ``` from transformers import BertTokenizer, BertForSequenceClassification tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2) text = "这个电影真的很棒!" encoded_text = tokenizer(text, return_tensors='pt') output = model(encoded_text['input_ids'], output_attentions=False, output_hidden_states=False) sentiment = 'positive' if output[0][0][0].item() > output[0][0][1].item() else 'negative' print("情感分析结果:{}".format(sentiment)) ``` 以上代码中,我们首先加载了BERT的tokenizer和预训练模型,然后使用tokenizer将文本转换成模型可以接受的形式。最后,我们将文本数据输入到BERT预训练模型中,并根据输出结果来判断文本情感是正面的还是负面的。 需要注意的是,BERT模型的训练需要大量的计算资源和数据集。如果想要使用BERT进行情感分析等任务,可以选择直接使用预训练好的模型,也可以在自己的语料库上进行微调训练。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值