注:本文翻译自GitHub上的一篇介绍,介绍了基于深度学习的文本分类问题。代码和部分模型介绍在GitHub上,文末有链接。


这个库的目的是探索用深度学习进行NLP文本分类的方法。

它具有文本分类的各种基准模型。

它还支持多标签分类,其中多标签与句子或文档相关联。

虽然这些模型很多都很简单,可能不会让你在这项文本分类任务中游刃有余,但是这些模型中的其中一些是非常经典的,因此它们可以说是非常适合作为基准模型的。



每个模型在模型类型下都有一个测试函数。你可以利用模型来解决一些人工较难的任务。基于深度学习的大规模多标签文本分类论文。链接:large scale
muli-label text classification with deep learning
<https://github.com/brightmart/text_classification/blob/master/multi-label-classification.pdf>

这个几个模型也可以用于构建问答系统,或者是序列生成。



我们还探讨了用两个seq2seq模型(带有注意的seq2seq模型,以及transformer:attention is all you
need)进行文本分类。同时,这两个模型也可以用于生成序列和其他任务。如果你的任务是多标签分类,那么你就可以将问题转化为序列生成。




我们实现了两个记忆网络:其中一个是动态存储网络(dynamic memory
network)。在此之前,该模型已经在问答问题、情感分析、序列生成任务中达到了最佳水平。它被称为可以做多种不同任务的模型,并且都可以达到较高的水平。它有四个模块。
最关键的组成部分就是事件记忆模块(episodic memory module)。该模型利用门机制(gate mechanism)来实现注意力,同时使用
gated-gru 去更新 episodic memory,然后还有另一个gru(垂直方向)来实现隐藏状态的更新。该模型还具有传递推理的能力。



第二个记忆网络:循环实体网络(recurrent entity network):追踪世界的状态。它用键值对块(blocks of key-value
pairs)作为记忆,并行运行,从而获得新的状态。它可以用于使用上下文(或历史)来回答建模问题。例如,你可以让模型读取一些句子(作为文本),并提出一个问题(作为查询),然后请求模型预测答案;如果你像查询一样向其提供故事,那么它就可以进行分类任务。


如果你需要样本数据和一些预先用word2vec训练好的词嵌入(word  embedding),可以在closed issues中找到,例如:issues 3
<https://github.com/brightmart/text_classification/issues/3>


你也可以在data文件夹中找到所需的数据集。data文件包含两个文件。sample_single_label.txt . 50k个单一的标签数据

sample_multiple_label.txt  .20k个多标签数据。输入和标签是用“label”分开的。


如果你想了解更多关于文本分类,或这些模型可以应用的任务的数据集详细信息,可以点击链接进行查询,我们选择了一个:https://biendata.com/competition/zhihu/

模型:

1.fastText

2.TextCNN

3.TextRNN

4.RCNN

5.分层注意网络(Hierarchical Attention Network)

6.具有注意的seq2seq模型(seq2seq with attention)

7.Transformer("Attend Is All You Need")

8.动态记忆网络(Dynamic Memory Network)


9.实体网络:追踪世界的状态


10.Ensemble models


11.Boosting:


该模型是多模型堆叠而来的。每一层都是一个模型。结果将基于加在一起的logits,层之间的唯一链接是标签权重。每个标签的浅层预测误差率将成为下一层的权重。那些错误率很高的标签会有很大的权重。所以后面的层将更加关注那些错误预测的标签,并试图修复前一层的误差。结果是,我们可以得到一个很强大的模型。查看: 
a00_boosting/boosting.py




其他模型:

1.BiLstm Text Relation

2.Two CNN Text Relation

3.BiLstm Text Relation Two RNN



性能(多标签标签预测任务,要求预测能够达到前5,300万训练数据,满分:0.5)






Ensemble of TextCNN,EntityNet,DynamicMemory: 0.411

Ensemble EntityNet,DynamicMemory: 0.403







注意:






m : minutes,h:hours



HierAtteNetwork   : Hierarchical Attention Network

Seq2seqAttn   :Seq2seq with attention



DynamicMemory :DynamicMemoryNetwork

Transformer : Attention Is All You Need

用途:

1.模型在xxx_model.py中

2.运行python xxx_train.py来训练模型

3.运行python xxx_predict.py进行推理(测试)。

每个模型在模型下都有一个测试方法。你可以先运行测试方法来检查模型是否能正常工作。

环境:

python 2.7+tensorflow 1.1



(tensorflow
1.2,1.3,1.4也是可以应用的;大多数模型也应该在其他tensorflow版本中正常应用,因为我们使用非常少的特征来将其结合到某些版本中;如果你使用的是python
3.5,只要更改print / try catch函数的话,它也会运行得很好。)

TextCNN 模型已经可以转换成python 3.6版本

注意:

一些util函数是在data_util.py中的;典型输入如:“x1 x2 x3 x4 x5 label
323434”,其中“x1,x2”是单词,“323434”是标签;它具有一个将预训练的单词加载和分配嵌入到模型的函数,其中单词嵌入在word2vec或fastText中进行预先训练。

模型细节:





1.快速文本(fastText)



是这篇论文的实现:Bag of Tricks for Efficient Text Classification
<https://arxiv.org/abs/1607.01759>




在给句子中每一个word编码后,随后这个词表示平均为一个文本表示,这个文本表示将会反馈给一个线性分类器。他使用softmax函数来计算预定义类中的概率分布。利用交叉熵来计算损失。bag
of
word表示不会考虑到词序问题。为了考虑词序,n-gram特征用于捕获本地词序的部分信息;当类的数量很大时,计算线性分类器的计算量很大。所以他使用分层softmax来加速训练过程。


1.使用bi-gram 或者tri-gram。



2.使用NCE损失,加速我们的softmax计算(不使用原始论文中的层次softmax)

结果:性能与原始论文中的一样好,速度也非常快。




查看:p5_fastTextB_model.py








2.文本卷积神经网络(Text CNN)



《卷积神经网络进行句子分类》ConvolutionalNeuralNetworksforSentenceClassification
<http://www.aclweb.org/anthology/D14-1181>论文的实现


结构:降维---> conv ---> 最大池化 --->完全连接层--------> softmax

查看:p7_Text CNN_model.py



为了能够使用TextCNN获得非常好的结果,你还需要仔细阅读此论文“用于句子分类的卷积神经网络灵敏度分析(和从业者指南)A Sensitivity
Analysis of (and Practitioners' Guide to) Convolutional Neural Networks for
Sentence Classification <https://arxiv.org/abs/1510.03820>
,它可以帮助你了解一些影响性能的相关见解。当然,你还需要根据具体任务来更改某些设置。



卷积神经网络是解决计算机视觉问题的主要手段。 现在我们将展示CNN如何用于NLP,特别是文本分类。句子长度会因人而异。
所以我们将使用pad来获得固定长度,n。 对于句子中的每个标记,我们将使用单词嵌入来获得一个固定的维度向量d。 所以我们的输入是一个二维矩阵:(n,d)。
这跟CNN用于图象是类似的。




首先,我们将对我们的输入进行卷积计算。他是滤波器和输入部分之间的元素乘法。我们使用k个滤波器,每个滤波器是一个二维矩阵(f,d)。现在输出的将是k个列表,每个列表的长度是n-f+1。每个元素是标量(scalar)。请注意,第二维将始终是单词嵌入的维度。我们使用不同的大小的滤波器从文本输入中获取丰富的特征,这与n-gram特征是类似的。



其次,我们将卷积运算的输出做最大池化。对于k个列表,我们将得到k个标量。



第三,我们将连接所有标量来获得最终的特征。他是一个固定大小的向量。它与我们使用的滤波器的大小无关。



最后,我们将使用线性层把这些特征映射到之前定义的标签。




3.文本循环神经网络(Text RNN)

结构1:embedding--->bi-drectional lstm ---> concat output  -->average----->
softmax layer



查看:p8_Text RNN_model.py




结构1:embedding--->bi-drectional lstm --->dropout ---> concat output  -->lstm--->
dropout---> FC layer-----> softmax layer



查看:p8_TextRNN_model_mutillayer.py








4.双向长短期记忆网络文本关系(BiLstm Text Relation)

结构与Text RNN相同。但输入是被特别设计的。例如:输入“这台电脑多少钱?笔记本电脑的股票价格(how much is the computer?
EOS price of laptop)”。“EOS”是一个特殊的标记,将问题1和问题2分开。

查看:p9_BiLstm Text Relation_model.py

5.两个卷积神经网络文本关系(two CNN Text Relation)

结构:首先用两个不同的卷积来提取两个句子的特征,然后连接两个功能,使用线性变换层将投影输出到目标标签上,然后使用softmax。

查看:p9_two CNN Text Relation_model.py

6.双长短期记忆文本关系双循环神经网络(BiLstm Text Relation Two RNN)

结构:一个句子的一个双向lstm(得到输出1),另一个句子的另一个双向lstm(得到输出2)。那么:softmax(输出1 M输出2)

查看:p9_BiLstm Text Relation Two RNN_model.py

有关更多详细信息,你可以访问:《Deep Learning for
Chatbots》的第2部分—在Tensorflow中实现一个基于检索的模型(Implementing a Retrieval-Based Model in
Tensorflow)

7.循环卷积神经网络(RCNN)

用于文本分类的循环卷积神经网络。

《用于文本分类的循环卷积神经网络》Recurrent Convolutional Neural Networks for Text
Classification
<https://scholar.google.com.hk/scholar?q=Recurrent+Convolutional+Neural+Networks+for+Text+Classification&hl=zh-CN&as_sdt=0&as_vis=1&oi=scholart&sa=X&ved=0ahUKEwjpx82cvqTUAhWHspQKHUbDBDYQgQMIITAA>
论文的实现。





结构:1)循环结构(卷积层)2)最大池化3)完全连接层+ softmax

它用左侧文本和右侧文本学习句子或文档中的每个单词的表示:

表示当前单词=
[left_side_context_vector,current_word_embedding,right_side_context_vecotor]。

对于左侧文本,它使用一个循环结构,前一个单词的非线性转换和左侧上一个文本;类似于右侧文本。



查看:p71_TextRCNN_model.py




8. 分层注意网络(Hierarchical Attention Network)



《用于文档分类的分层注意网络》HierarchicalAttentionNetworksforDocumentClassification
<https://www.cs.cmu.edu/~diyiy/docs/naacl16.pdf>论文的实现。




结构:

1)降维

2.词编码器:词级双向GRU,以获得丰富的词汇表征

3.次注意:词级注意在句子中获取重要信息

4.句子编码器:句子级双向GRU,以获得丰富的句子表征

5.句子注意:句级注意以获得句子中的重点句子



6.FC + Softmax




















在NLP中,可以对单个句子进行文本分类,但是它也可以用于多个句子。我们可以称之为文档分类。Wordsd的形式将sentence。
并且sentence是文件的形式。 在这种情况下,可能存在一种内在的结构。那么我们如何模拟这种类型的任务呢?文件的所有部分是否同样重要?
我们如何确定哪一部分比另一部分更重要?




它有两个独特的特点:



1)它具有体现文件层次结构的层次结构





2)它在单词和句子级别使用两个级别的注意力机制,它使模型能够捕捉到不同级别的重要信息。



Word Encoder:对于句子中的每个单词,它都嵌入到分布向量空间中的词向量中。它使用双向GRU来编码句子。
通过从两个方向连接向量,它现在可以形成句子的表示,它也捕获上下文信息。

Word Attention:同样的词比其他的更重要。说明注意力机制是有效的。
它首先使用一层MLP来获得句子的隐藏表示,然后测量该单词的重要性作为与单词级别上下文向量Uw的相似性,并通过softmax函数获得归一化重要性。

Sentence Attention:句子等级向量用于测量句子之间的重要性。类似于词注意力机制。


数据输入:


一般来说,这个模型的输入应该是几个句子,而不是一个句子。形式是:[None,sentence_lenght]。其中None意味着batch_size。


在我的训练数据中,对于每个样本来说,我有四个部分。每个部分具有相同的长度。我将四个部分形成一个单一的句子。该模型将句子分为四部分,形成一个形状为:[None,num_sentence,sentence_length]的张量。其中num_sentence是句子的个数(在我的设置中,其值等于4)。

查看:p1_HierarchicalAttention_model.py

9. 具有注意的Seq2seq模型

具有注意的Seq2seq模型的实现是通过《共同学习排列和翻译的神经机器翻译》NEURAL MACHINE TRANSLATION BY JOINTLY
LEARNING TO ALIGN AND TRANSLATE <https://arxiv.org/pdf/1409.0473.pdf>来实现的。

一、结构:

2)bi-GRU也从源语句(向前和向后)获取丰富的表示。



3)具有注意的解码器。




二、数据输入:

使用三种输入中的两种:

1)编码器输入,这是一个句子;

2)解码器输入,是固定长度的标签列表;

3)目标标签,它也是一个标签列表。

例如,标签是:“L1 L2 L3 L4”,则解码器输入将为:[_
GO,L1,L2,L2,L3,_PAD];目标标签为:[L1,L2,L3,L3,_END,_PAD]。长度固定为6,任何超出标签将被截断,如果标签不足以填补,将填充完整。

三、注意机制:

1.传输编码器输入列表和解码器的隐藏状态

2. 计算每个编码器输入隐藏状态的相似度,以获得每个编码器输入的可能性分布。

3. 基于可能性分布的编码器输入的加权和。

通过RNN Cell使用这个权重和解码器输入以获得新的隐藏状态

四、Vanilla E编码解码工作原理:

在解码器中,源语句将使用RNN作为固定大小向量(“思想向量”)进行编码:


(1)当训练时,将使用另一个RNN尝试通过使用这个“思想向量”作为初始化状态获取一个单词,并从每个时间戳的解码器输入获取输入。解码器从特殊指令“_GO”开始。在执行一步之后,新的隐藏状态将与新输入一起获得,我们可以继续此过程,直到我们达到特殊指令“_END”。我们可以通过计算对数和目标标签的交叉熵损失来计算损失。logits是通过隐藏状态的投影层(对于解码器步骤的输出,在GRU中,我们可以仅使用来自解码器的隐藏状态作为输出)。

(2)当测试时,没有标签。所以我们应该提供我们从以前的时间戳获得的输出,并继续进程直到我们到达“_END”指令。

五、注意事项:

(1)这里我使用两种词汇。 一个是由编码器使用的单词; 另一个是用于解码器的标签。

(2)对于词汇表,插入三个特殊指令:“_ GO”,“_ END”,“_ PAD”; “_UNK”不被使用,因为所有标签都是预先定义的。

10. Transformer(“Attention Is All You Need”)


状态:完成主要部分,能够在任务中产生序列的相反顺序。你可以通过在模型中运行测试功能来检查它。然而,我还没有在实际任务中获得有用的结果。我们在模型中也使用并行的style.layer规范化、残余连接和掩码。

对于每个构建块,我们在下面的每个文件中包含测试函数,我们已经成功测试了每个小块。




带注意的序列到序列是解决序列生成问题的典型模型,如翻译、对话系统。大多数时候,它使用RNN完成这些任务。直到最近,人们也应用卷积神经网络进行序列顺序问题。但是,Transformer,它仅仅依靠注意机制执行这些任务,是快速的、实现新的最先进的结果。




它还有两个主要部分:编码器和解码器。看以下文章:

编码器:

共6层,每个层都有两个子层。第一是多向自我注意机制;第二个是位置的全连接前馈网络。对于每个子层使用LayerNorm(x +
Sublayer(x)),维度= 512。

解码器:

1.解码器由N = 6个相同层的堆叠组成。

2.除了每个编码器层中的两个子层之外,解码器插入第三子层,其在编码器堆栈的输出上执行多向注意。


3.与编码器类似,我们采用围绕每个子层的残余连接,然后进行层归一化。我们还修改解码器堆栈中的自我注意子层,以防止位置参与到后续位置。这种掩蔽与输出嵌入偏移一个位置的事实相结合确保了位置i的预测只能取决于位于小于i的位置的已知输出。






主要从这个模型中脱颖而出:

1.多向自我注意:使用自我注意,线性变换多次获取关键值的投影,然后开始注意机制







2.一些提高性能的技巧(剩余连接、位置编码、前馈、标签平滑、掩码以忽略我们想忽略的事情)






使用这个模型处理分类任务:

在这里我们只使用编码部分进行任务分类,删除了resdiual连接,只使用了1层。不需要使用mask。

我们使用多头注意力机制和postionwise前馈来提取输入句子的特征,然后使用线性层来投影它以获得logits。




有关模型的详细信息,请查看:a2_transformer.py




11.循环实体网络(Recurrent Entity Network)

输入:

1.故事:它是多句话,作为上下文。

2.问题:一个句子,这是一个问题。

3. 回答:一个单一的标签。

模型结构:

1.输入编码:使用一个词来编码故事(上下文)和查询(问题);通过使用位置掩码将位置考虑在内。

通过使用双向rnn编码故事和查询,性能从0.392提高到0.398,增长了1.5%。

2.动态记忆:

a. 通过使用键的“相似性”,输入故事的值来计算门控。

b. 通过转换每个键,值和输入来获取候选隐藏状态。

c. 组合门和候选隐藏状态来更新当前的隐藏状态。

3. 输出(使用注意机制):

a. 通过计算查询和隐藏状态的“相似性”来获得可能性分布。

b. 使用可能性分布获得隐藏状态的加权和。



c. 查询和隐藏状态的非线性变换获得预测标签。




这个模型的关键点:

1.使用彼此独立的键和值块,可以并行运行。

2.上下文和问题一起建模。使用记忆来追踪世界的状态,并使用隐性状态和问题(查询)的非线性变换进行预测。

3.简单的型号也可以实现非常好的性能。简单的编码作为词的使用包。

有关模型的详细信息,请查看:a3_entity_network.py

在这个模型下,它包含一个测试函数,它要求这个模型计算故事(上下文)和查询(问题)的数字,但故事的权重小于查询。






12.动态记忆网络

模块:Outlook

1.输入模块:将原始文本编码为向量表示。

2.问题模块:将问题编码为向量表示。

3.独特的记忆模块:通过输入,通过注意机制选择哪些部分输入、将问题和以前的记忆考虑在内====>它将产生“记忆”向量。



4.答案模块:从最终的记忆向量生成答案。

详情:

1.输入模块:

一个句子:使用gru获取隐藏状态b.list的句子:使用gru获取每个句子的隐藏状态。例如 [隐藏状态1,隐藏状态2,隐藏状态...,隐藏状态n]。

2.问题模块:使用gru获取隐藏状态。

3.记忆模块:

使用注意机制和循环网络来更新其记忆。

a.需要多集===>传递推理。

e.g. ask where is the football? it will attend to sentence of "john put down
the football"), then in second pass, it need to attend location of john.

b.注意机制:

two-layer feed forward nueral network.input is candidate fact c,previous
memory m and question q. feature get by take: element-wise,matmul and absolute
distance of q with c, and q with m.

c.记忆更新机制:h = f(c,h_previous,g)。 最后一个隐藏状态是应答模块的输入。



4. 答案模块:采取最后的epsoidic记忆,问题,它更新答案模块的隐藏状态。




要做的事情:

1.文本分类的字符级卷积网络

2.文本分类的卷积神经网络:浅词级与深字符级

3.文本分类的深度卷积网络



4.半监督文本分类的对抗训练方法





5.集合模型













结论

在进行大规模多标签分类的过程中,学到了一些而经验教训,并把它们罗列下来:











1.达到高精度最重要的事情是什么?这取决于你正在做的任务。从我们在这里进行的任务来看,我们认为集合模型可以帮助达到非常高的准确性。这种模型是基于 单词、标题和
描述的字符等多个特征训练出来的。然而,在某些情况下,正如alphaGo Zero所演示的那样,算法比数据或计算能力更为重要,事实上AlphaGo
Zero并未使用任何人类数据。



2.任何特定的模型或算法是否有上限?答案是肯定的。这里使用了很多不同的模型,我们发现许多模型具有相似的性能,尽管结构上有很大不同。
在一定程度上,表现的差异并不大。



3.错误的案例研究有用吗?我认为这很有用,特别是当你做了很多不同的事情时,即使都达到了极限。
例如,通过案例研究,你可以找到模型做出正确预测的标签,以及他们犯错的地方。并通过增加这些错误的预测标签权重或从数据中找出潜在的错误来提高性能。



4.我们如何才能成为机器学习的专家?在我看来,加入一个机器学习竞赛或开始一个有大量数据的任务,然后阅读论文并实施一些,这是一个很好的起点。这样
我们会有一些真正的处理具体任务的经验和想法,并且知道它的挑战在哪里。但更重要的是,我们不仅要遵循论文的观点,还要探索一些我们认为可能有助于解决问题的新想法。
例如,通过改变经典模型的结构甚至创造一些新的结构,我们可以有更好的方式解决问题,因为它可能更适合我们正在做的任务。




注:本文翻译自GitHub上的一篇文章,介绍了基于深度学习的文本分类问题。

链接:text classification <https://github.com/DX2017/text_classification>

参考

1. 《用于高效文本分类的技巧》Bag of Tricks for Efficient Text Classification

2.《语音分类的卷积神经网络》Convolutional Neural Networks for Sentence Classification

3.《卷积神经网络对句子分类的敏感性分析(和使用指南)》A Sensitivity Analysis of (and Practitioners'
Guide to) Convolutional Neural Networks for Sentence Classification

4. 《聊天机器人中的深度学习》,第2部分—在Tensorflow中实现基于检索的模型Deep Learning for Chatbots, Part 2
– Implementing a Retrieval-Based Model in Tensorflow(www.wildml.com)

5.《文本分类的复杂卷积神经网络》Recurrent Convolutional Neural Network for Text Classification

6.《文档分类的分层注意网络》Hierarchical Attention Networks for Document Classification

7. 《共同学习对齐排列和翻译的神经机器翻译》Neural Machine Translation by Jointly Learning to Align
and Translate

8. Attention Is All You Need

9. 《问我任何事情:自然语言处理的动态记忆网络》Ask Me Anything:Dynamic Memory Networks for Natural
Language Processing

10.《用循环实体网络跟踪世界的状况》Tracking the state of world with recurrent entity networks

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信