使用BERT轻松快速地实现针对Yelp评论的多类别文本情感分析。在本文中,我们将使用BERT在Yelp评论上开发多类文本分类。
BERT概述
BERT是用于通用“语言理解” 的深度双向表示模型,可从左至右和从右至左学习信息。BERT是从BooksCorpus(800M字)和English Wikipedia(25亿字)中提取的未标记数据进行预训练的
BERT有两种型号
基于BERT的编码器:12个编码器和12个双向自动关注头BERT大型:24个编码器,带有24个双向自动关注头基于BERT的版本和基于BERT的版本都具有Cased和Uncased版本。
BERT在WordPiece标记化之前对文本进行小写的情况下,不进行大小写转换。例如,“詹姆斯·邦德”变成“詹姆斯·邦德”。它还会删除重音标记。BERT-Cased保留了真实的表壳和重音标记。通常,除非用例要求保留对NLP任务至关重要的用例信息,否则我们将使用BERT-Uncased。
BERT的基本设置
我们需要Tensorflow 1.11或更高版本才能使BERT代码正常工作。
在下载了预训练的权重和数据集之后,我们需要对多类分类进行一些更改。
我们克隆或下载的代码将具有一个文件run_classifier.py。我们需要更新ColaProcessor 类中的方法get_labels(),如下所示,以进行多类文本分类
二进制分类的原始代码
def get_labels(self):return [“0”, “1”]
用于多类别文本分类的修改代码
def get_labels(self):return [“0”, “1”, “2”, “3”, “4”]
为BERT建立数据集
导入所需的库以进行数据处理
import numpy as npimport pandas as pdfrom sklearn.preprocessing import LabelEncoderfrom sklearn.model_selection import train_test_split
读取Yelp复习训练并测试从文件中提取的数据
data_train= pd.read_csv(“yelp_review_full_csv\\train.csv”, header=None)data_test= pd.read_csv("yelp_review_full_csv\\test.csv", header=None)data_train.head(5)
查找类标签的唯一值
data_train[0].unique()
data_train[0] = (data_train[0] -1)
data_test[0] = (data_test[0] -1)data_train[0].unique()
更新BERT代码以进行多类文本分类
在文件run_classifier.py中,修改类ColaProcessor中的get_labels()方法并更新标签以匹配火车数据中的内容
def get_labels(self):
return [“0”, “1”, “2”, “3”, “4”]
在BERT中处理不同NLP任务的类要求数据采用.tsv(制表符分隔值)文件格式的特定格式。
列0:GUID:该行的ID。训练和测试数据均必需第1列:该行的类标签。此列值应与文件run_classifier.py的类ColaProcessor中的get_labels()方法中指定的值匹配。仅对于火车数据是必需的。列2:alpha:这是用于文本分类的虚拟列,但是BERT的训练数据需要第3列:文本:这是要分类的文本。培训和测试数据都需要此列构建BERT数据集以进行培训,开发和测试BERT需要三个不同的数据集:用于训练的训练和开发以及用于预测的测试
#根据BERT数据要求以正确的顺序添加所需的列来创建数据帧
df_bert = pd.DataFrame({‘id’:range(len(data_train)), ‘label’:data_train[0], ‘alpha’:[‘a’]*data_train.shape[0], ‘text’: data_train[1].replace(r’\n’, ‘ ‘, regex=True)})df_bert.head()
数据符合BERT要求的格式
将数据拆分为训练和开发或评估数据集
# Splitting training data file into *train* and *test*
df_bert_train, df_bert_dev = train_test_split(df_bert, test_size=0.01)
建筑测试数据集
我们在测试数据集中只需要两列
列0:GUID:该行的ID。第1列:文本:这是要分类的文本。#根据BERT创建测试数据帧
# Creating test dataframe according to = pd.DataFrame({‘id’:range(len(data_test)), ‘text’: data_test[1].replace(r’\n’, ‘ ‘, regex=True)})df_bert_test.tail()
根据BERT测试数据集
将数据帧保存到.tsv文件中,没有用于train和dev的标题,但是文件test.tsv文件需要该标题
#保存dataframes到.tsv格式格式所要求的BERT
df_bert_train.to_csv(‘yelp_review_full_csv\\train.tsv’, sep=’\t’, index=False, header=False)df_bert_dev.to_csv(‘yelp_review_full_csv\\dev.tsv’, sep=’\t’, index=False, header=False)df_bert_test.to_csv(‘yelp_review_full_csv\\test.tsv’, sep=’\t’, index=False, header=True)
训练BERT模型
我们将加载经过预训练的基于BERT的Uncased模型权重,并在Yelp审查数据集上训练模型。让我们了解我们需要为训练设置的参数。
我们需要训练多类文本分类,因此我们将使用run_classifier.py文件。
1. task_name:这是我们计划用于培训的任务。选项是
CoLA:语言可接受性语料库是一个二进制的单句分类任务,即ColaProcessor类。目的是预测英语句子在语言上是否“可以接受”MNLI:多体类自然语言推理是一项大规模的,众包的蕴含分类任务。给定一对句子,目标是预测第二个句子相对于第一个句子是包含,矛盾还是中立的MRPC:Microsoft研究释义语料库由自动从在线新闻源中提取的句子对组成。目的是检查该对中的句子在语义上是否等效XNLI:跨语言自然语言推理使用15种语言的跨语言句子分类。2. do_train:将其设置为True进行培训。这将使用train.tsv文件进行培训
3. do_eval:将其设置为True以进行评估。这将使用dev.tsv文件进行评估
4. data_dir:包含.tsv文件中数据的目录
5. vocab_file:指定vocab.txt文件。Vocab.txt使用BERT提供的vocab文件将单词映射到索引。词汇表中有119,547个单词令牌
6. bert_config_file:包含BERT模型的参数值。BERT预训练模型具有此文件
7. init_checkpoint:初始检查点,通常从预先训练的检查点开始。如果您从上次中断的地方恢复训练过程,或者训练被中断,请提及最后一个检查点文件名。
8. max_seq_length:所发布的模型经过训练,序列长度最大为512,但是您可以使用更短的最大序列长度进行微调以节省大量内存。较长的序列不成比例地昂贵,因为注意力是序列长度的平方。填充比指定长度短的序列
9. train_batch_size:培训的总批次大小。内存使用量也与批量大小成正比。默认值为32。指定此参数仅用于训练。
10. learning_rate:Adam的初始学习率。默认学习率是0.00005。指定此参数仅用于训练。
11. num_train_epochs:要执行的训练时期的总数。指定此参数仅用于训练。
12. output_dir:将在其中写入模型检查点的输出目录以及评估数据集的详细信息。您需要先创建此目录,然后再指定它用于训练或推理。
13. do_lower_case:是否小写输入文本。对于无案例模型,应为True;对于有案例模型,应为False。仅指定培训。
14. save_checkpoints_steps:指定保存模型检查点的频率。仅指定培训。
要进行培训,请在命令提示符处使用以下命令
python run_classifier.py--task_name=cola --do_train=true --do_eval=true --data_dir=\yelp_review_full_csv\ --vocab_file=\BERT\\uncased_L-12_H-768_A-12\\uncased_L-12_H-768_A-12\vocab.txt --bert_config_file=\BERT\\uncased_L-12_H-768_A-12\\uncased_L-12_H-768_A-12\bert_config.json --init_checkpoint=\BERT\\uncased_L-12_H-768_A-12\\uncased_L-12_H-768_A-12\bert_model.ckpt --max_seq_length=64 --train_batch_size=2 --learning_rate=2e-5 --num_train_epochs=3.0 --output_dir=\BERT\bert_output\ --do_lower_case=True --save_checkpoints_steps 10000
培训完成后,您可以查看包含dev数据集摘要的检查点文件和eval_results.txt文件。
eval_accuracy = 0.71553844
eval_loss = 1.035305
global_step = 1287000loss = 1.0362284
预测情绪
为了预测情绪,我们将以下参数设置为— do_predict参数设置为True。
1. task_name:应与用于训练数据集的task_name匹配
2. data_dir:指定包含test.tsv文件中的数据的目录
3. vocab_file:指定vocab.txt文件。Vocab.txt使用BERT提供的vocab文件将单词映射到索引。
4. bert_config_file:包含BERT模型的参数值。BERT预训练模型具有此文件
5. init_checkpoint:初始检查点。这是输出目录中模型检查点文件的最大数量。
6. max_seq_length:指定最大序列长度。
7. output_dir:将测试结果写入文件test_results.tsv的输出目录
python run_classifier.py 。--task_name=cola --do_predict=true --data_dir=\yelp_review_full_csv\ --vocab_file=\BERT\\uncased_L-12_H-768_A-12\\uncased_L-12_H-768_A-12\vocab.txt --bert_config_file=\BERT\\uncased_L-12_H-768_A-12\\uncased_L-12_H-768_A-12\bert_config.json --init_checkpoint=\BERT\bert_output\model.ckpt-1085250 --max_seq_length=128 --output_dir=\BERT\bert_output\
评估测试结果
测试结果位于文件test_results.tsv的输出目录中,您可以将其与测试标签进行比较并评估我们的多类文本分类的性能
阅读和解释结果
每个文本的结果在test_results.tsv文件中都有一行,并带有五个标记类中每个类别的概率。
我们需要找到可能性最高的课程,这将是Yelp审查的感想
导入带有打开('\ BERT \ bert_outout \ test_results.tsv')的csv
label_results = [] import csvlabel_results=[]pd.DataFrame()with open('\BERT\bert_outout\test_results.tsv') as file:rd = csv.reader(file, delimiter="\t") for row in rd: data_1=[float(i) for i in row] label_results.append(data_1.index(max(data_1)))df_results=pd.DataFrame()df_results=pd.DataFrame(label_results)
现在我们生成情感范围从0到4的混淆矩阵
from sklearn.metrics import confusion_matrix
confusion_matrix(data_test[0], df_results[0])
混淆矩阵
我曾在一个时期训练过BERT模型,您可以看到结果对于多类文本分类看起来不错
from sklearn import metricsprint("Accuracy",metrics.accuracy_score(data_test[0], df_results[0]))print("F1-Score",metrics.f1_score(data_test[0], df_results[0],average='weighted'))