目录
2.3 定义Dataset与DataLoader进行数据读取
1 相关介绍
1.1 文本情感分析
文本情感分析又被称为意见挖掘,主要是对文字内容进行情感分析,希冀获得其蕴藏的情感极性,可广泛应用于舆情监测、电商评价分析等领域。文本情感分析本质为分类任务。
1.2 BERT
BERT是一个基于自注意力机制实现的文本预训练模型,是自然语言处理领域近年来最重要的工作之一。BERT及其后续改进型深刻改变了深度学习在自然语言处理各项任务的处理方法,已经成为大规模迁移学习的典型代表。BERT具体实现与解析有很多优秀文章进行了详细说明,本文在此不再赘述。
1.3 MLP
一个简单的全连接线性分类层,主要是对BERT的输出进行维度变换,实现文本分类的标签预测。
2 具体实现
本文核心是从始至终构建一个BERT+MLP的神经网络模型进行文本情感分析,具体的细节在后续文章进行介绍,本文不再赘述。
2.1 依赖包安装
安装pytorch与transformers。在终端(命令行窗口)切换到虚拟环境,执行以下命令。(假设已经安装了conda等虚拟环境,如果有同学不会安装conda环境的话,后续再出一个Anaconda或者Miniconda的安装配置教程)
torch包是一个深度学习的主流框架pytorch,transformers是Huggingface开发的一个加载预训练模型和数据集的包,tqdm是一个显示进度条的包。
pip install torch
pip install transformers
pip install tqdm
2.2 导入包
导入后续需要使用的包和类。
import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader
from transformers import AutoModel, AutoTokenizer
from tqdm import tqdm
import numpy as np
import torch.optim as optim
2.3 配置路径与全局常量
将数据集、模型等路径与Batch_Size、Hidden_Size等全局常量放前面,方便后续的更改与操作。常量命名建议全部大写,以便与变量进行区分。此处路径根据自己实际情况进行配置,数据集在文章最后。
# 设置路径与预训练模型
TRAIN_DATA_DIR = r'/root/autodl-tmp/data/toutiaonews38w/train.tsv' # 训练集地址
EVAL_DATA_DIR = r'/root/autodl-tmp/data/toutiaonews38w/val.tsv' # 验证集地址
TEST_DATA_DIR = r'/root/autodl-tmp/data/toutiaonews38w/test.tsv' # 测试集地址
MODEL_NAME = 'bert-base-chinese' # 预模型名称,更换为huggingface其他模型名称则加载为其他模型
LOSS_RESULT_DIR = r'/root/Mytrain/test3-29/toutiaonews38w/result/MLP/mlp_loss.txt' # 训练损失保存路径
ACC_RESULT_DIR = r'/root/Mytrain/test3-29/toutiaonews38w/result/MLP/mlp_acc.txt' # 每个Epoch测试精度保存路径
MODEL_SAVE_DIR = r'/root/autodl-tmp/save_model/bert_mlp.pt' # 训练完毕的模型保存路径
# 设置全局常量
BATCH_SIZE = 64 # 批量大小
MAXLEN = 256 # 文本最长长度
EPOCHES = 3 # 训练轮次
HIDDEN_SIZE = 200 # 隐藏层大小
NUM_CLASS = 2 # 文本情感类别数量
2.4 定义Dataset与DataLoader进行数据读取
Dataset与DataLoader是pytorch用来读取与迭代数据集的类。想了解数据处理完之后格式的同学可以看本小节代码最后一段。
# 自定义Dataset进行数据读取
class myDataset(Dataset):
'''
@功能:读取数据集,将其处理为预训练模型可以接收的类型,供Dataloader进行迭代
@输入:数据集路径、分词器、是否有标签作为输入
@输出:1.标签(可选),格式为tuple,[batch_size,];
2.token_ids,对数据集中的序列进行tokenizer得到,是预训练模型需要的token。格式为tensor,[batch_size,MAXLEN],MAXLEN为设定的tokenizer长度;
3.att_mask,标记token_ids中原有的词元与padding词元。格式为tensor,[batch_size,MAXLEN],MAXLEN为设定的tokenizer长度。
'''
def __init__(self, data_dir, tokenizer, with_labels=True): # data_dir为数据集地址,tokenizer为分词器