使用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_csvtrain.csv”, header=None)data_test= pd.read_csv("yelp_review_full_csvtest.csv", header=None)data_train.head(5)
查找类标签的唯一值
文章插图
data_train[0].unique()
文章插图
值1表示评价差,而值5表示评价很好 。
您可能希望类标签从0开始,所以我们从当前标签值中减去1 。值0现在表示评价不佳,值4表示评价很好
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_csvtrain.tsv’, sep=’t’, index=False, header=False)df_bert_dev.to_csv(‘yelp_review_full_csvdev.tsv’, sep=’t’, index=False, header=False)df_bert_test.to_csv(‘yelp_review_full_csvtest.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=BERTuncased_L-12_H-768_A-12uncased_L-12_H-768_A-12vocab.txt--bert_config_file=BERTuncased_L-12_H-768_A-12uncased_L-12_H-768_A-12bert_config.json--init_checkpoint=BERTuncased_L-12_H-768_A-12uncased_L-12_H-768_A-12bert_model.ckpt--max_seq_length=64--train_batch_size=2--learning_rate=2e-5--num_train_epochs=3.0--output_dir=BERTbert_output--do_lower_case=True--save_checkpoints_steps 10000
培训完成后,您可以查看包含dev数据集摘要的检查点文件和eval_results.txt文件 。eval_accuracy = 0.71553844eval_loss = 1.035305global_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=BERTuncased_L-12_H-768_A-12uncased_L-12_H-768_A-12vocab.txt--bert_config_file=BERTuncased_L-12_H-768_A-12uncased_L-12_H-768_A-12bert_config.json--init_checkpoint=BERTbert_outputmodel.ckpt-1085250--max_seq_length=128--output_dir=BERTbert_output
评估测试结果测试结果位于文件test_results.tsv的输出目录中,您可以将其与测试标签进行比较并评估我们的多类文本分类的性能阅读和解释结果
每个文本的结果在test_results.tsv文件中都有一行,并带有五个标记类中每个类别的概率 。
文章插图
我们需要找到可能性最高的课程,这将是Yelp审查的感想
导入带有打开(' BERTbert_outouttest_results.tsv')的csv label_results = [] importcsvlabel_results=[]pd.DataFrame()with open('BERTbert_outouttest_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_matrixconfusion_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'))
文章插图
猜你喜欢