总览
介绍
在我的编程历程中,我总是求助于最先进的架构。现在得益于深度学习框架,比如说,Keras和 ,实现先进的架构已经变得更简单了。这些深度学习框架提供了一种实现复杂模型架构和算法的简单方式,不需要你掌握大量的专业知识和编程技能。总结来说,这是数据科学的金矿。
在本文中,我们将使用框架,它以其快速的计算能力而闻名。因此,在本文中,我们将介绍解决文本分类问题的关键点。然后我们将在框架实现我们的第一个文本分类器!
提示:在继续浏览前,我推荐先阅读这篇文章:
A - Guide to and How it Works from :
大纲
一、为什么用来解决文本分类问题
1. 解决Out of words
2. 解决变长序列
3. 包装器和预训练模型
二、了解问题的场景
三、实现文本分类
一、为什么用来解决文本分类问题?
在我们深入专业概念前,我们先快速熟悉一下这个框架。的基本数据单元是,类似于中的numpy数列。使用的最重要的两个优点是:
我肯定你在想-为什么我们要用处理文本数据?接下来我们讨论一下的一些令人难以置信的特性,这些特性使它不同于其他框架,特别是在处理文本数据时。
1.处理Out of words问题
文本分类模型是在固定数据大小的文本数据集上进行训练的。但是对于推理问题,可能会遇到有些词并不涵盖在词汇集内,这些词叫做Out of words。忽略Out of words可能会导致信息丢失,因此这是一个重要的问题。
为了解决这个问题,支持把训练数据集中的稀有词替换为 token,帮助我们处理Out of words问题。
另外,还提供了处理变长序列的方法。
2.处理变长文本序列
是否听过,循环神经网络用来解决变长序列的问题,有没有疑惑它是怎么实现的?带来了很有用的' ',来实现动态循环神经网络。
(填充)是在句子的开头或者结尾填充额外的token的过程。由于每个句子的词的数量不同,我们把长度不同的句子输入,增加 ,扩充以使得句子等长。
由于大部分的框架支持的是静态网络文本分类模型,也就是说在模型训练过程中,模型框架是不变的,因此是必要的。尽管解决了变长序列的问题,但也带来了新的问题—— token是增加了新的信息/数据,下面我用一个简单的图来做解释。
下边这个图中,最后一个单词表示的是一个 token,但它也在产生输出的过程里发生了作用。这个问题可以交给中的 (压缩填充序列)来处理。
压缩填充会忽略掉 token的部分。这些值,永远不会出现在循环神经网络的训练过程中,可以帮助我们建立动态的循环神经网络。
3.包装和预训练的模型
正在推出先进的框架。 Face 公司的库提供了超过32个先进的框架用于自然语言理解和自然语言生成。
除此之外,还提供了一些预训练的模型,可以用很少的代码去解决文本到语言、目标检测等问题。
是不是感觉到难以置信?这些是的一些非常有用的特性。现在让我们使用解决文本分类问题。
二、了解问题的场景
作为本文的一部分,我们将研究一个非常有趣的问题。
Quora希望在他们的平台上跟踪“不真诚”的问题,以便让用户在分享知识的同时感到安全。在这种情况下,一个不真诚的问题被定义为一个旨在陈述而不是寻求有用答案的问题。为了进一步分解这一点,这里有一些特征可以表明某个特定问题是不真诚的:
训练集包括以上被问的问题,以及一个标志它是否是不真诚的标签(=1表示不真诚)。基本事实中存在噪声,也就是说,训练集并不是完美的。我们的任务是识别一个给定的问题是否是“不真诚的”。
数据下载链接为:
现在是时候用编写我们自己的文本分类模型了。
三、实现文本分类
首先导入所有建模需要的包。这里有一个简单的关于我们要用到的包的概览:
为了使结果可复现,我指定了种子值。由于深度学习模型的随机性,在执行时可能会产生不同的结果,因此指定种子值非常重要。
现在我们来看,如何用field(域)来做文本的预处理。这里有两种域对象——Field和。我们来快速理解一下它们的区别:
在使用Field之前,看一下它的不同参数和用途:
然后,创建元组构成的列表,每个元组都包含一个列名,第二个值是field对象。另外,按照csv文件中列的顺序,来排列元组,当我们忽略一列的时候,用(None,None)表示。
读入必要的列——问题和标签。
fields = [(None, None), ('text',TEXT),('label', LABEL)]
这个代码块中,我通过定义field对象加载了自定义数据集。
现在让我们将数据集分成训练和验证数据
下一步是建立文本的并把它们转化为整数序列。包含整个文本中的所有的独立的词,每一个词都分配一个索引。下面是参数:
我们建立起,用预训练好的词嵌入来初始化单词成向量。如果你想随机初始化词嵌入,可以忽略向量的参数。
接下来,准备训练模型的batch。以需要最小填充量的方式形成批次。
现在需要定义模型的架构来解决这个二分类问题。Torch中的nn模块,是一个所有模型的基础模型。也就是说文本分类模型,每个模型都必须是nn模块的子类。
我定义了两个函数,init和。我来解释一下这两个函数的应用场景。
最后,我们理解一下各层的细节问题和参数。
嵌入层:对于任何NLP相关的任务,词嵌入都很重要,因为它可以应用数字形式表示一个单词。嵌入层得到一个查询表,其中每一行代表一个词嵌入。嵌入层可以把表示文本的整数序列转化为稠密向量矩阵。嵌入层的两个重要的参数:
LSTM:LSTM是RNN的一个变体,可以学习长的依赖关系。下面列举了LSTM的一些你应该了解的重要参数:
Layer:线性层指的是稠密层,有两个重要参数:
压缩填充:上文已经讨论过,压缩填充用于动态循环神经网络。如果不采用压缩填充的话,填充后的输入,rnn也会处理输入,并返回元素的 state。但压缩填充是一个很棒的包装,它不显示填充的输入。它直接忽略填充部分并返回非填充元素部分的 state。
现在我们已经对这个架构中的所有板块都有了了解,现在可以去看代码了!
下一步是定义超参、初始化模型。
让我们看看模型摘要,并使用预训练的词嵌入初始化嵌入层。
在这里,我定义了模型的优化器、损失和度量:
建模的两个阶段:
接下来是定义用于训练模型的函数的代码块。
所以我们有一个函数来训练模型,但是我们也需要一个函数来评估模型。我们来吧 !
最后,我们将对模型进行一定数量的训练,并保存每个时期的最佳模型。
让我们加载最佳模型并定义一个推理函数,它接受用户定义的输入并进行预测太神了!让我们用这个模型来预测几个问题。
小结
我们已经看到了如何在中构建自己的文本分类模型,并了解了压缩填充的重要性。您可以随意使用长短期模型的超参数,如隐藏节点数、隐藏层数等,以进一步提高性能。
原文链接:
原文标题:
Build Your First Text model using
迪奥科技致力于人工智能与大数据算法研发与应用领域的深度挖掘,聚焦“数字员工”、“数字企业”应用场景,核心技术包含机器学习、计算机视觉算法、自然语言识别,为企业客户提供数字员工产品、企业数字化与智能化改造应用解决方案,主要客户来自能源、证券金融、化工、政务、教育等行业。