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

news2024/11/25 14:48:36

关于深度实战社区

我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网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=Wh[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=N1i=1Nj=1Cyijlog(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2208702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于Linux下C++程序内存dump的分析和工具

前言 程序崩溃令人很崩溃,特别是让人找不到原因的崩溃,但是合适的工具可以帮助人很快的定位到问题,在AI基础能力ASR服务开发时,找到了一种比较实用和简单的内存崩溃的dump分析工具breakpad, 可以帮助在Linux下C开发程…

Skyeye 云智能制造 v3.14.8 发布,ERP 商城 + AI

Skyeye 云智能制造,采用 Springboot winUI 的低代码平台、移动端采用 UNI-APP。包含 30 多个应用模块、50 多种电子流程,CRM、PM、ERP、MES、ADM、EHR、笔记、知识库、项目、门店、商城、财务、多班次考勤、薪资、招聘、云售后、论坛、公告、问卷、报表…

(JAVA)2-3树思想与红黑树的实现与基本原理

1. 平衡树 ​ 学习过二叉查找树,发现它的查询效率比单纯的链表和数组的查询效率要高很多。 ​ 大部分情况下确实是这样的,但不幸的是,在最坏情况下,二叉查找树的性能还是很糟糕。 ​ 例如我们一次往二叉树中插入9,8,7,6,5,4,3,…

【LeetCode】动态规划—714. 买卖股票的最佳时机含手续费(附完整Python/C++代码)

动态规划—714. 买卖股票的最佳时机含手续费 题目描述前言基本思路1. 问题定义2. 理解问题和递推关系状态定义:状态转移公式:初始条件: 3. 解决方法动态规划方法伪代码: 4. 进一步优化5. 小总结 Python代码Python代码解释总结&…

出海电商新怎样用海外云手机引流?

随着互联网行业的迅猛发展,出海电商、海外社交媒体营销以及游戏产业等领域对技术工具的需求不断增加。在这种趋势下,海外云手机作为一种新型解决方案,正在受到广泛关注。 特别是在出海电商中,平台如亚马逊、速卖通、eBay等通过结合…

Mysql(八) --- 视图

文章目录 前言1.什么是视图?2.创建视图3. 使用视图4. 修改数据4.1.注意事项 5. 删除视图6.视图的优点 前言 前面我们学习了索引,这次我们来学习视图 1.什么是视图? 视图是一个虚拟的表,它是基于一个或多个基本表或其他视图的查询…

8款宝藏手机app,适配安卓和苹果手机

好用的手机APP太多,差点挑花了眼!今天来分享4款苹果手机和4款安卓手机上的宝藏软件,看看你喜欢哪一款~ IOS系统APP 1.搜图神器 一款拥有海量图片资源的图片搜索神器,它聚合海内外知名搜索引擎,想要图片直接搜索就行…

用java来编写web界面

一、ssm框架整体目录架构 二、编写后端代码 1、编写实体层代码 实体层代码就是你的对象 entity package com.cv.entity;public class Apple {private Integer id;private String name;private Integer quantity;private Integer price;private Integer categoryId;public…

【JavaScript】LeetCode:61-65

文章目录 61 课程表62 实现Trie(前缀树)63 全排列64 子集65 电话号码的字母组合 61 课程表 Map BFS拓扑排序:将有向无环图转为线性顺序。遍历prerequisites:1. 数组记录每个节点的入度,2. 哈希表记录依赖关系。n 6&a…

Vulnhub靶场案例渗透[7]- DC7

文章目录 1. 靶场搭建2. 信息收集2.1 确定靶机ip2.2 服务信息收集2.3 社工信息收集 3. 提权 1. 靶场搭建 靶场源地址 检验下载文件的检验码&#xff0c;对比没问题使用vmware打开 # windwos 命令 Get-FileHash <filePath> -Algorithm MD5 # linux md5sum filepath2. 信…

视频汇聚平台EasyCVR支持云端录像丨监控存储丨录像回看丨录像计划丨录像配置

EasyCVR视频汇聚融合平台&#xff0c;是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。平台以其强大的视频处理、汇聚与融合能力&#xff0c;在构建视频监控系统中展现出了独特的优势。 EasyCVR视频汇聚平台可接入传统监控行业中高清网络摄像机的RTSP…

提升实验室效率的秘籍

有组织、高效的实验室而言&#xff0c;业务“人、机、料、法、环、测”的多维度发展至关重要&#xff0c;为了提高实验室管理效率和质量&#xff0c;许多实验室开始采用LIMS&#xff08;实验室信息管理系统&#xff09;软件来辅助管理。LIMS软件能够帮助实验室实现信息化、自动…

leetcode 3217 从链表中移除在数组中的结点

1.题目要求: 给你一个整数数组 nums 和一个链表的头节点 head。从链表中移除所有存在于 nums 中的节点后&#xff0c;返回修改后的链表的头节点。 示例 1&#xff1a; 输入&#xff1a; nums [1,2,3], head [1,2,3,4,5] 输出&#xff1a; [4,5] 解释&#xff1a; 移除数值…

Java中的枚举

1.1 认识枚举 枚举是一种特殊的类&#xff0c;它的格式是&#xff1a; public enum 枚举类名{枚举项1,枚举项2,枚举项3; } 其实枚举项就表示枚举类的对象&#xff0c;只是这些对象在定义枚举类时就预先写好了&#xff0c;以后就只能用这几个固定的对象。 定义一个枚举类&am…

使用VS2015编写C语言程序

前面我们给出了一段完整的C语言代码&#xff0c;就是在显示器上输出“C语言中文网”&#xff0c;如下所示&#xff1a; #include <stdio.h>int main(){puts("C语言中文网");return 0;}本节我们就来看看如何通过 VS2015 来运行这段代码。 1) 创建项目&#xf…

QD1-P8 HTML 格式化标签(font、pre、b、strong、i、u、del、s、sub、sup)

本节学习&#xff1a;HTML 格式化标签。 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p8 ‍ 一、font 标签 用途&#xff1a;定义文本的字体大小、颜色和 face&#xff08;字体类型&#xff09;。 示例 <!DOCTYPE html> <html><head><meta cha…

Tkinter:为什么多个Frame相互覆盖?

在 Tkinter 中&#xff0c;Frame 是一个容器部件&#xff0c;用于组织和管理布局。如果多个 Frame 出现在同一个父容器中并且看起来相互覆盖&#xff0c;通常与布局管理器的使用方式或控件的创建顺序有关。 以下是几个常见的原因和解决方案&#xff0c;帮助你了解为什么多个 F…

生产报工信息化全流程大讲解

在企业的生产管理中&#xff0c;生产报工是一个关键环节&#xff0c;但传统的生产报工方式存在诸多痛点&#xff0c;制约了企业的发展。随着数字化技术的发展&#xff0c;多个平台为企业提供了有效的解决方案。基于生产报工信息化方案报告》白皮书&#xff0c;本文深入探讨生产…

三菱FX3U PLC绝对定位- DRVA指令

指令格式 相关软元件一览 功能和动作 这是采用绝对驱动的单速定位指令。采用从原点(0点)开始的距离指定方式&#xff0c; 也被称为绝对驱动方式。 1、在指令执行过程中&#xff0c;即使改变操作数的内容&#xff0c;也不反映到当前的运行中。 在下次的指令驱动时才有效…

客户服务的未来趋势:智能化与人性化的融合

在当今这个日新月异的数字时代&#xff0c;企业的竞争已不再局限于产品或服务的本身&#xff0c;而是延伸到了客户体验的每一个细微之处。数字化转型作为推动这一变革的重要力量&#xff0c;正深刻改变着客户服务的面貌&#xff0c;使之变得更加智能、便捷且充满人性化。随着人…