位置: IT常识 - 正文

基于 BERT 实现的情感分析(文本分类)----概念与应用(bert的原理)

编辑:rootadmin
基于 BERT 实现的情感分析(文本分类)----概念与应用 文章目录基于 BERT 的情感分析(文本分类)基本概念理解简便的编码方式: One-Hot 编码突破: Word2Vec编码方式新的开始: Attention 与 Transformer 模型四方来降: 超一流预处理模型 BERT 诞生BERT 实现情感分析数据预处理并创建数据集定义网络模型定义训练函数与评估函数设置损失函数、优化方法、BertTokenizer词嵌入训练模型并预测结果小结

推荐整理分享基于 BERT 实现的情感分析(文本分类)----概念与应用(bert的原理),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:bert算法,bert模型应用,bert的应用,bert模型应用,bert原理详解,bert算法原理,bert的应用,bert模型应用,内容如对您有帮助,希望把文章链接给更多的朋友!

2023/2/17更新,已上传数据集和对应的代码至Github。

基于 BERT 的情感分析(文本分类)

2018年的10月11日,Google发布一篇论文《Pre-training of Deep Bidirectional Transformers for Language Understanding》,成功在 11 项 NLP 任务中取得 SOTA(最优) 结果,赢得自然语言处理学界的一片赞誉之声。

从此各种类BERT模型如雨后春笋般不断破土而出,创造了 NLP 领域一项又一项新的记录,本次我将带领大家在 18 多万条数据集上微调BERT实现情感分析(文本分类)。

基本概念理解

是什么导致了 BERT 的诞生?

BERT 有哪些优势?

简便的编码方式: One-Hot 编码

我们都知道,大家说的话都是人类语言,而计算机本质只认识数字信息,那计算机理解人类语言信息又是必须过程,那么我们该如何设计数字编码表示语言信息呢?

此时,最初的编码方式诞生了,即One-Hot编码,又称独热编码方式。假设现在有四个词 ['钢琴 ', ‘绘画’, '舞蹈 ', ‘篮球’] ,则编码方式如下:

钢琴 → [1, 0, 0, 0]

绘画 → [0, 1, 0, 0]

舞蹈 → [0, 0, 1, 0]

篮球 → [0, 0, 0, 1]

每个词在向量中都会有一个 1 与之对应,代表该词元的编码信息。最初很多文本信息都是这种编码方式,但是久而久之,这种编码方式的两种缺陷便显露出来:

1、可能产生维度爆炸的问题,即当词元的个数超级多的时候,每个词元的向量长度均为词元个数 n ,导致计算机无法存储,运算速度极慢。

2、无法有效表示词元的相似关系,每个词元只能独立表示。

突破: Word2Vec编码方式

为了改进 One-Hot 编码的缺陷,一种新的编码方式应运而生。2013年,Google团队发布了论文《Efficient Estimation of Word Representations inVector Space》,Word2Vec编码方式由此诞生,很大程度上推动了 NLP 领域的发展。其编码方式有以下两种:

1、Skip-Gram模型,即跳元模型。其原理是根据中心词预测上下文词。

2、CBOW模型,即连续词袋模型。其原理是根据上下文词预测中心词。

通过计算 中心词与上下文词的余弦相似度,来确定不同词元直接的关系。最终将所有词元都转化为长度为 embedding_dim(50~300)的向量。

这样不仅能够很大程度上缩减词元的存储空间,又能获得词元与词元之间的相似度。但是这种方法也有一些缺陷:

1、由于词和向量是一对一的关系,所以多义词的问题无法解决。

2、Word2vec 是一种静态的方式,虽然通用性强,但是无法针对特定任务做动态优化。

关于Word2Vec的原理与代码实现,请看这几部分内容Word2Vec的详情原理。

新的开始: Attention 与 Transformer 模型

2017年6月,Google团队再次发布论文 《Attention Is All You Need》 关于注意力机制的 Transformer模型。

该论文主张使用注意力的机制,完全抛弃CNN,RNN等网络模型结构。起初主要应用在自然语言处理NLP中,后面也逐渐应用到了计算机视觉中。

仅仅通过 注意力机制(self-attention) 和 前馈神经网络(Feed Forward Neural Network),不需要使用序列对齐的循环架构就实现了较好的效果。

模型结构如下图:

其存在两方面优点:

1、摒弃了RNN的网络结构模式,其能够很好的并行运算。

基于 BERT 实现的情感分析(文本分类)----概念与应用(bert的原理)

2、其注意力机制能够帮助当前词获取较好的上下文信息。

由于Transformer部分的原理内容较多,所以暂时跳过,有兴趣的朋友可阅读此篇文章。

四方来降: 超一流预处理模型 BERT 诞生

Bert基于Transformer编码器块架构进行设计,同时采用了两种方法来提升 NLP 处理水平:

1、MLM(Maked Language Model)掩蔽语言模型,Bert通过MLM方法来随机掩蔽句子中的一个词元,设计模型根据上下文信息去预测该词元。通过此种方法,使模型能够很好地解决多义词匹配和上下文语义理解问题。

2、NSP(Next Sentence Prediction)下一句预测,随机选取多组 两个连接或两个不连接的句子,设置它们是否连续(为上下文)的标记,从而进行训练,得到文本对之间的关系,能够解决文本对之间的关系问题,即上下文关系问题。

另外,Bert将普遍模型处理的 特定NLP任务 转化为了在Bert模型下的 不可知NLP任务,也就是说,Bert只是一个语料库的预处理模型,和One-Hot、Word2Vec一致,均是语言预训练模型。用户可以在Bert预训练模型下作 微调(fine-tune) 操作,使其能够处理多种NLP任务,如:

(1)单一文本分类(如情感分析)

(2)文本对分类(如自然语言推断)

(3)问答

(4)文本标记(如命名实体识别)。

比如文本分类,也就是我们这次的任务(情感分析),只需得到整个评论语句的上下文综合信息(‘<cls>’),再接上一层全连接层,便可实现分类任务。 其它不可知任务类似。

本模型的详情参考这篇文章。

BERT 实现情感分析

前提准备:

准备18多万条手机评论信息和对应的情感标签, 0, 1, 2 代表 差中好 评。因为个人计算机资源无法训练出Bert预训练模型,我们使用 transformer 库中的 BertTokenizer、 BertModel模型。BertTokenizer将输入的评论语句转化为输入Bert模型的向量信息,BertModel根据输入信息输出结果。数据预处理并创建数据集

读取文件中的评论信息,并对数据进行去重。

import csvimport pandas as pdimport randomimport torchfrom transformers import BertTokenizer, BertModelfrom torch import nnfrom d2l import torch as d2lfrom tqdm import tqdm"""读取评论文件的评论信息"""def read_file(file_name): comments_data = None # 读取评论信息 with open(file_name, 'r', encoding='UTF-8') as f: reader = csv.reader(f) # 读取评论数据和对应的标签信息 comments_data = [[line[0], int(line[1])] for line in reader if len(line[0]) > 0] # 打乱数据集 random.shuffle(comments_data) data = pd.DataFrame(comments_data) same_sentence_num = data.duplicated().sum() # 统计重复的评论内容个数 if same_sentence_num > 0: data = data.drop_duplicates() # 删除重复的样本信息 f.close() return data

读取数据集信息,并输出样本的长度

comments_data = read_file('./file/comments.csv')len(comments_data)181945

查看所有样本信息

comments_data010外形外观:时尚精美拍照效果:华为拍照效果杠杠的21本来我是想买苹果13,后来想了想还是支持下华为毕竟是国产之光,但拿到手机用起来感觉系统有时候...12手机毕竟是处理器流畅的很手机还比较轻薄还有微颜功能和功能第一感觉很棒流行一些大型游戏十分流畅...23京东送货非常快辛苦快递小哥啦手机看着挺好的选了黑色的毕竟年纪大了各种彩色已经不适合我了的屏幕...24外形外观在京东买手机好几台了这次是最差的手机像是二手的包装简陋一看就是拆封的装手机的盒子都布...0.........186528手机赠品一起寄回去了也显示收货了到你们哪边就说我没退回赠品扣我赠品的钱一天两天就算了能理解慢...0186529手机已经拿到了。使用感觉很棒!手机的颜值可以的。特别是屏幕,采用了3D曲屏设计,感觉很棒。总...2186530从开始一直都是用苹果好用是好用就是电池真的不想说1186531第一次在京东买手机手机刚收到包装很好完整手机颜色很漂亮手感不错才开始使用看看效果怎么样总体感...2186532好不容易抢到的,但是信号真的太差了,惆怅!天天卡的要命!1

181945 rows × 2 columns

以 6:4 的比例拆分训练集与测试集,设定切分线。

split = 0.6split_line = int(len(comments_data) * split)split_line109167

划分训练集 train_comments, train_lables 与测试集 test_comments,test_lables 并输出它们的长度

# 划分训练集与测试集,并将pandas数据类型转化为列表类型train_comments, train_labels = list(comments_data[: split_line][0]), list(comments_data[: split_line][1])test_comments, test_labels = list(comments_data[split_line:][0]), list(comments_data[split_line:][1])len(train_comments),len(train_labels), len(test_comments), len(test_labels)(109167, 109167, 72778, 72778)定义网络模型

现在我们来微调Bert,使用Bert来实现情感分析(文本分类)的效果。

默认这里使用基本模型Bert_base(bert-base-chinese),使用12层Transformer编码器块,768个隐藏单元和12个自注意头。

只需要在Bert的输出信息中提取出综合上下文信息 ‘<cls>’,并外接一层全连接层,即可完成情感分析(文本分类)效果。如下图

仍不太懂的小伙伴可以参考transform_bert官方文档,对于Bert的参数和返回有详细说明。

"""定义BERTClassifier分类器模型"""class BERTClassifier(nn.Module): # 初始化加载 bert-base-chinese 原型,即Bert中的Bert-Base模型 def __init__(self, output_dim, pretrained_name='bert-base-chinese'): super(BERTClassifier, self).__init__() # 定义 Bert 模型 self.bert = BertModel.from_pretrained(pretrained_name) # 外接全连接层 self.mlp = nn.Linear(768, output_dim) def forward(self, tokens_X): # 得到最后一层的 '<cls>' 信息, 其标志全部上下文信息 res = self.bert(**tokens_X) # res[1]代表序列的上下文信息'<cls>',外接全连接层,进行情感分析 return self.mlp(res[1])定义训练函数与评估函数

设计以下的评估函数和训练函数,用以对模型进行训练测试

"""评估函数,用以评估数据集在神经网络下的精确度"""def evaluate(net, comments_data, labels_data): sum_correct, i = 0, 0 while i <= len(comments_data): comments = comments_data[i: min(i + 8, len(comments_data))] tokens_X = tokenizer(comments, padding=True, truncation=True, return_tensors='pt').to(device=device) res = net(tokens_X) # 获得到预测结果 y = torch.tensor(labels_data[i: min(i + 8, len(comments_data))]).reshape(-1).to(device=device) sum_correct += (res.argmax(axis=1) == y).sum() # 累加预测正确的结果 i += 8 return sum_correct/len(comments_data) # 返回(总正确结果/所有样本),精确率"""训练bert_classifier分类器"""def train_bert_classifier(net, tokenizer, loss, optimizer, train_comments, train_labels, test_comments, test_labels, device, epochs): max_acc = 0.5 # 初始化模型最大精度为0.5 # 先测试未训练前的模型精确度 train_acc = evaluate(net, train_comments, train_labels) test_acc = evaluate(net, test_comments, test_labels) # 输出精度 print('--epoch', 0, '\t--train_acc:', train_acc, '\t--test_acc', test_acc) # 累计训练18万条数据 epochs 次,优化模型 for epoch in tqdm(range(epochs)): i, sum_loss = 0, 0 # 每次开始训练时, i 为 0 表示从第一条数据开始训练 # 开始训练模型 while i < len(train_comments): comments = train_comments[i: min(i + 8, len(train_comments))] # 批量训练,每次训练8条样本数据 # 通过 tokenizer 数据化输入的评论语句信息,准备输入bert分类器 tokens_X = tokenizer(comments, padding=True, truncation=True, return_tensors='pt').to(device=device) # 将数据输入到bert分类器模型中,获得结果 res = net(tokens_X) # 批量获取实际结果信息 y = torch.tensor(train_labels[i: min(i + 8, len(train_comments))]).reshape(-1).to(device=device) optimizer.zero_grad() # 清空梯度 l = loss(res, y) # 计算损失 l.backward() # 后向传播 optimizer.step() # 更新梯度 sum_loss += l.detach() # 累加损失 i += 8 # 样本下标累加 # 计算训练集与测试集的精度 train_acc = evaluate(net, train_comments, train_labels) test_acc = evaluate(net, test_comments, test_labels) # 输出精度 print('\n--epoch', epoch+1, '\t--loss:', sum_loss / (len(train_comments) / 8), '\t--train_acc:', train_acc, '\t--test_acc', test_acc) # 如果测试集精度 大于 之前保存的最大精度,保存模型参数,并重设最大值 if test_acc > max_acc: # 更新历史最大精确度 max_acc = test_acc # 保存模型 torch.save(net.state_dict(), 'bert.parameters')设置损失函数、优化方法、BertTokenizer词嵌入

本次实验中,我们这里使用交叉熵损失函数、小批量随机梯度下降,并定义 BertTokenizer 将输入的评论语句(次元序列)转化为输入Bert的数据。

device = d2l.try_gpu() # 获取GPUnet = BERTClassifier(output_dim=3) # BERTClassifier分类器,因为最终结果为3分类,所以输出维度为3,代表概率分布net = net.to(device) # 将模型存放到GPU中,加速计算# 定义tokenizer对象,用于将评论语句转化为BertModel的输入信息tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')loss = nn.CrossEntropyLoss() # 损失函数optimizer = torch.optim.SGD(net.parameters(), lr=1e-4) # 小批量随机梯度下降算法训练模型并预测结果train_bert_classifier(net, tokenizer, loss, optimizer, train_comments, train_labels, test_comments, test_labels, device, 20)

运行结果如下

经过5个小时左右的模型训练,在测试集上的精确度最高能够达到82.38%,相对于之前的RNN系列的结果(75%左右),提升了7个百分比左右,而且我们并没有作任何调整优化操作,所以Bert预训练模型还是很强大的。

现在,我们再次可视化测试一下模型预测的准确度(测试集上),如下

# 定义模型net = BERTClassifier(output_dim=3)net = net.to(device)# 加载训练好的模型参数net.load_state_dict(torch.load('./bert.parameters'))start = 0while start < 20: comment = test_comments[start] token_X = tokenizer(comment, padding=True, truncation=True, return_tensors='pt').to(device) label = test_labels[start] # 实际结果 result = net(token_X).argmax(axis=1).item() # 得到预测结果# 打印评论语句 print(comment) # 输出预测结果 if result == 0: print('预测结果: ', 0, '----》差评', end='\t') elif result == 1: print('预测结果: ', 1, '----》中评', end='\t') else: print('预测结果: ', 2, '----》好评', end='\t')# 输出实际结果 if label == 0: print('实际结果: ', 0, '----》差评', end='\t') elif label == 1: print('实际结果: ', 1, '----》中评', end='\t') else: print('实际结果: ', 2, '----》好评', end='\t') if result == label: print('预测正确') else: print('预测错误') start += 1

运行结果如下:

小结

本次使用Bert实现情感分类总体上得到了不错的效果,但是仍有值得改进的地方,如未对评论数据作预处理操作,也未改善优化Bert分类器的基本结构,仅仅是外接了一个全连接层,未采用更佳的优化算法、未支持动态学习率变化等。

另外,Bert模型也存在一些缺陷,Bert是基于字粒度对文本数据进行划分的,我们也可以采用Bert的改进模型RoBERTa模型,或者中文语义更强的ERNIE模型来构建预训练模型。

希望本次分享可以帮助到大家。

本文链接地址:https://www.jiuchutong.com/zhishi/300400.html 转载请保留说明!

上一篇:大二一个学期学这么点内容,没有概念,只有实操(大二一学期学分多少合适)

下一篇:【javaScript】学完js基础,顺便把js高级语法学了(尚硅谷视频学习笔记)(javascript学什么内容)

  • 爱奇艺密码忘记了怎么修改密码(爱奇艺密码忘记了)

    爱奇艺密码忘记了怎么修改密码(爱奇艺密码忘记了)

  • 华为手表能连接小米手机吗(华为手表能连接荣耀手机吗)

    华为手表能连接小米手机吗(华为手表能连接荣耀手机吗)

  • 苹果背景音怎么定时(苹果背景音怎么弄)

    苹果背景音怎么定时(苹果背景音怎么弄)

  • app越用越大怎么清理(应用越用越大怎么办)

    app越用越大怎么清理(应用越用越大怎么办)

  • 手机电池突然从50到1什么原因(手机电池突然从40%降到3%)

    手机电池突然从50到1什么原因(手机电池突然从40%降到3%)

  • 苹果不显示最近通话了(苹果手机怎么不显示最近项目)

    苹果不显示最近通话了(苹果手机怎么不显示最近项目)

  • 爱剪辑不是会员不能导出视频吗(爱剪辑不是会员不能导出吗)

    爱剪辑不是会员不能导出视频吗(爱剪辑不是会员不能导出吗)

  • jkmaloob是什么型号(jkmal0b是什么型号)

    jkmaloob是什么型号(jkmal0b是什么型号)

  • 闲鱼违规是什么意思(闲鱼违规处罚有哪些)

    闲鱼违规是什么意思(闲鱼违规处罚有哪些)

  • ipadpro电池容量多少毫安(ipadpro电池容量多大)

    ipadpro电池容量多少毫安(ipadpro电池容量多大)

  • ipad插上电后指纹失灵(ipad充电就开机是怎么回事)

    ipad插上电后指纹失灵(ipad充电就开机是怎么回事)

  • 怎么在快手上打卡(怎么在快手上打视频)

    怎么在快手上打卡(怎么在快手上打视频)

  • 华为荣耀8c怎么隐藏应用(华为荣耀8c怎么升级鸿蒙系统)

    华为荣耀8c怎么隐藏应用(华为荣耀8c怎么升级鸿蒙系统)

  • i5 9400f相当于几代i7(i5 9400f相当于什么水平)

    i5 9400f相当于几代i7(i5 9400f相当于什么水平)

  • 抖音开直播卖货需要什么条件(抖音开直播卖货怎么上架)

    抖音开直播卖货需要什么条件(抖音开直播卖货怎么上架)

  • 苹果耳机在洗衣机里洗了还能用吗(苹果耳机在洗衣机里洗了)

    苹果耳机在洗衣机里洗了还能用吗(苹果耳机在洗衣机里洗了)

  • 怎么下载电脑版微信(怎么下载电脑版植物大战僵尸)

    怎么下载电脑版微信(怎么下载电脑版植物大战僵尸)

  • 苹果8plus和苹果11对比(苹果8plus和苹果11)

    苹果8plus和苹果11对比(苹果8plus和苹果11)

  • oppoFindx怎么设置指纹(oppofindx怎么设置4g网络)

    oppoFindx怎么设置指纹(oppofindx怎么设置4g网络)

  • 手机收款语音如何放大(手机收款如何语音播报)

    手机收款语音如何放大(手机收款如何语音播报)

  • Windows defender隔离区的文件在哪里(windows defender隔离区)

    Windows defender隔离区的文件在哪里(windows defender隔离区)

  • vue大屏开发系列—列表无缝滚动之vue-seamless-scroll(vue大屏组件库)

    vue大屏开发系列—列表无缝滚动之vue-seamless-scroll(vue大屏组件库)

  • python中sys.argv模块的介绍(python中sys模块)

    python中sys.argv模块的介绍(python中sys模块)

  • 关税完税价格是指什么意思
  • 如何记忆消费税15个税目
  • 现金流量套期与什么无关
  • 公司注销前欠客户钱
  • 金税盘是每天有5次机会吗
  • 出口退税贷款操作流程
  • 个人生产经营所得税
  • 期末未缴税额为负数怎么办
  • 季度预缴能不能弥补亏损
  • 收到赠品入库需要用什么记录
  • 员工备用金期末未报销怎么处理
  • 购买方已抵扣开具红字信息表之后做账需要什么原始凭证
  • 对外投资所得税计算公式
  • 软件 退税
  • 小规模企业工资表怎么做
  • 营改增后转让土地使用权增值税
  • 延期付款利息是多少钱
  • 福利费用计入
  • 专用发票的有效期是几年
  • 处于汇总期
  • 跨年补交企业所得税
  • 代理进口货物怎么做账
  • 转账支票背书是什么意思啊
  • 借壳上市是什么意思?融资
  • 员工生育礼品
  • 预提差率费怎么记账
  • 事业单位坏账准备的计提方法
  • 报税残疾人保障金怎么算
  • 微信支付宝收款码二合一
  • 小规模纳税人无票收入免税吗
  • 税务检查所得税调整
  • php面向对象详解
  • linux配置多网卡设置
  • 高新企业研发费用占比规定
  • 汽车购置税去哪交钱
  • 微信小程序开发完整项目
  • framework core
  • 营改增几个阶段
  • 纳税申报表填写说明
  • 20分钟,使用Amazon SageMaker快速搭建属于自己的AIGC应用
  • 企业所得税如何计算应纳税所得额
  • 增值税期末留抵退税
  • 建筑公司预收账款财税怎么处理
  • 城市维护建设税,教育费附加,地方教育费附加
  • 入库管理业务流程图
  • mysql用在哪些方面
  • 以前月份多扣社保吗
  • 三方协议是什么意思?
  • 农产品进项税额抵扣范围
  • 期末余额就是本年累计吗
  • 如何把有余额的账单删除
  • 先抵扣后付款怎么做账
  • 专票红冲信息表填开显示红字信息表金额大于蓝色金额
  • 房地产企业怎么交房产税
  • 固定资产怎么入费用
  • 汇算清缴业务招待费调整分录
  • 销售费用的主要科目
  • 普通发票作废如何恢复
  • 金蝶现金银行存款账怎么记账
  • 办公用水电费计入什么科目
  • 企业购买加油卡出售怎么做账
  • 明细分类账表格
  • win10电脑清理磁盘
  • ios平台中glsl中shadow2DProjEXT函数的简单说明以及变换矩阵的小注意点
  • android获取音频信息
  • w32tm命令
  • css使用教程
  • 动态创建菜单
  • [置顶]马粥街残酷史
  • javascript基于
  • jQuery继承extend用法详解
  • 刚开始学java的心得体会
  • nodejs示例
  • jQuery Ajax 异步加载显示等待效果代码分享
  • 欢迎使用来电提醒业务是什么意思
  • jquery的$作用
  • 进口商品的消费税计入成本吗
  • 已申报的纳税申报表怎么下载打印
  • 慧付钱包app官网下载
  • 进项税小于销项税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设