| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> Pytorch实验5:疫情微博文本情感分类 (简化版SMP2020赛题) -> 正文阅读 |
|
[人工智能]Pytorch实验5:疫情微博文本情感分类 (简化版SMP2020赛题) |
编者按
目录赛题内容任务背景2020年初,新型疫情来势汹汹,对人们的生产生活产生了巨大的影响,引发舆论广泛关注。在以微博为代表的社交媒体上,疫情相关的话题引起了网友们的广泛讨论。 基于自然语言处理技术,深入挖掘微博文本中蕴含的情感态度信息,可以明确公众态度、感知情绪变化、辅助政府决策、引导网络正能量,具有研究意义和社会价值。 本实验的任务是:使用深度学习方法,对给定的疫情微博数据集进行情感分析,输出微博蕴含的情绪类别。任务的优化目标是:提高在测试集上的评估得分。特别地,训练数据不能脱离数据集范围,不可以引入外部语料、预训练模型。 评估指标本任务的评价指标为:宏精准率(macro-Precision)、宏召回率(macro-Recall) 、宏F1值(macro-F1)。 以上指标均适用于多分类问题。其计算方法如下: 数据集数据集以json文件的形式发布。其中,训练集包含8606条中文微博,测试集包含2000条中文微博,每一条微博有唯一的情绪归属。 情绪共有六个分类,包括:积极(happy)、愤怒(angry)、悲伤(sad)、恐惧(fear)、惊奇(surprise)和无情绪(neural)。 实验设计本实验基于跨行业数据挖掘标准流程(CRISP-DM)进行实验环节设计。 数据理解词频统计给定的训练集、测试集通过jieba库分词后,得到词语共计5049个。 词频基本符合长尾分布,除了“武汉”“加油”“我们”“疫情”等词语频繁出现外,多数词语出现次数较少。 情绪分布可以观察到:训练集和测试集的情绪分布基本一致,但也存在样本类不均衡的问题。其中:情绪为积极(happy)的微博文本最多;情绪为悲伤(sad)、恐惧(fear)和惊讶(surprise)的文本较少。 数据预处理数据清洗在训练过程中,与作者表达情感无关的、过于小众化的文本会造成干扰。此外,文本中还夹杂着一些无语义的特殊符号。 本实验中,我们搜集到以下类型的噪声和干扰,并进行了针对性处理:
数据增广在前期实验中,我们输出的错误数据(misclassified items)进行了调研,发现集中于小分类样本。因此,我们采用文本回译的方式,对悲伤(sad)、恐惧(fear)和惊讶(surprise)三类的样本进行了数据增广,以增加训练数据的表达力。 模型设计本次实验中,我们对比了多种模型,最终选择BiLSTM+Attention模型。模型的结构如下图所示。 文本表示和词嵌入首先,文本数据经过清洗、增广和分词之后,以one-hot encoding的方式进行编码。 X = ( x 1 , x 2 , … , x n ) , X ∈ R N × D X=\left(x_1,x_2,\ldots,x_n\right),X\in R^{N\times D} X=(x1?,x2?,…,xn?),X∈RN×D 其中:N是微博文本数量,D是数据集形成的语料库中词的数量。
E
=
M
e
m
b
e
d
X
E=M_{embed}X
E=Membed?X 其中: d d d是文本的嵌入长度,是一个超参数; M e m b e d M_{embed} Membed?是词嵌入矩阵。本模型中, d d d设置为256。 双向LSTM之后,文本的嵌入表示被依次送入双向LSTM中。 门控单元的计算
f
t
=
σ
(
W
f
[
h
t
?
1
,
e
t
]
˙
+
b
f
)
f_t=\sigma\left(W_f\dot{\left[h_{t-1},e_t\right]}+b_f\right)
ft?=σ(Wf?[ht?1?,et?]˙?+bf?) 候选状态、内部状态和输出的更新
c
t
~
=
t
a
n
h
(
W
c
e
t
+
U
c
h
t
?
1
+
b
c
)
\widetilde{c_t}=tanh\left(W_ce_t+U_ch_{t-1}+b_c\right)
ct?
?=tanh(Wc?et?+Uc?ht?1?+bc?) 其中, σ \sigma σ是Sigmoid激活函数, e t e_t et?是第 t t t个嵌入词向量; c t , f t , i t , o t c_t,f_t,i_t,o_t ct?,ft?,it?,ot?都是门控单元;所有的 W W W和 b b b是模型的参数。在双向LSTM中,我们输入词嵌入 E = ( e 1 , e 2 , … , e N ) E=\left(e_1,e_2,\ldots,e_N\right) E=(e1?,e2?,…,eN?),在 2 L 2L 2L个LSTM单元中获得输出 h = ( h 1 , h 2 , … , h 2 L ) h=\left(h_1,h_2,\ldots,h_{2L}\right) h=(h1?,h2?,…,h2L?)。 最终,将前向的隐藏状态和后向的隐藏状态拼接,形成最终的隐藏层表示。 注意力层 + 单层MLP在注意力层中,每一个隐藏状态被计算和其它状态的注意力分数。 a i = t a n h ( W h h i + b h ) , a i ∈ [ ? 1 , 1 ] a_i=tanh\left(W_hh_i+b_h\right),a_i\in\left[-1,1\right] ai?=tanh(Wh?hi?+bh?),ai?∈[?1,1] w i = e x p ( a i ) ∑ t = 1 N e x p ( a t ) , ∑ i = 1 N w i = 1 w_i=\frac{exp\left(a_i\right)}{\sum_{t=1}^{N}exp\left(a_t\right)},\sum_{i=1}^{N}{w_i=1} wi?=∑t=1N?exp(at?)exp(ai?)?,∑i=1N?wi?=1 随后,注意力分数和隐藏状态最初的值被加权融合,得到文本的最终表示,并送入全连接层中进行六分类的预测。 r ? = ? ∑ i = 1 N w i h i , r ∈ R 2 L r\ =\ \sum_{i=1}^{N}{w_ih_i,r\in R^{2L}} r?=?∑i=1N?wi?hi?,r∈R2L 代码实现数据读取和预处理采用python内置的json包进行读取:
使用re包进行正则化筛选,实现数据清洗:
使用有道翻译API进行数据回译,其中:appid 和 app_secret需要自行手动申请(百度翻译开放平台;有道翻译开放平台)。 实验过程中也考虑过百度翻译API,但百度翻译API存在请求长度限制,不适用于大规模的文本数据。
词嵌入和标签嵌入词嵌入的核心步骤如下: (1)对情感标签进行编码
(2)对文本进行分词,整理出词库
(3) 对长短不一的向量,进行补充(padding),形成长度相同的向量。 补充函数的定义如下:
(4) 建立文本-情感编码的对应,便于加载到Dataloader
模型构建此处的实现参考了博客《Attention 扫盲:注意力机制及其 PyTorch 应用实现》
基准模型(baselines)实验中使用了RNN,GRU,LSTM,Transformer四类模型作为对比。受篇幅所限,具体代码不再罗列。 训练过程训练过程如下:
特别地,代码支持结果画图、错误样本甄别:
评估在评估阶段,我们采用sklearn.metrics中提供的混淆矩阵、宏F1值等计算函数,对比模型输出和标签,评估模型性能。
实验结果模型评估
其中,Bi-LSTM组的最优结果截图如下:
结论和反思实验结果表明:在给定的文本分类任务下,我们构建的Bi-LSTM-attention模型在测试集上达到了0.4904的宏F1值,优于RNN、GRU、LSTM和Transfomer模型。 实验过程中,我们发现了以下问题和值得思考的点: (1)过拟合现象严重:训练集和测试集在情感上的分布大体相似,但是在词汇上具有较大的差异。对此,在不使用任何预训练模型的前提下,我们尽可能地引入了多种策略以增加模型的泛化性能,包括:添加Dropout层、L_2正则化、提前终止训练、学习率衰减等。 (2)样本不均衡问题:在调试过程中,我们每次将分类错误(mis-classified)的样本进行输出,发现错误集中于小类别的样本数据。因此,我们尝试了数据增广策略;此外,实验表明,适当减少batchsize有助于对此类数据的学习。 (3)小数据集的预处理问题:相比于工业界用于预训练任务的数据集,给定的数据集规模较小。因此,预处理过程一方面会让数据变得更为精细;另一方面,过多的处理会造成信息流失,使得模型可学习的信息量减少,最终“无物可学”。因此,需考虑预处理的适度问题。 实验心得体会在本科时,数据挖掘课的文本分类作业是通过WEKA软件“调包”实现的,当时便对文本挖掘产生了巨大的兴趣,但没有机会动手“造轮子”,也不明白梯度下降等算法的原理,不理解为什么代码可以work。 在暑期学期中,通过智能计算数学基础、深度学习两门课程,我初步建立了较为完善的知识体系。在完成了四次实验以及最终的大作业之后,我终于对曾经感到非常困惑的深度学习领域产生了较为清晰的认知。 在大作业的选题时,我决定再次选择文本分类的题目。在完成作业的过程中,我直观地感受到了自身的成长:从对公式的不解到手动推导公式、从调包完成作业到动手实现、从对待不同类型数据的恐慌到能够熟练运用词嵌入、序列采样等方法进行处理……之前道听途说的各种技巧,成为亲手写下的代码时,会觉得心里少了许多浮躁,多了一分踏实。 同时,数据科学精彩、丰富的一面逐渐映入眼帘。疫情数据的生活性、数据处理的艺术性、优化方法的严密性、偏差和误差的偶然性,交融着理性的光芒和感性的色彩,使我对这门学科产生了更深层的理解和敬意。 非常幸运,能在这个暑假修读万老师主讲的《深度学习》课程。希望在以后的学习生活中,也能够一直做到理论结合实践,做到知行合一,止于至善。 参考文献[1] 清博大数据-SMP2020微博情绪分类评测汇报 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 12:43:21- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |