自然语言处理(NLP)是机器学习的一个子领域,近年来随着深度学习的发展和硬件计算能力的提升而变得流行。NLP涉及计算机科学和计算语言学,使计算机能够理解人类语言的工作原理。近年来,NLP在理解和解释文本、音频和视频文件等多个应用领域发挥了重要作用。
情感分析的重要性
情感分析是NLP中一个关键的应用领域。了解客户对公司产品和服务的行为和需求至关重要。通常,客户对产品的反馈可以分为正面、负面和中立。通过产品评论解读客户反馈,帮助企业评估客户对其产品/服务的满意度。
BERT与TensorFlow在情感分析中的应用
BERT(双向编码器表示的变换器)是由Google基于变换器机制开发的机器学习技术。在情感分析应用中,模型是基于预训练的BERT模型进行训练的。BERT模型已经取代了传统的基于RNN的LSTM网络,后者在处理大型序列文本时会丢失信息。由于其双向方法,BERT能够轻松理解句子中单词的上下文。硬件的进步使得像BERT这样的模型得以构建。
TensorFlow是一个流行的、广泛使用的机器学习框架,用于开发深度学习应用。TensorFlow提供的API使得训练和构建深度神经网络变得相对容易。本文将展示如何使用BERT开发情感分析应用。
模型实现
模型的完整实现是在Google Colab笔记本中完成的。如果想要直接查看代码,可以点击。模型的实现可以分为几个阶段:安装库和依赖项、加载数据集和预处理、文本的标记化和转换为标记、模型训练和优化。
安装库和依赖项
import tensorflow as tf
num_gpus_available = len(tf.config.experimental.list_physical_devices('GPU'))
print("Num GPUs Available: ", num_gpus_available)
assert num_gpus_available > 0
!pip install transformers
from transformers import DistilBertTokenizerFast
from transformers import TFDistilBertForSequenceClassification
import pandas as pd
import numpy as np
首先,将安装所有必要的库和包。这包括安装Transformers,如果还没有安装的话。请注意,模型将需要使用GPU,因此建议在开始在笔记本中运行模型之前将运行时类型更改为GPU。为了确保GPU已启用,可以使用TensorFlowAPI 'tf.config'。
加载数据集和预处理
import tensorflow_datasets as tfds
ds = tfds.load('amazon_us_reviews/Mobile_Electronics_v1_00', split='train', shuffle_files=True)
assert isinstance(ds, tf.data.Dataset)
print(ds)
df = tfds.as_dataframe(ds)
使用的是亚马逊移动/电子产品评论数据集,这是大型亚马逊产品评论的一个子集。数据集已经存储在TensorFlow数据库中,可以直接使用TensorFlow的'tfds' API加载。加载后,需要使用'tfds.as_dataframe' API将其转换为pandas数据框。
数据集包含从产品ID到评论、标题和客户给出的星级评分等多个列。由于只对评论和客户给出的相应评分感兴趣,将删除其他特征列。客户给出的评分是1-5分制(5分最高)。由于将要实现一个二元分类模型,需要将这些评分转换为两个类别,即1和0。评分3分及以上将被标记为正面(1),低于3分将被标记为负面(0)。以下代码将帮助实现这些步骤。
df["Sentiment"] = df["data/star_rating"].apply(lambda score: "positive" if score >= 3 else "negative")
df['Sentiment'] = df['Sentiment'].map({'positive':1, 'negative':0})
df['short_review'] =df['data/review_body'].str.decode("utf-8")
df = df[["short_review", "Sentiment"]]
在数据集中,仍然有大量的客户提供的评论。由于BERT需要高计算能力,并且在数据框上训练需要大量的时间,将从数据集中删除一些行以减少训练时间。
n = 54975
df.drop(df.tail(n).index,
inplace = True)
很好,数据集现在非常适合构建模型。可以使用df.head()查看数据框中的一些元素,以显示前几行。
文本的标记化和转换为标记
reviews = df['short_review'].values.tolist()
labels = df['Sentiment'].tolist()
from sklearn.model_selection import train_test_split
training_sentences, validation_sentences, training_labels, validation_labels = train_test_split(reviews, labels, test_size=.2)
tokenizer = DistilBertTokenizerFast.from_pretrained('distilbert-base-uncased')
tokenizer([training_sentences[0]], truncation=True,
padding=True, max_length=128)
在开始构建模型之前,需要将评论列转换为数值,因为机器学习模型操作的是数值特征。有不同的方式来进行文本向量化过程。一些流行的方法包括词袋模型、TFIDF、Keras的Tokenizer、词嵌入。在应用中,将使用预训练的DistilBert的Tokenizer类。
标记器将句子中的每个单词转换为基于单词在语料库中出现的频率的整数标记/ID。将把特征列和标签转换为一组列表,因为这是标记器需要的数据格式。为了将标记器应用于语料库,将数据集分为训练集和测试集,因为标记器只需要在训练集上拟合,而不需要在测试集上拟合。
模型训练和优化
model = TFDistilBertForSequenceClassification.from_pretrained('distilbert-base-uncased',num_labels=2)
optimizer = tf.keras.optimizers.Adam(learning_rate=5e-5, epsilon=1e-08)
model.compile(optimizer=optimizer, loss=model.compute_loss, metrics=['accuracy'])
model.fit(train_dataset.shuffle(100).batch(16),
epochs=2,
batch_size=16,
validation_data=val_dataset.shuffle(100).batch(16))
model.save_pretrained("./sentiment")
loaded_model = TFDistilBertForSequenceClassification.from_pretrained("./sentiment")
test_sentence = "This is a really good product. I love it"
predict_input = tokenizer.encode(test_sentence,
truncation=True,
padding=True,
return_tensors="tf")
tf_output = loaded_model.predict(predict_input)[0]
tf_prediction = tf.nn.softmax(tf_output, axis=1)
labels = ['Negative','Positive']
label = tf.argmax(tf_prediction, axis=1)
label = label.numpy()
print(labels[label[0]])