网站备案的链接如何创建电商平台
news/
2025/10/6 22:19:22/
文章来源:
网站备案的链接,如何创建电商平台,中国十大购物网站排行榜,网站 框架前言
这篇文章用于记录阿里天池 NLP 入门赛#xff0c;详细讲解了整个数据处理流程#xff0c;以及如何从零构建一个模型#xff0c;适合新手入门。
赛题以新闻数据为赛题数据#xff0c;数据集报名后可见并可下载。赛题数据为新闻文本#xff0c;并按照字符级别进行匿名…前言
这篇文章用于记录阿里天池 NLP 入门赛详细讲解了整个数据处理流程以及如何从零构建一个模型适合新手入门。
赛题以新闻数据为赛题数据数据集报名后可见并可下载。赛题数据为新闻文本并按照字符级别进行匿名处理。整合划分出14个候选分类类别财经、彩票、房产、股票、家居、教育、科技、社会、时尚、时政、体育、星座、游戏、娱乐的文本数据。实质上是一个 14 分类问题。
赛题数据由以下几个部分构成训练集20w条样本测试集A包括5w条样本测试集B包括5w条样本。
比赛地址零基础入门NLP - 新闻文本分类_学习赛_天池大赛-阿里云天池的赛制
数据可以通过上面的链接下载。
其中还用到了训练好的词向量文件。
词向量下载链接: 百度网盘 请输入提取码 提取码: qbpr
这篇文章中使用的模型主要是CNN LSTM Attention主要学习的是数据处理的完整流程以及模型构建的完整流程。虽然还没有使用 Bert 等方案不过如果看完了这篇文章理解了整个流程之后即使你想要使用其他模型来处理也能更快实现。
1. 为什么写篇文章
首先这篇文章的代码全部都来源于 Datawhale 提供的开源代码我添加了自己的笔记帮助新手更好地理解这个代码。
1.1 Datawhale 提供的代码有哪些需要改进
Datawhale 提供的代码里包含了数据处理以及从 0 到 1模型建立的完整流程。但是和前面提供的 basesline 的都不太一样它包含了非常多数据处理的细节模型也是由 3 个部分构成所以看起来难度陡然上升。
其次代码里的注释非常少也没有讲解整个数据处理和网络的整体流程。这些对于新手来说增加了理解的门槛。 在数据竞赛方面我也是一个新人花了一天的时间仔细研究数据在一种每一个步骤的转化对于一些难以理解的代码在群里询问之后也得到了 Datawhale 成员的热心解答。最终才明白了全部的代码。
1.2 我做了什么改进
所以为了减少对于新手的阅读难度我添加了一些内容。 首先梳理了整个流程包括两大部分数据处理和模型。 因为代码不是从上到下顺序阅读的。因此更容易让人理解的做法是先从整体上给出宏观的数据转换流程图其中要包括数据在每一步的 shape以及包含的转换步骤让读者心中有一个框架图再带着这个框架图去看细节会更加了然于胸。 其次除了了解了整体流程在真正的代码细节里读者可能还是会看不懂某一段小逻辑。因此我在原有代码的基础之上增添了许多注释以降低代码的理解门槛。
2. 数据处理
2.1 数据拆分为 10 份
数据首先会经过all_data2fold函数这个函数的作用是把原始的 DataFrame 数据转换为一个list有 10 个元素表示交叉验证里的 10 份每个元素是 dict每个dict包括 label 和 text。
首先根据 label 来划分数据行所在 index, 生成 label2id。
label2id 是一个 dictkey 为 labelvalue 是一个 list存储的是该类对应的 index。
然后根据label2id把每一类别的数据划分到 10 份数据中。最终得到的数据fold_data是一个list有 10 个元素每个元素是 dict包括 label 和 text的列表[{labels:textx}, {labels:textx}. . .]。最后把前 9 份数据作为训练集train_data最后一份数据作为验证集dev_data并读取测试集test_data。 2.2 定义并创建 Vacab
Vocab 的作用是 创建 词 和 index 对应的字典这里包括 2 份字典分别是_id2word 和 _id2extword。 其中 _id2word 是从新闻得到的 把词频小于 5 的词替换为了 UNK。对应到模型输入的 batch_inputs1。 _id2extword 是从 word2vec.txt 中得到的有 5976 个词。对应到模型输入的 batch_inputs2。 后面会有两个 embedding 层其中 _id2word 对应的 embedding 是可学习的_id2extword 对应的 embedding 是从文件中加载的是固定的。 创建 label 和 index 对应的字典。 上面这些字典都是基于train_data创建的。
3. 模型
3.1 把文章分割为句子
上上一步得到的 3 个数据都是一个listlist里的每个元素是 dict每个 dict 包括 label 和 text。这 3 个数据会经过 get_examples函数。 get_examples函数里会调用sentence_split函数把每一篇文章分割成为句子。
然后根据vocab把 word 转换为对应的索引这里使用了 2 个字典转换为 2 份索引分别是word_ids和extword_ids。最后返回的数据是一个 list每个元素是一个 tuple: (label, 句子数量doc)。其中doc又是一个 list每个 元素是一个 tuple: (句子长度word_ids, extword_ids)。
在迭代训练时调用data_iter函数生成每一批的batch_data。在data_iter函数里会调用batch_slice函数生成每一个batch。拿到batch_data后每个数据的格式仍然是上图中所示的格式下面调用batch2tensor函数。
3.2 生成训练数据
batch2tensor函数最后返回的数据是(batch_inputs1, batch_inputs2, batch_masks), batch_labels。形状都是(batch_size, doc_len, sent_len)。doc_len表示每篇新闻有几句话sent_len表示每句话有多少个单词。
batch_masks在有单词的位置值为1其他地方为 0用于后面计算 Attention把那些没有单词的位置的 attention 改为 0。
batch_inputs1, batch_inputs2, batch_masks形状是(batch_size, doc_len, sent_len)转换为(batch_size * doc_len, sent_len)。
3.3 网络部分
下面终于来到网络部分。模型结构图如下
3.3.1 WordCNNEncoder
WordCNNEncoder 网络结构示意图如下
1. Embedding
batch_inputs1, batch_inputs2都输入到WordCNNEncoder。WordCNNEncoder包括两个embedding层分别对应batch_inputs1embedding 层是可学习的得到word_embedbatch_inputs2读取的是外部训练好的词向量因此是不可学习的得到extword_embed。所以会分别得到两个词向量将 2 个词向量相加得到最终的词向量batch_embed形状是(batch_size * doc_len, sent_len, 100)然后添加一个维度变为(batch_size * doc_len, 1, sent_len, 100)对应 Pytorch 里图像的(B, C, H, W)。
2. CNN
然后分别定义 3 个卷积核output channel 都是 100 维。
第一个卷积核大小为[2,100]得到的输出是(batch_size * doc_len, 100 sent_len-21, 1)定义一个池化层大小为[sent_len-21, 1]最终得到输出经过squeeze()的形状是(batch_size * doc_len, 100)。
同理第 2 个卷积核大小为[3,100]第 3 个卷积核大小为[4,100]。卷积池化得到的输出形状也是(batch_size * doc_len, 100)。
最后将这 3 个向量在第 2 个维度上做拼接得到输出的形状是(batch_size * doc_len, 300)。
3.3.2 shape 转换
把上一步得到的数据的形状转换为(batch_size , doc_len, 300)名字是sent_reps。然后对mask进行处理。
batch_masks的形状是(batch_size , doc_len, 300)表示单词的 mask经过sent_masks batch_masks.bool().any(2).float()得到句子的 mask。含义是在最后一个维度判断是否有单词只要有 1 个单词那么整句话的 mask 就是 1sent_masks的维度是(batch_size , doc_len)。
3.3.3 SentEncoder
SentEncoder 网络结构示意图如下
SentEncoder包含了 2 层的双向 LSTM输入数据sent_reps的形状是(batch_size , doc_len, 300)LSTM 的 hidden_size 为 256由于是双向的经过 LSTM 后的数据维度是(batch_size , doc_len, 512)然后和 mask 按位置相乘把没有单词的句子的位置改为 0最后输出的数据sent_hiddens维度依然是(batch_size , doc_len, 512)。
3.3.4 Attention
接着经过Attention。Attention的输入是sent_hiddens和sent_masks。在Attention里sent_hiddens首先经过线性变化得到key维度不变依然是(batch_size , doc_len, 512)。
然后key和query相乘得到outputs。query的维度是512因此output的维度是(batch_size , doc_len)这个就是我们需要的attention表示分配到每个句子的权重。下一步需要对这个attetion做softmax并使用sent_masks把没有单词的句子的权重置为-1e32得到masked_attn_scores。
最后把masked_attn_scores和key相乘得到batch_outputs形状是(batch_size, 512)。
3.3.5 FC
最后经过FC层得到分类概率的向量。
4. 完整代码注释
4.1 数据处理
导入包
import random import numpy as np import torch import logging logging.basicConfig(levellogging.INFO, format%(asctime)-15s %(levelname)s: %(message)s) 查看本文全部内容欢迎访问天池技术圈官方地址【详细注释流程讲解】基于深度学习的文本分类 TextCNN_天池技术圈-阿里云天池
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/929762.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!