python 多分类情感_大神教程干货:使用BERT的多类别情感分析!(附代码)

使用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'))

你可能感兴趣的:(python,多分类情感)