📜  在Python中使用BERT Tokenizer和TensorFlow 2.0进行文本分类(1)

📅  最后修改于: 2023-12-03 14:51:20.059000             🧑  作者: Mango

在Python中使用BERT Tokenizer和TensorFlow 2.0进行文本分类

在自然语言处理中,文本分类是一个非常重要的任务。通过对文本进行分类,可以识别出文本所属的类别,例如正面评价、负面评价或是其他类别。BERT (Bidirectional Encoder Representations from Transformers) 是一种基于 Transformer 的预训练语言模型,可以非常有效地进行文本分类。

本文将向您介绍如何在 Python 中使用 BERT Tokenizer 和 TensorFlow 2.0 进行文本分类。

安装所需的库

要使用 BERT 进行文本分类,必须安装以下库:

  • tensorflow==2.0.0 或更高版本
  • transformers==2.5.1 或更高版本

您可以使用以下命令在您的 Python 环境中安装这些库:

pip install tensorflow
pip install transformers
准备数据

在进行文本分类之前,必须先准备好训练数据和测试数据。这些数据应该以 CSV 格式保存,其中包含两个列:第一列包含文本,第二列包含标签。

以下是一个示例数据集:

text,label
I loved the movie!,positive
The movie was terrible.,negative

将此数据集保存为 data.csv 文件。

加载数据

要加载 CSV 文件中的数据,在 Python 中使用 pandas 库非常方便。以下是一个示例代码片段,演示如何加载 CSV 数据:

import pandas as pd

# Load data from CSV file
data = pd.read_csv('data.csv')

# Split data into training and testing sets
train_data = data.sample(frac=0.8, random_state=42)
test_data = data.drop(train_data.index)

# Get training and testing labels
train_labels = train_data.pop('label')
test_labels = test_data.pop('label')

# Get training and testing text
train_text = train_data.values.tolist()
test_text = test_data.values.tolist()

此代码片段将数据加载到 train_texttest_text 变量中,并将标签加载到 train_labelstest_labels 变量中。

准备 BERT Tokenizer

在使用 BERT 进行文本分类之前,必须先准备好 BERT Tokenizer。以下是一个示例代码片段,演示如何准备 BERT Tokenizer:

from transformers import BertTokenizer

# Load BERT Tokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased', do_lower_case=True)

# Tokenize training and testing text
train_tokenized_text = [tokenizer.tokenize(text[0]) for text in train_text]
test_tokenized_text = [tokenizer.tokenize(text[0]) for text in test_text]

此代码片段将从 Hugging Face Transformers 库加载 BERT Tokenizer,并将训练和测试文本分别进行标记化处理。

格式化输入

在将训练和测试文本传递给 BERT 进行分类之前,必须先将它们格式化为适当的输入格式。以下是一个示例代码片段,演示如何格式化输入数据:

import tensorflow.keras as keras
import numpy as np

# Define maximum sequence length
max_len = 50

# Convert tokenized training and testing text to input IDs
train_input_ids = [tokenizer.convert_tokens_to_ids(text)[:max_len] for text in train_tokenized_text]
test_input_ids = [tokenizer.convert_tokens_to_ids(text)[:max_len] for text in test_tokenized_text]

# Pad input IDs
train_input_ids = keras.preprocessing.sequence.pad_sequences(train_input_ids, maxlen=max_len, dtype='int32', padding='post', truncating='post')
test_input_ids = keras.preprocessing.sequence.pad_sequences(test_input_ids, maxlen=max_len, dtype='int32', padding='post', truncating='post')

# Convert input IDs to tensors
train_input_ids = tf.convert_to_tensor(train_input_ids)
test_input_ids = tf.convert_to_tensor(test_input_ids)

# Create attention masks
train_attention_masks = np.where(train_input_ids != 0, 1, 0)
test_attention_masks = np.where(test_input_ids != 0, 1, 0)

# Convert attention masks to tensors
train_attention_masks = tf.convert_to_tensor(train_attention_masks)
test_attention_masks = tf.convert_to_tensor(test_attention_masks)

# Convert training and testing labels to one-hot encodings
train_labels = keras.utils.to_categorical(train_labels)
test_labels = keras.utils.to_categorical(test_labels)

此代码片段将标记化的训练和测试文本转换为 BERT 接受的输入格式。它还将标签转换为 one-hot 编码,以便 TensorFlow 2.0 可以正确地训练模型。

训练模型

一旦您准备好了输入数据,就可以使用 TensorFlow 2.0 训练模型了。以下是一个示例代码片段,演示如何使用 BERT 进行文本分类:

from transformers import TFBertForSequenceClassification

# Load BERT model
model = TFBertForSequenceClassification.from_pretrained('bert-base-uncased')

# Freeze BERT layers
for layer in model.layers[:-1]:
    layer.trainable = False

# Define input layers
input_ids = keras.layers.Input(shape=(max_len,), dtype='int32', name='input_ids')
attention_masks = keras.layers.Input(shape=(max_len,), dtype='int32', name='attention_masks')

# Pass inputs through BERT model
outputs = model.bert(input_ids, attention_mask=attention_masks)[1]
outputs = keras.layers.Dense(2, activation='softmax')(outputs)

# Define model
model = keras.models.Model(inputs=[input_ids, attention_masks], outputs=outputs)

# Compile model
model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.Adam(), metrics=['accuracy'])

# Train model
history = model.fit([train_input_ids, train_attention_masks], train_labels, validation_split=0.2, epochs=2, batch_size=32)

此代码片段加载 BERT 模型(TFBertForSequenceClassification),并使用一些额外的 Dense 层将其连接到分类器。它还定义了训练数据的输入层,并使用 compile() 函数指定损失函数、优化器和指标。最后,它调用 fit() 函数来训练模型。

评估模型

一旦您训练了模型,就可以使用测试数据对其进行评估。以下是一个示例代码片段,演示如何使用测试数据评估模型:

# Evaluate model
results = model.evaluate([test_input_ids, test_attention_masks], test_labels)

# Print metrics
for i in range(len(model.metrics_names)):
    print('{}: {}'.format(model.metrics_names[i], results[i]))

此代码片段使用 evaluate() 函数计算模型在测试数据上的准确度和损失值。它还打印了这些指标,以方便您进行评估。

结论

现在您已经了解了如何在 Python 中使用 BERT Tokenizer 和 TensorFlow 2.0 进行文本分类。通过遵循本文中的步骤,您可以轻松地准备您的数据、准备 BERT Tokenizer,然后构建和训练模型。