首页 > 其他分享 >transformers和bert实现微博情感分类模型提升

transformers和bert实现微博情感分类模型提升

时间:2024-10-09 22:20:16浏览次数:11  
标签:bert transformers BERT text 模型 情感 微博 标签 文本

关于深度实战社区

我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万+粉丝,拥有2篇国家级人工智能发明专利。

社区特色:深度实战算法创新

获取全部完整项目数据集、代码、视频教程,请进入官网:zzgcz.com。竞赛/论文/毕设项目辅导答疑,v:zzgcz_com


1. 项目简介

本项目旨在构建一个基于BERT(Bidirectional Encoder Representations from Transformers)模型的中文情感分类系统,能够自动分析社交媒体上的文本内容并预测其情感倾向。随着社交媒体的普及,用户生成的大量文本数据中蕴含着丰富的情感信息,因此能够有效地挖掘和分析这些情感数据对于市场分析、用户反馈管理以及公共情感动态监测等领域具有重要意义。BERT模型是目前最为广泛使用的自然语言处理模型之一,依赖于强大的Transformer结构,可以充分利用上下文信息,理解语言的复杂语义关系,从而在各类文本分类任务中表现出色。本项目通过对微博数据集进行处理和标注,应用BERT模型实现对不同情感(积极、中立、消极)进行分类预测。在具体实现中,项目使用了预训练的BERT基础模型作为文本表示学习的核心,结合PyTorch深度学习框架来搭建模型,并使用数据清洗、分词处理、模型训练、评估等完整流程,旨在为中文情感分类提供一个高效的解决方案,提升文本情感分类的准确率和泛化能力。最终,该模型可以用于实时情感分析、品牌口碑监控以及社交媒体情感热点检测等实际应用场景。

2.技术创新点摘要

本项目在中文情感分类的实现过程中,采用了一系列创新性技术手段和模型设计,使其能够在处理中文文本时更高效、更精准地进行情感分析。首先,该项目基于BERT模型进行文本情感分类,通过BERT的双向编码器(Bidirectional Encoder)来捕捉文本中上下文之间的依赖关系,从而更准确地理解情感信息。相比传统的单向LSTM或GRU模型,BERT能够同时关注句子前后文的所有词汇关系,因而在情感分类任务中表现优异。项目中引入了BertForSequenceClassification类,并在其基础上通过自定义数据集和数据加载方式,确保了模型在训练过程中能够处理不同长度的文本输入并防止信息丢失。

其次,项目使用了多种预处理策略来提升数据质量,包括中文分词、去除停用词等,这些处理步骤能够在保证文本完整性的同时去除无关信息,从而减少模型的计算负担并提升分类效果。创新点之一是利用了自定义的情感标签映射策略,将原始的情感标签(-1、0、1)重新映射为新的类别标签(1、0、2),这种方式可以更好地处理情感极性的差异性,有效区分消极情感、积极情感和中性情感。

另外,本项目采用了AdamW优化器,并结合了学习率调度器(get_linear_schedule_with_warmup)进行动态学习率调整,从而在模型训练中能够有效避免过拟合与梯度爆炸问题。同时,通过梯度裁剪(torch.nn.utils.clip_grad_norm_)控制梯度范数,进一步稳定了训练过程。最后,项目在模型训练和评估中使用了自定义的WeiboDataset数据集类,配合DataLoader进行高效的数据加载和批量处理,并使用了多种性能指标(如交叉熵损失和准确率)对模型表现进行了全面评估,为整个系统的实用性和拓展性提供了强有力的支撑。

在这里插入图片描述

3. 数据集与预处理

本项目的数据集来源于微博平台中的情感分类数据,数据集中的文本样本均为中文语句,包含了大量的网络用语、口语化表达及各种情感符号,具有高度非结构化、短文本、情感极性多变等特点。数据集共包含超过10万条标注样本,每条样本包含“微博中文内容”和“情感倾向”两个主要字段,其中“情感倾向”字段用来表示该文本的情感标签,分为“积极(1)”、“中立(0)”和“消极(-1)”三种情感类别。

在数据预处理阶段,首先进行缺失值处理,对于“微博中文内容”列中存在的缺失值样本进行删除,确保输入文本的完整性和有效性。接着,应用中文分词工具Jieba对文本进行分词处理,将原始的连续文本拆分为更具语义性的词汇单元,并基于停用词表去除无关词汇,从而降低模型的噪音干扰。去停用词步骤能显著减少诸如“的”、“是”、“了”等常见字词对情感分类任务的影响。

此外,为了将原始情感标签映射为更适合模型训练的数值标签,本项目采用了自定义标签映射策略,将“消极”标记为1、“中立”标记为0、“积极”标记为2,进而便于模型处理不同情感极性的区分。经过上述步骤处理后,生成了新的文本表示列“tokens”,作为模型输入的特征列。

最后,模型还采用了BERT分词器对分词后的文本进行进一步编码,将每条文本转换为固定长度的向量表示,并生成了相应的注意力掩码,用于处理不同长度文本的填充,从而提升了模型处理不同文本长度的鲁棒性和效率。整个数据预处理流程保证了文本特征的完整性,增强了模型的泛化能力。

4. 模型架构

  1. 模型结构的逻辑

本项目采用了基于预训练BERT模型(Bidirectional Encoder Representations from Transformers)的情感分类模型。具体地,模型结构为BertForSequenceClassification,在BERT的基础结构上添加了一个线性分类层,用于对输入文本进行情感分类。

  • BERT模型结构:BERT使用了多层Transformer结构,每层包含两个主要子模块:多头自注意力机制(Multi-Head Self-Attention)和前馈神经网络(Feed-Forward Neural Network),可以捕捉上下文中任意两个单词之间的依赖关系。其输入为一组嵌入向量,输出为每个词的上下文表示。BERT的输入表示公式如下:
  • Input Embedding = Token Embedding + Position Embedding + Segment Embedding \text{Input Embedding} = \text{Token Embedding} + \text{Position Embedding} + \text{Segment Embedding} Input Embedding=Token Embedding+Position Embedding+Segment Embedding
  • BERT模型中使用的多头自注意力机制可以表示为:
  • Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax} \left( \frac{QK^T}{\sqrt{d_k}} \right) V Attention(Q,K,V)=softmax(dk​ ​QKT​)V
  • 其中,Q,K,V 分别表示查询(Query)、键(Key)、值(Value)矩阵,dk 为键向量的维度。
  • 情感分类层:在BERT的[CLS]标记输出向量上添加一个线性层(Linear Layer),其计算公式为:
  • logits = W ⋅ h [ C L S ] + b \text{logits} = W \cdot h_{[CLS]} + b logits=W⋅h[CLS]​+b
  • 其中,h[CLS] 为BERT的输出中[CLS]标记对应的隐藏层向量表示,W 和 b 分别为线性层的权重和偏置。最终,模型通过softmax函数生成三个类别的概率分布,用于预测情感倾向:
  • Probability = softmax ( logits ) \text{Probability} = \text{softmax}(\text{logits}) Probability=softmax(logits)
  1. 模型的整体训练流程

模型的训练流程主要包括数据加载、前向传播、损失计算、反向传播、梯度更新和模型评估几个步骤。

  • 数据加载:利用自定义的WeiboDataset类和DataLoader对数据进行批量加载,将输入文本转化为模型能够接受的张量(input_ids和attention_mask)。
  • 前向传播:将每个批次的数据(input_ids和attention_mask)输入到BERT模型中,BERT通过其多层Transformer结构计算文本的上下文表示,并输出隐藏状态。然后将[CLS]标记对应的隐藏状态传递给线性分类层,生成情感分类的logits。
  • 损失计算:模型采用交叉熵损失函数(Cross Entropy Loss)来度量模型预测的logits和真实标签之间的误差。交叉熵损失函数定义如下:
  • Loss = − 1 N ∑ i = 1 N ∑ j = 1 C y i j ⋅ log ⁡ ( p i j ) \text{Loss} = -\frac{1}{N} \sum_{i=1}^{N} \sum_{j=1}^{C} y_{ij} \cdot \log(p_{ij}) Loss=−N1​i=1∑N​j=1∑C​yij​⋅log(pij​)
  • 其中,N 为样本数量,C 为类别数,yij 为样本 i 在类别 j 上的真实标签,pij 为模型对样本 i 属于类别 j 的预测概率。
  • 反向传播与优化:利用AdamW优化器和学习率调度器get_linear_schedule_with_warmup进行梯度更新,并在每次梯度更新后通过梯度裁剪(torch.nn.utils.clip_grad_norm_)控制梯度的范数,防止梯度爆炸和模型过拟合。
  • 模型评估:训练完成后,利用准确率(Accuracy)作为主要评估指标进行模型性能衡量。准确率的计算公式为:
  • Accuracy = Number of Correct Predictions Total Number of Predictions \text{Accuracy} = \frac{\text{Number of Correct Predictions}}{\text{Total Number of Predictions}} Accuracy=Total Number of PredictionsNumber of Correct Predictions​
  • 在测试集上,模型根据输入的文本特征预测情感类别,并通过对比真实标签计算最终的分类准确率。

模型训练与评估流程总结:模型训练包含三个主要阶段:数据预处理、模型训练和模型评估。每个epoch中,模型在训练集上进行多次前向传播与反向传播更新参数,然后在验证集上评估性能,记录每个epoch的损失和准确率。训练结束后,模型在测试集上进行最终评估,并输出测试准确率作为整体性能指标。

5. 核心代码详细讲解

  1. 数据预处理模块
读取CSV文件,读取前1000行,并选择指定的两列:'微博中文内容'和'情感倾向'
df = pd.read_csv(r'./nCoV_100k_train.labled.csv', usecols=['微博中文内容', '情感倾向'])
  • 这段代码通过pandasread_csv函数读取了包含情感分类数据的CSV文件,并只选择了两列数据:微博中文内容(表示微博文本内容)和情感倾向(表示情感标签)。这种选择列的方式能显著提升数据加载速度,并节省内存开销。
检查'微博中文内容'列中是否有缺失值,并统计缺失值的数量
content_missing = df['微博中文内容'].isna().sum()
print(f"微博中文内容列中缺失值的数量: {content_missing}")
  • 检查数据中是否存在缺失值的行,通过isna()函数判断每个文本是否为NaN(空值),然后使用sum()函数对所有行进行汇总。此步骤能够有效过滤掉无效数据,确保数据的完整性。
删除包含缺失值的行,inplace=True表示直接在原DataFrame上进行修改
df.dropna(inplace=True)
  • 该行代码删除了数据集中所有包含缺失值的行。inplace=True表示直接修改原DataFrame对象,而不是返回一个新的DataFrame,从而节省了额外的内存。
定义数据预处理函数,用于分词和去除停用词def preprocess_text(text):
    words = jieba.lcut(text)  使用jieba进行中文分词
    words = [word for word in words if word not in stop_words]  去除停用词return ' '.join(words)  返回处理后的字符串
  • preprocess_text函数是一个文本预处理的核心函数:首先,使用jieba.lcut()对输入的文本进行分词操作(将整段文本切分为更小的词汇单元)。接着,利用列表推导式过滤掉在stop_words(停用词集合)中的词汇(例如“的”、“是”等无实际语义的词汇)。最后,函数将剩余词汇重新组合成一个字符串格式,作为分词后的结果。
对'微博中文内容'列应用预处理函数,将分词后的结果存入新列'tokens'
df['tokens'] = df['微博中文内容'].apply(preprocess_text)
  • 使用apply方法将preprocess_text函数应用到微博中文内容列的每一个文本中,并将处理后的结果存储到新的列tokens中。这样能够为后续的特征输入准备更规范的分词文本。
定义情感倾向的标签映射,将原始标签映射为新的数值标签
label_map = {0: 0, -1: 1, 1: 2}
df['label'] = df['情感倾向'].map(label_map)  将'情感倾向'列映射为新的'label'列
  • 定义了一个标签映射字典label_map,并使用map()函数将情感倾向列中的原始标签(0、-1、1)映射为新的数值标签(0、1、2)。这样可以更方便地进行多类别分类模型的训练和评估。
  1. 模型架构构建
初始化BERT的分词器
tokenizer = BertTokenizer.from_pretrained(model_directory)
  • 初始化BERT分词器(BertTokenizer),从预定义的模型目录(bert-base-chinese)中加载预训练的BERT分词器。这是模型输入预处理的关键步骤,能够将自然语言文本转换为BERT模型能够接受的张量格式(ID序列)。
定义自定义数据集类WeiboDatasetclass WeiboDataset(Dataset):def init(self, texts, labels, tokenizer, max_len=128):
        self.texts = texts
        self.labels = labels
        self.tokenizer = tokenizer
        self.max_len = max_len
def getitem(self, idx):
        text = str(self.texts[idx])  将文本转换为字符串格式
        label = self.labels[idx]     获取对应的标签使用分词器将文本编码为BERT输入格式
        encoding = self.tokenizer.encode_plus(
            text,
            add_special_tokens=True,       添加特殊标记 [CLS] 和 [SEP]
            max_length=self.max_len,       设置最大长度
            padding='max_length',          使用最大长度进行填充
            truncation=True,               截断长文本
            return_attention_mask=True,    返回attention_mask
            return_tensors='pt'            返回PyTorch张量
        )return {'input_ids': encoding['input_ids'].flatten(),  [max_len]'attention_mask': encoding['attention_mask'].flatten(),  [max_len]'labels': torch.tensor(label, dtype=torch.long)  标签转为张量格式
        }
  • 该自定义数据集类WeiboDataset用于将原始的文本数据和标签转换为BERT可接受的输入格式。通过调用tokenizer.encode_plus()对每条文本进行编码,返回的input_ids(词ID序列)和attention_mask(注意力掩码)是模型的核心输入张量。
加载预训练的BERT模型,并在其顶部添加一个线性分类器
model = BertForSequenceClassification.from_pretrained(model_directory, num_labels=3)
  • 加载预训练的BERT模型(bert-base-chinese),并在其基础上添加一个线性分类器,用于处理三类情感标签(num_labels=3)。该模型的最后一层线性层直接对BERT生成的[CLS]向量进行分类,输出三类情感标签的概率分布。
  1. 模型训练与评估
定义优化器和学习率调度器
optimizer = AdamW(model.parameters(), lr=2e-5, correct_bias=False)
scheduler = get_linear_schedule_with_warmup(
    optimizer,
    num_warmup_steps=0,
    num_training_steps=total_steps
)
  • AdamW优化器在权重衰减策略上比传统的Adam更优,能够更好地防止模型过拟合。学习率调度器(get_linear_schedule_with_warmup)可以在训练过程中动态调整学习率,防止学习率过高或过低导致模型训练震荡。

6. 模型优缺点评价

优点:
  1. 预训练模型优势:本项目基于BERT模型进行情感分类,BERT具备强大的语言理解能力,能够利用双向Transformer结构捕捉文本中复杂的上下文关系。这使得模型在处理长文本及多变的语义表达时表现优异,具有很高的准确率和鲁棒性。
  2. 数据预处理与特征工程优化:项目中采用了中文分词、去停用词等预处理手段,使模型能够专注于更有意义的词汇,提高了特征输入的有效性。此外,利用自定义标签映射策略使得情感极性区分更加精细,降低了模型的分类难度。
  3. 动态学习率调度和梯度裁剪:在训练过程中,使用了AdamW优化器并结合学习率调度策略,能够有效防止模型训练中的过拟合问题;而梯度裁剪则防止了梯度爆炸,提高了训练过程的稳定性。
缺点:
  1. 计算资源消耗大:BERT模型参数量巨大,对显存和计算资源要求较高,在模型训练和推理时都需要强大的硬件支持,这可能导致小型企业或个人用户难以部署该模型。
  2. 缺乏特定领域的细粒度调优:BERT作为通用语言模型,虽然具有较好的泛化能力,但在特定领域(如微博文本的口语化表达、网络用语等)仍可能存在误判,模型对某些情感符号的处理不够准确。
  3. 数据依赖性强:模型需要大量标注数据进行微调才能发挥最佳性能,如果标注数据质量不高,可能导致模型表现不稳定。
改进方向:
  1. 模型结构优化:可以尝试使用更轻量级的中文预训练模型(如ALBERT、TinyBERT),在降低计算资源消耗的同时保持较高的分类效果。
  2. 超参数调整:优化超参数(如学习率、batch size、权重衰减系数等),结合网格搜索或贝叶斯优化技术,寻找最优组合提升模型性能。
  3. 数据增强策略:引入更多的文本数据增强方法(如同义词替换、随机插入/删除等),丰富训练数据,从而提升模型的泛化能力。

↓↓↓更多热门推荐:
基于YOLOv8-deepsort算法的智能车辆目标检测车辆跟踪和车辆计数

全部项目数据集、代码、教程进入官网zzgcz.com

标签:bert,transformers,BERT,text,模型,情感,微博,标签,文本
From: https://blog.csdn.net/2401_87275147/article/details/142757329

相关文章

  • 题解:CF2014D Robert Hood and Mrs Hood
    差分,每次差分将\(\max(1,l-d+1)\)加\(1\),将\(r+1\)位置减\(1\)。然后前缀和求原数组,再遍历一下求最小值和最大值即可。代码:#include<bits/stdc++.h>usingnamespacestd;intmain(){ intt; cin>>t; while(t--){ intn,d,k; cin>>n>>d>>k;......
  • BERT训练之数据集处理(代码实现)
    目录1读取文件数据 2.生成下一句预测任务的数据 3.预测下一个句子 4.生成遮蔽语言模型任务的数据 5.从词元中得到遮掩的数据 6.将文本转化为预训练数据集7.封装函数类8.调用importosimportrandomimporttorchimportdltools1读取文件数据def_read_wik......
  • Python与自然语言处理库BERT
    Python与自然语言处理库BERT揭开BERT的神秘面纱:从零开始理解这个改变游戏规则的语言模型实战演练:用Python和BERT搭建你的第一个情感分析小助手不只是翻译:探索BERT在跨语言任务中的神奇表现文本生成新高度:利用BERT创造流畅连贯的文章段落优化与调优:让BERT更好地适应特定......
  • BERT训练环节(代码实现)
    1.代码实现#导包importtorchfromtorchimportnnimportdltools#加载数据需要用到的声明变量batch_size,max_len=1,64#获取训练数据迭代器、词汇表train_iter,vocab=dltools.load_data_wiki(batch_size,max_len)#其余都是二维数组#tokens,segments,valid......
  • huggingface的transformers与datatsets的安装与使用
    目录1.安装 2.分词2.1tokenizer.encode() 2.2tokenizer.encode_plus ()2.3tokenizer.batch_encode_plus() 3.添加新词或特殊字符 3.1tokenizer.add_tokens()3.2 tokenizer.add_special_tokens() 4.datasets的使用4.1加载datasets 4.2从dataset中取数据  4.3对datas......
  • transformers中的generate函数解读
    转载:https://zhuanlan.zhihu.com/p/654878538这里仅当学习记录,请看原文,排版更丰富转载补充:https://www.likecs.com/show-308663700.html 这个非常的清晰明了,也建议前往学习今天社群中的小伙伴面试遇到了一个问题,如何保证生成式语言模型在同样的输入情况下可以保证同样的输出......
  • CentOS7.4安装部署openstack [Liberty版] (一)
    一、OpenStack简介OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。OpenStack是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作。OpenStack支持几乎所有类型的云环境,项目目标是提供实施简......
  • CentOS7.4安装部署openstack [Liberty版] (二)
    继上一篇博客CentOS7.4安装部署openstack[Liberty版](一),本篇继续讲述后续部分的内容一、添加块设备存储服务1.服务简述:OpenStack块存储服务为实例提供块存储。存储的分配和消耗是由块存储驱动器,或者多后端配置的驱动器决定的。还有很多驱动程序可用:NAS/SAN,NFS,ISCSI,Ceph等等。块存......
  • SBERT 微调总是在完成所有 epoch 之前停止
    我正在开发一个项目,使用SBERT预训练模型(特别是MiniLM)进行995个分类的文本分类项目。我按照此处列出的步骤大部分情况进行操作,一切似乎都在运行。我的问题是在实际训练模型时出现的。无论我在训练参数中设置什么值,训练似乎总是提前结束并且永远不会完成......
  • AI大模型面经之BERT和GPT的区别
    前言本篇介绍bert和gpt区别。BERT和GPT是自然语言处理(NLP)领域中的两种重要预训练语言模型,它们在多个方面存在显著的区别。以下是对BERT和GPT区别的详细分析一、模型基础与架构BERT:全称:BidirectionalEncoderRepresentationsfromTransformers。架构:基于Transformer的编码器部分进......