fastText、TextCNN、TextRNN……这里有一套NLP文本分类深度学习方法库供你选择

https://mp.weixin.qq.com/s/_xILvfEMx3URcB-5C8vfTwpython


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

 

它具备文本分类的各类基准模型,还支持多标签分类,其中多标签与句子或文档相关联。github

 

虽然这些模型不少都很简单,可能不会让你在这项文本分类任务中游刃有余,可是这些模型中的其中一些是很是经典的,所以它们能够说是很是适合做为基准模型的。web

 

每一个模型在模型类型下都有一个测试函数。网络

 

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

 

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

 

若是你想了解更多关于文本分类,或这些模型能够应用任务的数据集详细信息,能够点击连接进行查询,咱们选择了一个:性能

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.实体网络:追踪世界的状态

 

其余模型:

1.BiLstm Text Relation;

2.Two CNN Text Relation;

3.BiLstm Text Relation Two RNN

 

性能:

 

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

注意:“HierAtteNetwork”是指Hierarchical Attention Network

 

用途:

  • 模型在xxx_model.py中

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

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

 

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

 

环境:

python 2.7+tensorflow 1.1

(tensorflow 1.2也是能够应用的;大多数模型也应该在其余tensorflow版本中正常应用,由于咱们使用很是少的特征来将其结合到某些版本中;若是你使用的是python 3.5,只要更改print / try catch函数的话,它也会运行得很好。)

 

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

 

模型细节:

 

1.快速文本(fast Text)

 

《用于高效文本分类的技巧》(Bag of Tricks for Efficient Text Classification)论文的实现(https://arxiv.org/abs/1607.01759)

  • 使用bi-gram 或者tri-gram。

  • 使用NCE损失,加速咱们的softmax计算(不使用原始论文中的层次softmax)结果:性能与原始论文中的同样好,速度也很是快。

查看:p5_fastTextB_model.py

 

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

 

《卷积神经网络进行句子分类》(Convolutional Neural Networks for Sentence Classification)论文的实现。(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)固然,你还须要根据具体任务来更改某些设置。

 

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

 

结构:降维--->双向lstm ---> concat输出--->平均 -----> softmax

查看:p8_Text RNN_model.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 Network 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)

结构:

  • 循环结构(卷积层)

  • 最大池化

  • 彻底链接层+ softmax

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

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

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

查看:p71_TextRCNN_model.py

 

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

 

《用于文档分类的分层注意网络》(Hierarchical Attention Networks for Document Classification)论文的实现。(https://www.cs.cmu.edu/~diyiy/docs/naacl16.pdf)

结构:

  • 降维

  • 词编码器:词级双向GRU,以得到丰富的词汇表征

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

  • 句子编码器:句子级双向GRU,以得到丰富的句子表征

  • 句子注意:句级注意以得到句子中的重点句子

  • FC + Softmax

数据输入:

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

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

查看:p1_HierarchicalAttention_model.py

 

9. 具备注意的Seq2seq模型

 

具备注意的Seq2seq模型的实现是经过《共同窗习排列和翻译的神经机器翻译》来实现的。(https://github.com/brightmart/text_classification/blob/master/README.md)

 

结构:

  • 降维

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

  • 具备注意的解码器。

 

数据输入:

使用三种输入中的两种:

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

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

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

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

 

注意机制:

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

  • 计算每一个编码器输入隐藏状态的类似度,以得到每一个编码器输入的可能性分布。

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

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

 

Vanilla E编码解码工做原理:

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

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

当测试时,没有标签。因此咱们应该提供咱们从之前的时间戳得到的输出,并继续进程直到咱们到达“_END”指令。

 

注意事项:

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

对于词汇表,插入三个特殊指令:“_ GO”,“_ END”,“_ PAD”; “_UNK”不被使用,由于全部标签都是预先定义的。

 

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

 

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

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

 

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

 

它还有两个主要部分:编码器和解码器。看如下内容:

 

  • 编码器:

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

 

  • 解码器:

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

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

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

 

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

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

  • 一些提升性能的技巧(剩余链接、位置编码、前馈、标签平滑、掩码以忽略咱们想忽略的事情)。 

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

 

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

 

输入:

  • 故事:它是多句话,做为上下文。

  • 问题:一个句子,这是一个问题。

  • 回答:一个单一的标签。

 

型号结构:

  • 输入编码:

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

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

  • 动态记忆:

  • 经过使用键的“类似性”,输入故事的值来计算门控。

  • 经过转换每一个键,值和输入来获取候选隐藏状态。

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

  • 输出(使用注意机制):

  • 经过计算查询和隐藏状态的“类似性”来得到可能性分布。

  • 使用可能性分布得到隐藏状态的加权和。

  • 查询和隐藏状态的非线性变换得到预测标签。

 

这个模型的关键点:

  • 使用彼此独立的键和值块,能够并行运行。

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

  • 简单的型号也能够实现很是好的性能。简单的编码做为词的使用包。

 

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

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

 

12.动态记忆网络

 

模块:Outlook

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

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

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

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

详情:

  • 输入模块:

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

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

  • 记忆模块:

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

  • 须要多集===>传递推理。

 

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.
  • 注意机制:

 

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.
  • 记忆更新机制:h = f(c,h_previous,g)。 最后一个隐藏状态是应答模块的输入。

  • 答案模块

要作的事情:

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

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

  • 文本分类的深度卷积网络

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

 

参考:

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

相关文章
相关标签/搜索