精华内容
下载资源
问答
  • 其中包含10个类别:automobile、culture、dressing、entertainment、finance、life、medical、military、social、sports,每类包含十万篇文本左右,对训练集和测试集以 3:7 的比例划分进行文本分类。 文本格式如下所...
  • NLP系列之文本分类

    千次阅读 2019-01-18 19:30:24
    本篇博客主要是记录自然语言处理中的文本分类任务中常见的基础模型的使用及分析。Github上brightmart大佬已经整理出很完整的一套文本分类任务的基础模型及对应的模型代码实现。网上也有部分博客将brightmart写的模型...

    1前言

    本篇博客主要是记录自然语言处理中的文本分类任务中常见的基础模型的使用及分析。Github上brightmart大佬已经整理出很完整的一套文本分类任务的基础模型及对应的模型代码实现。网上也有部分博客将brightmart写的模型实现步骤进行翻译整理出来了。本着尊重原创的原则,后面都列出了参考链接,在此也感谢参考链接上的作者。本文将对之前文本分类基础模型的博客和文献进行整理,此外再加上自己的一部分模型分析。毕竟还是需要有自己的东西在这里的,这样才能做到又学到了又进行思考了。

    2文本分类任务

    2.1 文本分类是自然语言处理中很基础的任务,是学习自然语言处理入门的很好的实际操作的任务,笔记当时就是从文本分类开始动手实践。文本分类的任务主要是把根据给出的文本(包括长文本,比如说资讯、新闻、文档等,也包括短文本,比如说评论,微博等)利用自然语言处理技术对文本进行归类整理,简单点说就是说给文本进行类别标注。
    2.2 常见的文本分类模型有基于机器学习的分类方法和基于深度学习的分类方法。对于基于机器学习的分类方法,显然特征的提取和特征的选择过程将会对分类效果起到至关重要的作用。在文本的特征提取上,基于词级层面的TF-IDF特征,n-gram特征,主题词和关键词特征。基于句子级别的有句式,句子长度等特征。基于语义层面的特征可以使用word2vec预训练语料库得到词向量,使用词向量合理的构造出文本的词向量作为文本的语义特征。对于基于深度学习的文本分类方法,显然模型的结构和模型的参数将会对分类效果起到至关作用。在模型结构上常用的基础的神经网络模型有CNN,RNN,GRU,Attention机制,Dropout等。在模型参数的调节上,一方面需要设定好模型的参数学习率,另一位方面需要根据模型的使用特点和要分析的文本内容进行调节。
    说明: 本文通过介绍brightmart在基础神经网络在文本分类上的实验来进行相关的模型介绍和模型分析,该实验主要是在2017年知乎看山杯的一道竞赛题,竞赛内容是对知乎上的问题进行分类,当然此次任务属性文本分类中多标签分类,属于文本分类的范畴。
    2.3各个基模型的实验结果
    brightmart使用以下的基础模型在上述数据集上进行了大量实验,实验结果如下。以下很多模型比较基础,都是非常经典的模型,作为实验的基准模型BaseLine是非常合适的。如果想继续提升实验结果,可能就需要根据数据的特征进行模型的改进或者模型的集成工作了。
    实验对比图

    3基础文本分类模型的介绍及分析

    本部分主要对基础的文本分类进行介绍,主要分为模型结构的论文来源介绍,模型结构,模型的实现步骤,代码的主要实现(也是来自brightmart的项目)和最后关于模型的分析。

    3.1FastText

    3.1.1论文来源
    《Bag of Tricks for Efficient Text Classification》
    3.1.2模型结构
    fasttext3.1.3模型的实现步骤

    从模型的结构可以看出,FastText的模型的实现步骤为:
    1.embedding–>2.average–>3.linear classifier(没有经过激活函数)-> SoftMax分类

    3.1.4模型的关键实现代码

    # 其中None表示你的batch_size大小
    #1.get emebedding of words in the sentence
    sentence_embeddings = tf.nn.embedding_lookup(self.Embedding,self.sentence)  # [None,self.sentence_len,self.embed_size]
    #2.average vectors, to get representation of the sentence
    self.sentence_embeddings = tf.reduce_mean(sentence_embeddings, axis=1)  # [None,self.embed_size]
    #3.linear classifier layer
    logits = tf.matmul(self.sentence_embeddings, self.W) + self.b #[None, self.label_size]==tf.matmul([None,self.embed_size],[self.embed_size,self.label_size])
    

    3.1.5模型的分析

    FastText的模型结构相对是比较简单的,是一个有监督的训练模型。我们知道FastText训练不仅可以得到分类的效果,如果语料充足的话,可以训练得到词向量。
    1. FastText模型结构简单,因为最后对文本的分类都是直接经过线性层来进行分类的,可以说是完成线性的,最后是没有经过激活函数。因此句子结构比较简单的文本分类任务来说,FastText是可以进行的。对于复杂的分类任务,比如说情感分类等,由于网络模型需要学习到语句的语义,语序等特征,显然对于简单的线性层分类是不足的,因此还是需要引入复杂的非线性结构层。正因为模型结构简单,模型训练速度是相对较快的。
    2. FastText引入了N gram特征。从FastText前面的模型结构中,第二层计算的是词向量的平均值,此步骤将会忽略掉文本的词序特征。显然对于文本的分类任务中,这将会损失掉词序特征的。因此,在FastText词向量中引入了N gram的词向量。具体做法是,在N gram也当做一个词,因此也对应着一个词向量,在第二层计算词向量的均值的时候,也需要把N gram对应的词向量也加进来进行计算平均值。通过训练分类模型,这样可以得到词向量和N gram对应的词向量。期间也会存在一个问题,N gram的量其实远比word大的多。因此FastText采用Hash桶的方式,把所有的N gram都哈希到buckets个桶中,哈希到同一个桶的所有n-gram共享一个embedding vector。这点可以联想到,在处理UNK的词向量的时候,也可以使用类似的思想进行词向量的设置。
    词向量图

    3.2TextCNN

    3.2.1论文来源
    《Convolutional Neural Networks for Sentence Classification》
    3.2.2模型结构
    词向量图3.2.3模型的实现步骤

    从模型的结构可以看出,TextCNN的模型的实现步骤为:
    1.embedding—>2.conv—>3.max pooling—>4.fully connected layer-------->5.softmax

    3.2.4模型的关键实现代码

    # 1.=====>get emebedding of words in the sentence
    self.embedded_words = tf.nn.embedding_lookup(self.Embedding,self.input_x)#[None,sentence_length,embed_size]
    self.sentence_embeddings_expanded=tf.expand_dims(self.embedded_words,-1) #[None,sentence_length,embed_size,1). expand dimension so meet input requirement of 2d-conv
    # 2.=====>loop each filter size. for each filter, do:convolution-pooling layer(a.create filters,b.conv,c.apply nolinearity,d.max-pooling)--->
    # you can use:tf.nn.conv2d;tf.nn.relu;tf.nn.max_pool; feature shape is 4-d. feature is a new variable
    #if self.use_mulitple_layer_cnn: # this may take 50G memory.
            #    print("use multiple layer CNN")
            #    h=self.cnn_multiple_layers()
            #else: # this take small memory, less than 2G memory.
    print("use single layer CNN")
    h=self.cnn_single_layer()
    #5. logits(use linear layer)and predictions(argmax)
    with tf.name_scope("output"):
        logits = tf.matmul(h,self.W_projection) + self.b_projection  #shape:[None, self.num_classes]==tf.matmul([None,self.embed_size],[self.embed_size,self.num_classes])
    

    3.2.5模型的分析
    笔者之前详细介绍过一篇TextCNN实现的博客,可以查看卷积神经网络(TextCNN)在句子分类上的实现

    深度学习与机器学习的最重要的不同之处便是:深度学习使用神经网络代替人工的进行特征的抽取。所以,最终模型的效果的好坏,其实是和神经网络的特征抽取的能力强弱相关。在文本处理上,特征抽取能力主要有句法特征提取能力;语义特征提取能力;长距离特征捕获能力;任务综合特征抽取能力。上面四个角度是从NLP的特征抽取器能力强弱角度来评判的,另外再加入并行计算能力及运行效率,这是从是否方便大规模实用化的角度来看的。
    1. TextCNN神经网络主要以CNN网络对文本信息进行特征的抽取,在图像的处理上,CNN的特征抽取能力是非常强的。我们把词向量的维度和文本的长度当成另一个维度是可以构成一个矩阵的,于是,CNN便可以在文本进行卷积核的计算(文本的特征抽取)。此时,卷积核的大小就相当于N gram的特征了。
    2. TextCNN中的实现步骤中是有max pooling的一步的。具体过程是多个卷积核对文本进行滑动获取语义特征,而CNN中的卷积核是能保留特征之间的相对位置的,因为卷积核是滑动的,从左至右滑动,因此捕获到的特征也是如此顺序排列,所以它在结构上已经记录了相对位置信息了。但是卷积层后面立即接上Pooling层的话,Max Pooling的操作逻辑是:从一个卷积核获得的特征向量里只选中并保留最强的那一个特征,所以到了Pooling层,位置信息就被损失掉了(信息损失)。因此在对应需要捕获文本的词序信息特征时,pooling层应该需要添加上位置信息。

    3.3TextRNN/LSTM

    3.3.1模型结构
    词向量图3.3.2模型的步骤

    从模型的结构可以看出,TextRNN/LSTM的模型的实现步骤为:
    1.embedding—>2.bi-directional lstm—>3.concat output—>4.average/last output----->5.softmax layer

    3.3.3模型的关键实现代码

    #1.get emebedding of words in the sentence
    self.embedded_words = tf.nn.embedding_lookup(self.Embedding,self.input_x) #shape:[None,sentence_length,embed_size]
    #2. Bi-lstm layer
    # define lstm cess:get lstm cell output
    lstm_fw_cell=rnn.BasicLSTMCell(self.hidden_size) #forward direction cell
    lstm_bw_cell=rnn.BasicLSTMCell(self.hidden_size) #backward direction cell
    if self.dropout_keep_prob is not None:
        lstm_fw_cell=rnn.DropoutWrapper(lstm_fw_cell,output_keep_prob=self.dropout_keep_prob)
        lstm_bw_cell=rnn.DropoutWrapper(lstm_bw_cell,output_keep_prob=self.dropout_keep_prob)
    # bidirectional_dynamic_rnn: input: [batch_size, max_time, input_size]
    #                            output: A tuple (outputs, output_states)
    #                                    where:outputs: A tuple (output_fw, output_bw) containing the forward and the backward rnn output `Tensor`.
    outputs,_=tf.nn.bidirectional_dynamic_rnn(lstm_fw_cell,lstm_bw_cell,self.embedded_words,dtype=tf.float32) #[batch_size,sequence_length,hidden_size] #creates a dynamic bidirectional recurrent neural network
    print("outputs:===>",outputs) #outputs:(<tf.Tensor 'bidirectional_rnn/fw/fw/transpose:0' shape=(?, 5, 100) dtype=float32>, <tf.Tensor 'ReverseV2:0' shape=(?, 5, 100) dtype=float32>))
    #3. concat output
    output_rnn=tf.concat(outputs,axis=2) #[batch_size,sequence_length,hidden_size*2]
    #4.1 average
    #self.output_rnn_last=tf.reduce_mean(output_rnn,axis=1) #[batch_size,hidden_size*2]
    #4.2 last output
    self.output_rnn_last=output_rnn[:,-1,:] ##[batch_size,hidden_size*2] #TODO
    print("output_rnn_last:", self.output_rnn_last) # <tf.Tensor 'strided_slice:0' shape=(?, 200) dtype=float32>
    #5. logits(use linear layer)
    with tf.name_scope("output"): #inputs: A `Tensor` of shape `[batch_size, dim]`.  The forward activations of the input network.
        logits = tf.matmul(self.output_rnn_last, self.W_projection) + self.b_projection  # [batch_size,num_classes]
    

    3.3.4模型的分析

    1. RNN是典型的序列模型结构,它是线性序列结构,它不断从前往后收集输入信息,但这种线性序列结构在反向传播的时候存在优化困难问题,因为反向传播路径太长,容易导致严重的梯度消失或梯度爆炸问题。为了解决这个问题,引入了LSTM和GRU模型,通过增加中间状态信息直接向后传播,由原来RNN的迭代乘法结构变为后面的加法结构,以此缓解梯度消失问题。于是上面是有LSTM或GRU来代替RNN。
    2. RNN的线性序列结构,让RNN能很好的对不定长文本的输入进行接纳,将文本序列当做随着时间变换的序列状态,很好的接纳文本的从前向后的输入。在LSTM中引入门控制机制,从而使该序列模型能存储之前网络的特征,这对于捕获长距离特征非常有效。所以RNN特别适合NLP这种线形序列应用场景,这是RNN为何在NLP界如此流行的根本原因。
    3. 因为RNN的序列结构,t时刻的状态是依赖t-1时刻的网络状态的,这对于网络大规模的并行进行是很不友好的。也就是说RNN的高效并行计算能力是比较差的。当然可以对RNN结构进行一定程度上的改进,使之拥有一定程度的并行能力。

    3.4RCNN

    3.4.1论文来源
    《Recurrent Convolutional Neural Network for Text Classification》
    3.4.2模型结构
    词向量图3.4.3模型的步骤

    从模型的结构可以看出,RCNN的模型的实现步骤为:
    1.emebedding–>2.recurrent structure (convolutional layer)—>3.max pooling—>4.fully connected layer+softmax

    3.4.4模型的关键实现代码

    #1.get emebedding of words in the sentence
    self.embedded_words = tf.nn.embedding_lookup(self.Embedding,self.input_x) #shape:[None,sentence_length,embed_size]
    #2. Bi-lstm layer
    output_conv=self.conv_layer_with_recurrent_structure() #shape:[None,sentence_length,embed_size*3]
    #3. max pooling
    #print("output_conv:",output_conv) #(3, 5, 8, 100)
    output_pooling=tf.reduce_max(output_conv,axis=1) #shape:[None,embed_size*3]
    #print("output_pooling:",output_pooling) #(3, 8, 100)
    #4. logits(use linear layer)
    with tf.name_scope("dropout"):
        h_drop=tf.nn.dropout(output_pooling,keep_prob=self.dropout_keep_prob) #[None,num_filters_total]
    
    with tf.name_scope("output"): #inputs: A `Tensor` of shape `[batch_size, dim]`.  The forward activations of the input network.
        logits = tf.matmul(h_drop, self.W_projection) + self.b_projection  # [batch_size,num_classes]
    def conv_layer_with_recurrent_structure(self):
            """
            input:self.embedded_words:[None,sentence_length,embed_size]
            :return: shape:[None,sentence_length,embed_size*3]
            """
            #1. get splitted list of word embeddings
            embedded_words_split=tf.split(self.embedded_words,self.sequence_length,axis=1) #sentence_length个[None,1,embed_size]
            embedded_words_squeezed=[tf.squeeze(x,axis=1) for x in embedded_words_split]#sentence_length个[None,embed_size]
            embedding_previous=self.left_side_first_word
            context_left_previous=tf.zeros((self.batch_size,self.embed_size))
            #2. get list of context left
            context_left_list=[]
            for i,current_embedding_word in enumerate(embedded_words_squeezed):#sentence_length个[None,embed_size]
                context_left=self.get_context_left(context_left_previous, embedding_previous) #[None,embed_size]
                context_left_list.append(context_left) #append result to list
                embedding_previous=current_embedding_word #assign embedding_previous
                context_left_previous=context_left #assign context_left_previous
            #3. get context right
            embedded_words_squeezed2=copy.copy(embedded_words_squeezed)
            embedded_words_squeezed2.reverse()
            embedding_afterward=self.right_side_last_word
            context_right_afterward = tf.zeros((self.batch_size, self.embed_size))
            context_right_list=[]
            for j,current_embedding_word in enumerate(embedded_words_squeezed2):
                context_right=self.get_context_right(context_right_afterward,embedding_afterward)
                context_right_list.append(context_right)
                embedding_afterward=current_embedding_word
                context_right_afterward=context_right
            #4.ensemble left,embedding,right to output
            output_list=[]
            for index,current_embedding_word in enumerate(embedded_words_squeezed):
                representation=tf.concat([context_left_list[index],current_embedding_word,context_right_list[index]],axis=1)
                #print(i,"representation:",representation)
                output_list.append(representation) #shape:sentence_length个[None,embed_size*3]
            #5. stack list to a tensor
            #print("output_list:",output_list) #(3, 5, 8, 100)
            output=tf.stack(output_list,axis=1) #shape:[None,sentence_length,embed_size*3]
            #print("output:",output)
            return output
    

    3.4.5模型的分析

    1. 从RCNN的模型结构来看,做出重大改变的是词向量的表示,以往的词向量的表示即是简单的一个词的[word embedding],而RCNN中的表示为[left context; word embedding, right context],从词向量中引入上下文语境。具体的left context=activation(pre left context*Wl+ pre word embedding * Ww)。right context则反过来为之。
    2. RCNN比TextRNN实验的效果是好的,改进后的word embedding起到了很重要的作用。一个词用一个词向量来表示这其实是有一定的局限性的,当遇到一词多意的时候,使用一个词向量来表示一个词,此时就显得不那么恰当了,因为使用一个词向量来表示,这相当于对所有的词义进行了平均获得的。我们可以理解这种一词一个向量的表示为静态词向量。而RCNN中则在原词向量上添加左右context,这相当于引入了词的语境,可以理解为对原单个词向量进行了一定程度上的调整,让一词多义的表示成为可能。

    3.5Hierarchical Attention Network

    3.5.1论文来源
    《Hierarchical Attention Networks for Document Classification》
    3.5.2模型结构
    词向量图3.5.3模型的步骤

    从模型的结构可以看出,HAN的模型的实现步骤为:
    1.emebedding–>2.word encoder(bi-directional GRU)—>3.word Attention—>4.Sentence Encoder(bi-directional GRU)—>5.Sentence Attetion—>6.fC+Softmax

    3.5.4模型的关键实现代码

    # 1.1 embedding of words
    input_x = tf.split(self.input_x, self.num_sentences,axis=1)  # a list. length:num_sentences.each element is:[None,self.sequence_length/num_sentences]
    input_x = tf.stack(input_x, axis=1)  # shape:[None,self.num_sentences,self.sequence_length/num_sentences]
    self.embedded_words = tf.nn.embedding_lookup(self.Embedding,input_x)  # [None,num_sentences,sentence_length,embed_size]
    embedded_words_reshaped = tf.reshape(self.embedded_words, shape=[-1, self.sequence_length,self.embed_size])  # [batch_size*num_sentences,sentence_length,embed_size]
    # 1.2 forward gru
    hidden_state_forward_list = self.gru_forward_word_level(embedded_words_reshaped)  # a list,length is sentence_length, each element is [batch_size*num_sentences,hidden_size]
    # 1.3 backward gru
    hidden_state_backward_list = self.gru_backward_word_level(embedded_words_reshaped)  # a list,length is sentence_length, each element is [batch_size*num_sentences,hidden_size]
    # 1.4 concat forward hidden state and backward hidden state. hidden_state: a list.len:sentence_length,element:[batch_size*num_sentences,hidden_size*2]
    self.hidden_state = [tf.concat([h_forward, h_backward], axis=1) for h_forward, h_backward in
                         zip(hidden_state_forward_list, hidden_state_backward_list)]  # hidden_state:list,len:sentence_length,element:[batch_size*num_sentences,hidden_size*2]
    
    # 2.Word Attention
    # for each sentence.
    sentence_representation = self.attention_word_level(self.hidden_state)  # output:[batch_size*num_sentences,hidden_size*2]
    sentence_representation = tf.reshape(sentence_representation, shape=[-1, self.num_sentences, self.hidden_size * 2])  # shape:[batch_size,num_sentences,hidden_size*2]
    #with tf.name_scope("dropout"):#TODO
    #    sentence_representation = tf.nn.dropout(sentence_representation,keep_prob=self.dropout_keep_prob)  # shape:[None,hidden_size*4]
    
    # 3.Sentence Encoder
    # 3.1) forward gru for sentence
    hidden_state_forward_sentences = self.gru_forward_sentence_level(sentence_representation)  # a list.length is sentence_length, each element is [None,hidden_size]
    # 3.2) backward gru for sentence
    hidden_state_backward_sentences = self.gru_backward_sentence_level(sentence_representation)  # a list,length is sentence_length, each element is [None,hidden_size]
    # 3.3) concat forward hidden state and backward hidden state
    # below hidden_state_sentence is a list,len:sentence_length,element:[None,hidden_size*2]
    self.hidden_state_sentence = [tf.concat([h_forward, h_backward], axis=1) for h_forward, h_backward in zip(hidden_state_forward_sentences, hidden_state_backward_sentences)]
    
    # 4.Sentence Attention
    document_representation = self.attention_sentence_level(self.hidden_state_sentence)  # shape:[None,hidden_size*4]
    with tf.name_scope("dropout"):
        self.h_drop = tf.nn.dropout(document_representation,keep_prob=self.dropout_keep_prob)  # shape:[None,hidden_size*4]
    # 5. logits(use linear layer)and predictions(argmax)
    with tf.name_scope("output"):
        logits = tf.matmul(self.h_drop, self.W_projection) + self.b_projection  # shape:[None,self.num_classes]==tf.matmul([None,hidden_size*2],[hidden_size*2,self.num_classes])
    return logits
    

    3.5.5模型的分析

    1. Hierarchical Attention Network(HAN)分层对文本进行构建模型(Encoder),此外在每层加上了两个Attention层,分别表示对文本中的按错和句子的重要性进行建模。HAN比较适用于长文本的分类,长文本包括多个句子,句子中包括多个词,适用于对文本的分层建模。首先,HAN考虑到文本的层次结构:词构成句,句子构成文档。因此,对文本的建模时也针对这两部分。因为一个句子中每个词对分类的结果影响的不一样,一个句子对文本分类的结果影响也不一样。所以,引入Attention机制,这样每个词,每个句子的对分类的结果的影响将不会一样。具体计算的公式如下:
    attention

    3.6Transformer

    3.6.1论文来源
    《Attention Is All You Need》
    3.6.2模型结构
    transformer3.6.3模型的步骤

    从模型的结构可以看出,Transformer的模型的实现步骤为:
    1.word embedding&position embedding–>2.Encoder(2.1multi head self attention->2.2LayerNorm->2.3position wise fully connected feed forward network->2.4LayerNorm)—>3.linear classifie

    3.6.4模型的关键实现代码

    input_x_embeded = tf.nn.embedding_lookup(self.Embedding,self.input_x)  #[None,sequence_length, embed_size]
    input_x_embeded=tf.multiply(input_x_embeded,tf.sqrt(tf.cast(self.d_model,dtype=tf.float32)))
    input_mask=tf.get_variable("input_mask",[self.sequence_length,1],initializer=self.initializer)
    input_x_embeded=tf.add(input_x_embeded,input_mask) #[None,sequence_length,embed_size].position embedding.
    
    # 2. encoder
    encoder_class=Encoder(self.d_model,self.d_k,self.d_v,self.sequence_length,self.h,self.batch_size,self.num_layer,input_x_embeded,input_x_embeded,dropout_keep_prob=self.dropout_keep_prob,use_residual_conn=self.use_residual_conn)
    Q_encoded,K_encoded = encoder_class.encoder_fn() #K_v_encoder
    
    Q_encoded=tf.reshape(Q_encoded,shape=(self.batch_size,-1)) #[batch_size,sequence_length*d_model]
    with tf.variable_scope("output"):
        logits = tf.matmul(Q_encoded, self.W_projection) + self.b_projection #logits shape:[batch_size*decoder_sent_length,self.num_classes]
    print("logits:",logits)
    return logits
    def encoder_single_layer(self,Q,K_s,layer_index):
        """
        singel layer for encoder.each layers has two sub-layers:
        the first is multi-head self-attention mechanism; the second is position-wise fully connected feed-forward network.
        for each sublayer. use LayerNorm(x+Sublayer(x)). input and output of last dimension: d_model
        :param Q: shape should be:       [batch_size*sequence_length,d_model]
        :param K_s: shape should be:     [batch_size*sequence_length,d_model]
        :return:output: shape should be:[batch_size*sequence_length,d_model]
        """
        #1.1 the first is multi-head self-attention mechanism
        multi_head_attention_output=self.sub_layer_multi_head_attention(layer_index,Q,K_s,self.type,mask=self.mask,dropout_keep_prob=self.dropout_keep_prob) #[batch_size,sequence_length,d_model]
        #1.2 use LayerNorm(x+Sublayer(x)). all dimension=512.
        multi_head_attention_output=self.sub_layer_layer_norm_residual_connection(K_s ,multi_head_attention_output,layer_index,'encoder_multi_head_attention',dropout_keep_prob=self.dropout_keep_prob,use_residual_conn=self.use_residual_conn)
    
        #2.1 the second is position-wise fully connected feed-forward network.
        postion_wise_feed_forward_output=self.sub_layer_postion_wise_feed_forward(multi_head_attention_output,layer_index,self.type)
        #2.2 use LayerNorm(x+Sublayer(x)). all dimension=512.
        postion_wise_feed_forward_output= self.sub_layer_layer_norm_residual_connection(multi_head_attention_output,postion_wise_feed_forward_output,layer_index,'encoder_postion_wise_ff',dropout_keep_prob=self.dropout_keep_prob)
        return  postion_wise_feed_forward_output,postion_wise_feed_forward_output
    

    3.6.5模型的分析

    1. 论文《Attention is all you need》中的Transformer指的是完整的Encoder-Decoder框架,而对于此项文本分类来说,Transformer是其中对应的Encoder,而一个Encoder模块(Block)包含着多个子模块(包括Multi-head self attention,Skip connection,LayerNorm,Feed Forward),如下:transformer2. 对于Transformer来说,需要明确加入位置编码学习position Embedding.因为对于self Attention来说,它让当前输入单词和句子中任意单词进行相似计算,然后归一化计算出句子中各个单词对应的权重,再利用权重与各个单词对应的变换后V值相乘累加,得出集中后的embedding向量,此间是损失掉了位置信息的。因此,为了引入位置信息编码,Transformer对每个单词一个Position embedding,将单词embedding和单词对应的position embedding加起来形成单词的输入embedding。
    3. Transformer中的self Attention对文本的长距离依赖特征的提取有很强的能力,因为它让当前输入单词和句子中任意单词进行相似计算,它是直接进行的长距离依赖特征的获取的,不像RNN需要通过隐层节点序列往后传,也不像CNN需要通过增加网络深度来捕获远距离特征。此外,对应模型训练时的并行计算能力,Transformer也有先天的优势,它不像RNN需要依赖前一刻的特征量。
    4. 张俊林大佬在【6】中提到过,在Transformer中的Block中不仅仅multi-head attention在发生作用,而是几乎所有构件都在共同发挥作用,是一个小小的系统工程。例如Skip connection,LayerNorm等也是发挥了作用的。对于Transformer来说,Multi-head attention的head数量严重影响NLP任务中Long-range特征捕获能力:结论是head越多越有利于捕获long-range特征。

    4总结

    1. 对于一个人工智能领域的问题的解决,不管是使用深度学习的神经网络还是使用机器学习的人工特征提取,效果的好坏主要是和特征器的提取能力挂钩的。机器学习使用人工来做特征提取器,对于问题的解决原因,可解释性强。而深度学习的数据网络结构使用线性的和非线性的神经元节点相结合比较抽象的作为一个特征提取器。
    在文本处理上,特征抽取能力主要包括有有句法特征提取能力;语义特征提取能力;长距离特征捕获能力;任务综合特征抽取能力。上面四个角度是从NLP的特征抽取器能力强弱角度来评判的,另外再加入并行计算能力及运行效率,这是从是否方便大规模实用化的角度来看的。
    而对于各个领域的的问题的解决,新浪微博AI Lab资深算法专家张俊林博士大佬说过一句话:一个特征抽取器是否适配问题领域的特点,有时候决定了它的成败,而很多模型改进的方向,其实就是改造得使得它更匹配领域问题的特性。
    2. 对于输出空间巨大的大规模文本分类问题。事实上,对于文本的生成问题(对于其中一个单词的生成),可以看做是输出空间巨大的大规模文本的文本分类问题。在Word2vec中,解决的方法是使用层次softmax的方法,首先对分类的标签进行哈夫曼树的构建,每个分类标签对应着一个哈夫曼码,位于哈夫曼树的叶子结点,其中每个分支表示通往每个路径的概率。此外,word2vec中也提出negative sampling的方式,因此可以考虑使用 negative sampling的方式来解决此类问题,对标签的样本重新进行构建二分类,首先(x,y)表示正确的样本为正样本,然后根据分类标签的概率分布进行采样德奥(x,y‘)作为负样本,重构成二分类问题。常在Seq2Seq的生成中,采用【8】Sampled SoftmaxAdaptive softmax等方式来缓解输出空间巨大的大规模文本分类。
    3. 对于标签存在一定关联的情况下的文本分类。我们常常做的文本分类是使用一对一或者一对多方法的方法进行分类器的训练,例如SVM或者NB等。如果标签也存在一点的联系,如标签类目树,或者单个标签与单个标签存在相关性等。对于单个标签与单个标签存在相关性,目前有人将此类多标签问题当做序列生成问题来解决,效果性能得到了很大的改进,对应的论文有SGM: Sequence Generation Model for Multi-Label Classification.还有对标签层次化问题进行了研究的相关论文A Study of multilabel text classification and the effect of label hierarchy
    4. 基于深度学习技术的文本分类技术比起传统的文本分类模型(LR,SVM 等)的优势。首先,免去了人工的提取文本特征,它可以自动的获取基础特征并组合为高级的特征,训练模型获得文本特征与目标分类之间的关系,省去了使用TF-IDF等提取句子的关键词构建特征工程的过程,实现端到端。其次,相比传统的N-gram模型而言,深度学习中可以更好的利用词序的特征,CNN的文本分类模型中的filter的size的大小可以当做是一种类似于N-gram的方式,而RNN(LSTM)则可以利用更长的词序,配合Attention机制则可以通过加权矩阵体现句子中的核心词汇部位。最后,随着样本的增加和网络深度的增加,深度学习的分类精度会更高。

    5参考链接

    【1】brightmart/text_classification
    【2】The Annotated Transformer
    【3】fastText、TextCNN、TextRNN…这套NLP文本分类深度学习方法库供你选择
    【4】word2vec、glove和 fasttext 的比较
    【5】从Word Embedding到Bert模型——自然语言处理预训练技术发展史
    【6】放弃幻想,全面拥抱Transformer:自然语言处理三大特征抽取器(CNN/RNN/TF)比较
    【7】《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》
    【8】Sampled Softmax 论文笔记:On Using Very Large Target Vocabulary for Neural Machine Translation

    展开全文
  • 让我们从具有Amazon产品评论的数据集开始,构建结构化的类:6个“级别1”类,64个“级别2”类和510个“级别3”类。探索用于分层文本分类的各种方法。 train_40k.csv unlabeled_150k.csv val_10k.csv
  • NLP之文本分类

    万次阅读 2018-09-26 15:08:07
    文本自动分类简称文本分类(text categorization),是模式识别与自然语言处理密切结合的研究课题。传统的文本分类是基于文本内容的,研究如何将文本自动划分成政治的、经济的、军事的、体育的、娱乐的等各种类型。 ...

    文本自动分类简称文本分类(text categorization),是模式识别与自然语言处理密切结合的研究课题。传统的文本分类是基于文本内容的,研究如何将文本自动划分成政治的、经济的、军事的、体育的、娱乐的等各种类型。

    目录

    文本表示

    文本向量化

    向量的相似性度量(similarity)

    文本特征选择方法

    特征权重计算方法

    分类器设计

    文本分类评测指标


    文本分类是在预定义的分类体系下,根据文本的特征(内容或属性),将给定文本与一个或多个类别相关联的过程。因此,文本分类研究涉及文本内容理解和模式分类等若干自然语言理解和模式识别问题。

    文本分类任务的最终目的是要找到一个有效的映射函数,准确地实现域D×C到值T或F的映射,这个映射函数实际上就是我们通常所说的分类器。因此,文本分类中有两个关键问题:一个是文本的表示,另一个就是分类器设计。

    根据分类知识获取方法的不同,文本自动分类系统大致可分为两种类型:基于知识工程(knowledge engineering, KE)的分类系统和基于机器学习(machine learning, ML)的分类系统。90年代以后,基于统计机器学习的文本分类方法日益受到重视,这种方法在准确率和稳定性方面具有明显的优势。系统使用训练样本进行特征选择和分类器参数训练,根据选择的特征对待分类的输入样本进行形式化,然后输入到分类器进行类别判定,最终得到输入样本的类别。

    文本表示

    文本向量化

    一个文本表现为一个由文字和标点符号组成的字符串,由字或字符组成词,由词组成短语,进而形成句、段、节、章、篇的结构。要使计算机能够高效地处理真实文本,就必须找到一种理想的形式化表示方法,这种表示一方面要能够真实地反映文档的内容(主题、领域或结构等),另一方面,要有对不同文档的区分能力。

    目前文本表示通常采用向量空间模型(vecto rspace model,VSM)。

    下面首先给出VSM涉及的一些基本概念。
    文档(document):通常是文章中具有一定规模的片段,如句子、句群、段落、段落组直至整篇文章。
    项/特征项(term/feature term):特征项是VSM中最小的不可分的语言单元,可以是字、词、词组或短语等。一个文档的内容被看成是它含有的特征项所组成的集合。
    项的权重(term weight):对于含有n个特征项的文档,每一特征项tk都依据一定的原则被赋予一个权重wk,表示它们在文档中的重要程度。

    这样一个文档D可用它含有的特征项及其特征项所对应的权重所表示。

    一个文档在上述约定下可以看成是n维空间中的一个向量,这就是向量空间模型的由来。

    因此采用向量空间模型进行文本表示时,需要经过以下两个主要步骤:
    ①根据训练样本集生成文本表示所需要的特征项序列D={t1,t2,…,td};
    ②依据文本特征项序列,对训练文本集和测试样本集中的各个文档进行权重赋值、规范化等处理,将其转化为机器学习算法所需的特征向量。

    向量的相似性度量(similarity)

    任意两个文档D1和D2之间的相似系数Sim(D1,D2)指两个文档内容的相关程度(degree of relevance)。设文档D1和D2表示VSM中的两个向量:
    D1=D1(w11,w12,…,w1n)
    D2=D2(w21,w22,…,w2n)

    那么,可以借助于n维空间中两个向量之间的某种距离来表示文档间的相似系数,常用的方法是使用向量之间的内积来计算。

    如果考虑向量的归一化,则可使用两个向量夹角的余弦值来表示相似系数:

    文本特征选择方法

    在向量空间模型中,表示文本的特征项可以选择字、词、短语,甚至“概念”等多种元素。但是,如何选取特征,各种特征应该赋予多大的权重,选取不同的特征对文本分类系统的性能有什么影响等,很多问题都值得深入研究。目前已有的特征选取方法比较多,常用的方法有:基于文档频率(document frequency, DF)的特征提取法、信息增益(information gain, IG)法、χ2统计量(CHI)法和互信息(mutual information, MI)方法等。

    1.基于文档频率的特征提取法

    文档频率(DF)是指出现某个特征项的文档的频率。基于文档频率的特征提取法通常的做法是:从训练语料中统计出包含某个特征的文档的频率(个数),然后根据设定的阈值,当该特征项的DF值小于某个阈值时,从特征空间中去掉该特征项,因为该特征项使文档出现的频率太低,没有代表性;当该特征项的DF值大于另外一个阈值时,从特征空间中也去掉该特征项,因为该特征项使文档出现的频率太高,没有区分度。

    基于文档频率的特征选择方法可以降低向量计算的复杂度,并可能提高分类的准确率,因为按这种选择方法可以去掉一部分噪声特征。这种方法简单、易行。但严格地讲,这种方法只是一种借用算法,其理论根据不足。根据信息论我们知道,某些特征虽然出现频率低,但往往包含较多的信息,对于分类的重要性很大。对于这类特征就不应该使用DF方法将其直接排除在向量特征之外。

    2.信息增益法

    信息增益(IG)法依据某特征项ti为整个分类所能提供的信息量多少来衡量该特征项的重要程度,从而决定对该特征项的取舍。某个特征项ti的信息增益是指有该特征或没有该特征时,为整个分类所能提供的信息量的差别,其中,信息量的多少由熵来衡量。因此,信息增益即不考虑任何特征时文档的熵和考虑该特征后文档的熵的差值

    从信息增益的定义可知,一个特征的信息增益实际上描述的是它包含的能够帮助预测类别属性的信息量。从理论上讲,信息增益应该是最好的特征选取方法,但实际上由于许多信息增益比较高的特征出现频率往往较低,所以,当使用信息增益选择的特征数目比较少时,往往会存在数据稀疏问题,此时分类效果也比较差。因此,有些系统实现时,首先对训练语料中出现的每个词(以词为特征)计算其信息增益,然后指定一个阈值,从特征空间中移除那些信息增益低于此阈值的词条,或者指定要选择的特征个数,按照增益值从高到低的顺序选择特征组成特征向量。

    3.χ2统计量

     χ2统计量(CHI)衡量的是特征项ti和类别Cj之间的相关联程度,并假设ti和Cj之间符合具有一阶自由度的χ2分布。特征对
    于某类的χ2统计值越高,它与该类之间的相关性越大,携带的类别信息也较多,反之则越少。

    4.互信息法

    互信息(MI)法的基本思想是:互信息越大,特征ti和类别Cj共现的程度越大。

    以上是文本分类中比较经典的一些特征选取方法,实际上还有很多其他文本特征选取方法,例如,DTP(distance to transition point)方法,期望交叉熵法、文本证据权法、优势率方法,以及国内学者提出的“类别区分词”的特征提取方法,组合特征提取方法,基于粗糙集(rough set)的特征提取方法TFACQ,以及利用自然语言文本所隐含规律等多种信息的强类信息词(strong information class word, SCIW)的特征选取方法等等。

    另外需要指出的是,无论选择什么作为特征项,特征空间的维数都是非常高的,在汉语文本分类中问题表现得更为突出。这样的高维特征向量对后面的分类器存在不利的影响,很容易出现模式识别中的“维数灾难”现象。而且,并不是所有的特征项对分类都是有利的,很多提取出来的特征可能是噪声。因此,如何降低特征向量的维数,并尽量减少噪声,仍然是文本特征提取中的两个关键问题。

    特征权重计算方法

    特征权重用于衡量某个特征项在文档表示中的重要程度或者区分能力的强弱。权重计算的一般方法是利用文本的统计信息,主要是词频,给特征项赋予一定的权重。

    我们将一些常用的权重计算方法归纳为表13-2所示的形式。表中各变量的说明如下:wij表示特征项ti在文本Dj中的权重,tfij表示特征项ti在训练文本Dj中出现的频度;ni是训练集中出现特征项ti的文档数,N是训练集中总的文档数;M为特征项的个数,nti为特征项ti在训练语料中出现的次数。


    倒排文档频度(inverse document frequency, IDF)法是1972年Spark Jones提出的计算词与文献相关权重的经典计算方法,其在信息检索中占有重要地位。该方法在实际使用中,常用公式L+log ((N-ni)/ni)替代,其中,常数L为经验值,一般取为1。IDF方法的权重值随着包含 某个特征的文档数量ni的变化呈反向变化,在极端情况下,只在一篇文档中出现的特征含有最高的IDF值。TF-IDF方法中公式有多种表达形式,TFC方法和ITC方法都是TF-IDF方法的变种。

    TF-IWF(inverse word frequency)权重算法也是在TF-IDF算法的基础上由Basili et al.(1999)提出来的。TF-IWF与TF-IDF的不同主要体现在两个方面:①TF-IWF算法中用特征频率倒数的对数值IWF代替IDF; ②TF-IWF算法中采用了IWF的平方,而不像IDF中采用的是一次方。R.Basili等认为IDF的一次方给了特征频率太多的倚重,所以用IWF的平方来平衡权重值对于特征频率的倚重。

    除了上面介绍的这些比较常用的方法以外,还有很多其他权重计算方法。例如:Dagan et al.(1997)提出的基于错误驱动的(mistake-driven)特征权重算法,这种算法的类权重向量不是通过一个表达式直接计算出来的,而是首先为每个类指定一个初始权重向量,不断输入训练文本,并根据对训练文本的分类结果调整类权重向量的值,直到类权重向量的值大致不再改变为止。

    方法。例如:Dagan et al.(1997)提出的基于错误驱动的(mistake-driven)特征权重算法,这种算法的类权重向量不是通过一个表达式直接计算出来的,而是首先为每个类指定一个初始权重向量,不断输入训练文本,并根据对训练文本的分类结果调整类权重向量的值,直到类权重向量的值大致不再改变为止。

    分类器设计

    文本分类本身是一个分类问题,因此,一般的模式分类方法都可用于文本分类研究。常用的分类算法包括:朴素的贝叶斯分类法
    (naΪve Bayesian classifier)、基于支持向量机(support vector machines, SVM)的分类器、k-最近邻法(k-nearest neighbor, kNN)、神经网络法(neural network, NNet)、决策树(decision tree)分类法、模糊分类法(fuzzy classifier)、Rocchio分类方法和Boosting算法等。

    1.朴素贝叶斯分类器

    朴素贝叶斯分类器的基本思想是利用特征项和类别的联合概率来估计给定文档的类别概率。

    假设文本是基于词的一元模型,即文本中当前词的出现依赖于文本类别,但不依赖于其他词及文本的长度,也就是说,词与词之间是独立的。根据贝叶斯公式,文档Doc属于Ci类的概率为 

    在具体实现时,通常又分为两种情况:
    (1)文档Doc采用DF向量表示法,即文档向量V的分量为一个布尔值,0表示相应的特征在该文档中未出现,1表示特征在文档中出现。
    (2)若文档Doc采用TF向量表示法,即文档向量V的分量为相应特征在该文档中出现的频度。

    2.基于支持向量机的分类器

    基于支持向量机(support vector machine, SVM)的分类方法主要用于解决二元模式分类问题。

    SVM的基本思想是在向量空间中找到一个决策平面(decision surface),这个平面能“最好”地分割两个分类中的数据点。支持向量机分类法就是要在训练集中找到具有最大类间界限(margin)的决策平面。

    由于支持向量机算法是基于两类模式识别问题的,因而,对于多类模式识别问题通常需要建立多个两类分类器。与线性判别函数一样,它的结果强烈地依赖于已知模式样本集的构造,当样本容量不大时,这种依赖性尤其明显。此外,将分界面定在最大类间隔的中间,对于许多情况来说也不是最优的。对于线性不可分问题也可以采用类似于广义线性判别函数的方法,通过事先选择好的非线性映射将输入模式向量映射到一个高维空间,然后在这个高维空间中构造最优分界超平面。

    根据Yang and Liu (1999)的实验结果,SVM的分类效果要好于NNet、贝叶斯分类器、Rocchio和LLSF(linear least-square fit)分类器的效果,与kNN方法的效果相当。

    3.k-最近邻法

    kNN方法的基本思想是:给定一个测试文档,系统在训练集中查找离它最近的k个邻近文档,并根据这些邻近文档的分类来给该文档的候选类别评分。把邻近文档和测试文档的相似度作为邻近文档所在类别的权重,如果这k个邻近文档中的部分文档属于同一个类别,则将该类别中每个邻近文档的权重求和,并作为该类别和测试文档的相似度。然后,通过对候选分类评分的排序,给出一个阈值。

    4.基于神经网络的分类器

    神经网络(NNet)是人工智能中比较成熟的技术之一,基于该技术的分类器的基本思想是:给每一类文档建立一个神经网络,输入通常是单词或者是更为复杂的特征向量,通过机器学习获得从输入到分类的非线性映射。

    根据Yang and Liu (1999)的实验结果,NNet分类器的效果要比kNN分类器和SVM分类器的效果差,而且训练NNet的时间开销远远超过其他分类方法,所以,实际应用并不广泛。

    5.线性最小平方拟合法

    线性最小平方拟合(linear least-squares fit, LLSF)是一种映射方法其出发点是从训练集和分类文档中学习得到多元回归模型
    (multivariate regression model)。其中训练数据用输入/输出向量表示,输入向量是用传统向量空间模型表示的文档
    (词和对应的权重),输出向量则是文档对应的分类(带有0-1权重)。通过在向量的训练对上求解线性最小平方拟合,得到一个“单词-分类”的回归系数矩阵。

    根据Yang and Liu (1999)的实验结果,LLSF算法的分类效果稍逊于kNN和SVM算法的效果。

    6.决策树分类器

    决策树分类器也是模式识别研究的基本方法之一,其出发点是:大量复杂系统的组成普遍存在着等级分层现象,或者说复杂任务是可以通过等级分层分解完成的,文本处理过程也不例外。

    决策树是一棵树,树的根结点是整个数据集合空间,每个分结点是对一个单一变量的测试,该测试将数据集合空间分割成两个或更多个类别,即决策树可以是二叉树也可以是多叉树。每个叶结点是属于单一类别的记录。构造决策树分类器时,首先要通过训练生成决策树,然后再通过测试集对决策树进行修剪。一般可通过递归分割的过程构建决策树,其生成过程通常是自上而下的,选择分割的方法有多种,但是目标都是一致的,就是对目标文档进行最佳分割。从根结点到叶结点都有一条路径,这条路径就是一条决策“规则”。

    在决定哪个属性域(field)作为目前最佳的分类属性时,一般的做法是穷尽所有的属性域,对每个属性域分裂的好坏进行量化,从而计算出最佳分裂。信息增益是决策树训练中常用的衡量给定属性区分训练样本能力的定量标准。

    7.模糊分类器

    按照模糊分类方法的观点,任何一个文本或文本类都可以通过其特征关键词来描述其内容特征,因此,可以用一个定义在特征关键词类上的模糊集来描述它们。

    判定分类文本T所属的类别可以通过计算文本T的模糊集FT分别与其他每个文本类的模糊集Fk的关联度SR实现,两个类的关联度越大说明这两个类越贴近。

    8.Rocchio分类器

    Rocchio分类器是情报检索领域经典的算法,其基本思想是,首先为每一个训练文本C建立一个特征向量,然后使用训练文本的特征向量为每个类建立一个原型向量(类向量)。当给定一个待分类文本时,计算待分类文本与各个类别的原型向量(类向量)之间的距离,其距离可以是向量点积、向量之间夹角的余弦值或者其他相似度计算函数,根据计算出来的距离值决定待分类文本属于哪一类别。

    Rocchio分类方法的特点是计算简单、易行,其分类效果仅次于kNN方法和SVM方法。

    9.基于投票的分类方法

    基于投票的分类方法是在研究多分类器组合时提出的,其核心思想是:k个专家判断的有效组合应该优于某个专家个人的判断结果。
    投票算法主要有两种:Bagging算法和Boosting算法。

    Bagging算法
    训练R个分类器fi(i=1,2,…,R),其中,fi是利用从训练集(N篇文档)中随机抽取(取出后再放回)N次文档构成的训练集训练得到的。对于新文档D,用这R个分类器分别对D划分类别,得到的最多的那个类别作为D的最终判别类别。

    Boosting算法
    与Bagging算法类似,该算法需要训练多个分类器,但训练每个分量分类器的训练样本不再是随机抽取,每个分类器的训练集由其他各个分类器所给出的“最富信息”的样本点组成。基于Boosting方法有许多不同的变形,其中最流行的一种就是AdaBoost方法,该方法在文本分类领域中有着非常广泛的应用。

    文本分类评测指标

    针对不同的目的,人们提出了多种文本分类器性能评价方法,包括召回率、正确率、F-测度值、微平均和宏平均、平衡点(break-even point)、11点平均正确率(11-point average precision)等。

    一般地讲,正确率和召回率是一对相互矛盾的物理量,提高正确率往往要牺牲一定的召回率,反之亦然。在很多情况下,单独考虑正确率或者召回率来对分类器进行评价都是不全面的。因此,1999提出了通过调整分类器的阈值,调整正确率和召回率的值,使其达到一个平衡点的评测方法。

    Taghva et al.(2004)为了更加全面地评价一个分类器在不同召回率情况下的分类效果,调整阈值使得分类器的召回率分别为:0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1,然后计算出对应的11个正确率,取其平均值,这个平均值即为11点平均正确率,用这个平均正确率衡量分类器的性能。

     

    展开全文
  • 深度文本分类综述

    千次阅读 2019-06-04 22:11:30
    近些天一直忙着毕业以及小论文投递的事情,没有及时更新公众号。在此表示抱歉。最近有很多小伙伴想了解深度学习在文本分类的发展,因此,笔者整理最近几年比较经典的深度文本分类方法...

    近些天一直忙着毕业以及小论文投递的事情,没有及时更新公众号。在此表示抱歉。

    最近有很多小伙伴想了解深度学习在文本分类的发展,因此,笔者整理最近几年比较经典的深度文本分类方法,希望帮助小伙伴们了解深度学习在文本分类中的应用。

    笔者整理了近些年的相关深度文本分类论文,关注“AI算法之心”,后台回复“文本分类论文”即可下载。

    Convolutional Neural Networks for Sentence Classification (EMNLP 2014)

    Kim在EMNLP2014提出的TextCNN方法,在多个数据集上取得了很好的效果。由于其计算速度快以及可并行性,在产业界得到了广泛使用。TextCNN的模型示意图如下图所示。

    TextCNN模型首先将文本映射成向量,然后利用多个滤波器来捕捉文本的局部语义信息,接着使用最大池化,捕捉最重要的特征。最近将这些特征输入到全连接层,得到标签的概率分布。

    代码参考:

    1) https://github.com/alexander-rakhlin/CNN-for-Sentence-Classification-in-Keras

    2) https://github.com/brightmart/text_classification

    图1:TextCNN模型架构

    Document Modeling with Gated Recurrent Neural Network for Sentiment Classification (EMNLP 2015)

    Tang等人提出了一种利用GRU对文档进行建模的情感分类模型。模型如下图所示。

    该模型首先将文本映射为向量,然后利用CNN/LSTM(论文中使用3个滤波器的CNN)进行句子表示。另外,为了捕获句子的全局语义表征,将其输送给平均池化层,再接入tanh激活函数。最后将整个句子的不同宽度卷积核的向量表示接入一个Average层,从而得到句子平均向量表示。

    然后将得到的句子表示,输入到GRU中,得到文档向量表示。最后将文档向量输送给softmax层,得到标签的概率分布。

    图2:文档级别情感分类的神经网络模型

    Recurrent Convolutional Neural Networks for Text Classification (AAAI 2015)

    Lai等人提出了一种无人工特征的循环卷积神经网络分类方法,简称RCNN。

    RCNN首先利用Bi-RNN来捕捉前后的上下文表征,然后将其concat起来,接着使用滤波器filter_size=1的卷积层,并使用最大池化操作得到与文档最相关的向量表征,最后将这些向量输入到softmax层,得到标签的概率表征。

    代码参考:

    1) https://github.com/roomylee/rcnn-text-classification

    2) https://github.com/brightmart/text_classification

    图3: RCNN的模型结构示意图

    Recurrent Neural Network for Text Classification with Multi-Task Learning (IJCAI 2016)

    Liu等人针对文本多分类任务,提出了基于RNN的三种不同的共享信息机制对具有特定任务和文本进行建模。

    模型1(Uniform-Layer Architecture):所有任务共享同一个LSTM层,并在每个特定任务后面拼接一个随机生成可训练的向量。LSTM层的最后一个时刻的隐藏层作为输入传入到softmax层。

    模型2(Coupled-Layer Architecture): 每个任务具有自己独立的LSTM层,但是每一时刻所有任务的hidden state则会和下一时刻的character一起作为输入,最后一个时刻的hidden state进行分类。

    模型3(Shared-Layer Architecture):除了一个共享的BI-LSTM层用于获取共享信息,每个任务有自己独立的LSTM层,LSTM的输入包括每一时刻的character和BI-LSTM的hidden state。

    图4:三种架构进行多任务学习建模

    Hierarchical Attention Networks for Document Classification (NAACL 2016)

    Yang等人提出了一种用于文档分类的层次注意力机制网络,简称HAN。这篇文章和Tang等人都是针对于文档分类的问题,然而,这篇文章在句子级别以及文档级别提出了注意力机制,使得模型在构建文档时是能够赋予重要内容不同的权重,同时,也可以缓解RNN在捕捉文档的序列信息产生的梯度消失问题。HAN模型的模型示意图如下所示。

    HAN模型首先利用Bi-GRU捕捉单词级别的上下文信息。由于句子中的每个单词对于句子表示并不是同等的贡献,因此,作者引入注意力机制来提取对句子表示有重要意义的词汇,并将这些信息词汇的表征聚合起来形成句子向量。具体的注意力机制的原理可以参考:

    FEED-FORWARD NETWORKS WITH ATTENTION CAN SOLVE SOME LONG-TERM MEMORY PROBLEMS

    然后,对于所有的句子向量输入到Bi-GRU中,捕捉句子级别的上下文信息,得到文档向量。同样地,为了奖励对文档进行正确分类的线索句,作者再次使用注意力机制,来衡量句子的重要性,得到文档向量。最后将文档向量均输入到softmax层,得到标签的概率分布。

    代码参考:

    1) https://github.com/richliao/textClassifier

    2) https://github.com/brightmart/text_classification

    图3: HAN模型结构示意图

    Bag of Tricks for Efficient Text Classification (EACL 2017)

    Joulin等人提出了一种简单而又有效的文本分类模型,简称fastText。

    fastText模型输入一个词序列(一段文本或者一句话),序列中的词与词组成特征向量,然后特征向量通过线性变换映射到中间层,中间层再映射到标签。输出这个词序列属于不同类别的概率。其中fastText在预测标签是使用了非线性激活函数,但在中间层不使用非线性激活函数。

    代码参考:

    1) https://github.com/facebookresearch/fastText

    2)  https://radimrehurek.com/gensim/models/fasttext.html

    图4:fastText模型结构示意图

    Deep Pyramid Convolutional Neural Networks for Text Categorization (ACL 2017)

    Johnson 和Zhang 提出了一种单词级别的深层CNN模型,来捕捉文本的全局语义表征,该模型在不增加太多的计算开销的情况下,通过增加网络深度可以获得最佳的性能,简称DPCNN。模型结构示意图如下所示。

    DPCNN模型首先利用“text region embedding”,将常用的word embedding 推广到包含一个或多个单词的文本区域的embedding,类似于增加一层卷积神经网络。

    然后是卷积快的叠加(两个卷积层和一个shortcut连接,其中shortcut连接类似于残差连接),与步长为2的最大池化层进行下采样。最后使用一个最大池化层,得到每个文档的文档向量。

    代码参考:

    https://github.com/Cheneng/DPCNN

    图4:DPCNN模型结构示意图

    Using millions of emoji occurrences to learn any-domain representations for detecting sentiment, emotion and sarcasm (EMNLP 2017)

    Felbo等人使用数以百万计的表情符号来学习任何领域的表情符号来检测情绪、情绪和讽刺,提出了DeepMoji模型,并取得了具有竞争性的效果。同时,DeepMoji模型在文本分类任务上也可以取得不错的结果。

    DeepMoji模型首先使用embedding层将单词映射成向量,并将每个embedding维度使用双正切函数映射到[-1,1]。然后,作者使用两层的Bi-LSTM捕捉上下文特征。接着作者提出了一种新的注意力机制,分别将embeddding层以及2层的Bi-LSTM作为输入,得到文档的向量表征。最后,将向量输入到softmax层,得到标签的概率分布。

    代码参考:

    https://github.com/bfelbo/DeepMoji

    图5:DeepMoji模型结构示意图

    Investigating Capsule Networks with Dynamic Routing for Text Classification (EMNLP 2018)

    Zhao等人提出了一种基于胶囊网络的文本分类模型,并改进了Sabour等人提出的动态路由,提出了三种稳定动态路由。模型如下所示:

    该模型首先利用标准的卷积网络,通过多个卷积滤波器提取句子的局部语义表征。然后将CNN的标量输出替换为向量输出胶囊,从而构建Primary Capsule层。接着输入到作者提出的改进的动态路由(共享机制的动态路由和非共享机制的动态路由),得到卷积胶囊层。最后将卷积胶囊层的胶囊压平,送入到全连接胶囊层,每个胶囊表示属于每个类别的概率。

     

    代码参考:

    https://github.com/andyweizhao/capsule_text_classification.

     

    图6:文本分类的胶囊网络体系结构

    Sentiment Analysis by Capsules (WWW 2018)

    Wang等人提出了一种用于情感分类的RNN胶囊网络模型,简称RNN-Capsule。(这篇文章在可视化方面做的还是不错的)模型结构示意图如下所示。

    RNN-Capsule首先使用RNN捕捉文本上下文信息,然后将其输入到capsule结构中,该capsule结构一共由三部分组成:representation module, probability module,和reconstruction module。具体地,首先用注意力机制计算capsule 表征;然后用capsule表征计算capsule状态的概率;最后用capsule表征以及capsule状态概率重构实例的表征。

    图7: RNN-Capsule模型结构示意图

    Graph Convolutional Networks for Text Classification (AAAI 2019)

    Yao等人提出了一种基于graph convolutional networks(GCN)进行文本分类。作者构建了一个包含word节点和document节点的大型异构文本图,显式地对全局word利用co-occurrence信息进行建模,然后将文本分类问题看作是node分类问题。

    代码参考:

    https://github.com/yao8839836/text_gcn

    图7:Text GCN的模型结构

    BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding (NAACL 2019)

    Google提出的BERT模型,突破了静态词向量无法解决一词多义的问题。BERT是基于语言模型的动态词向量,在自然语言处理的多项任务中取得了最优秀的结果。笔者对BERT模型进行微调,在文本分类的多个领域,诸如法律、情感等,取得了非常有竞争性的性能。

    BERT的模型架构是一个多层的双向Transformer编码器(Transformer的原理及细节可以参考 Attention is all you need)。作者采用两套参数分别生成BERTBASE模型和BERTLARGE模型(细节描述可以参考原论文),所有下游任务可以在这两套模型进行微调。

    代码参考:

    https://github.com/google-research/bert

    图8:BERT的Pre-training结构和Fine-Tuning结构

    更多精彩阅读

    知否?知否?一文看懂深度文本分类之DPCNN原理与代码

    机器学习入门方法和资料合集

    撩一发深度文本分类之RNN via Attention

    15分钟带你入门sklearn与机器学习——分类算法篇

    如何为你的回归问题选择最合适的机器学习方法?

    喜欢我就给我好看吧

    展开全文
  • 文本分类方法总结

    万次阅读 多人点赞 2020-01-17 15:01:42
    1 机器学习的文本分类方法 1.1 特征工程 1.1.1 文本预处理 1.1.2 文本表示和特征提取 1.1.3 基于语义的文本表示 1.2 分类器 朴素贝叶斯分类(Naïve Bayes) 用朴素贝叶斯分类算法做中文文本分类 KNN SVM ...

    目录

    1 机器学习的文本分类方法

    1.1 特征工程

    1.1.1 文本预处理

    1.1.2 文本表示和特征提取

    1.1.3 基于语义的文本表示

    1.2 分类器

    朴素贝叶斯分类(Naïve Bayes)

    用朴素贝叶斯分类算法做中文文本分类

    KNN

    SVM

    最大熵

    2 深度学习的文本分类方法

    2.1 文本的分布式表示:词向量(word embedding)

    2.2 深度学习文本分类模型

    2.2.1 fastText

    2.2.2 TextCNN

    2.2.3 TextRNN

    2.2.4 TextRNN + Attention

    2.2.5 TextRCNN

    2.2.6 EntNet/DMN

    2.3 总结

    Reference


    1 机器学习的文本分类方法

    文本分类问题算是自然语言处理领域中一个非常经典的问题了,相关研究最早可以追溯到上世纪50年代,当时是通过专家规则(Pattern)进行分类,甚至在80年代初一度发展到利用知识工程建立专家系统,这样做的好处是短平快的解决top问题,但显然天花板非常低,不仅费时费力,覆盖的范围和准确率都非常有限。

    后来伴随着统计学习方法的发展,特别是90年代后互联网在线文本数量增长和机器学习学科的兴起,逐渐形成了一套解决大规模文本分类问题的经典玩法,这个阶段的主要套路是人工特征工程+浅层分类模型。训练文本分类器过程见下图:

    整个文本分类问题就拆分成了特征工程和分类器两部分,玩机器学习的同学对此自然再熟悉不过了

    1.1 特征工程

    特征工程在机器学习中往往是最耗时耗力的,但却极其的重要。抽象来讲,机器学习问题是把数据转换成信息再提炼到知识的过程,特征是“数据-->信息”的过程,决定了结果的上限,而分类器是“信息-->知识”的过程,则是去逼近这个上限。然而特征工程不同于分类器模型,不具备很强的通用性,往往需要结合对特征任务的理解。

    文本分类问题所在的自然语言领域自然也有其特有的特征处理逻辑,传统分本分类任务大部分工作也在此处。文本特征工程分为文本预处理、特征提取、文本表示三个部分,最终目的是把文本转换成计算机可理解的格式,并封装足够用于分类的信息,即很强的特征表达能力。

    1.1.1 文本预处理

    文本预处理过程是在文本中提取关键词表示文本的过程,中文文本处理中主要包括文本分词去停用词两个阶段。

    预处理不是本文重点,在此就不具体介绍了。

    1.1.2 文本表示和特征提取

    文本表示:

    文本表示的目的是把文本预处理后的转换成计算机可理解的方式,是决定文本分类质量最重要的部分。传统做法常用词袋模型(BOW, Bag Of Words)或向量空间模型(Vector Space Model),最大的不足是忽略文本上下文关系,每个词之间彼此独立,并且无法表征语义信息。词袋模型的示例如下:

                   ( 0, 0, 0, 0, .... , 1, ... 0, 0, 0, 0)

    一般来说词库量至少都是百万级别,因此词袋模型有个两个最大的问题:高纬度、高稀疏性。词袋模型是向量空间模型的基础,因此向量空间模型通过特征项选择降低维度,通过特征权重计算增加稠密性。

    特征提取:

    向量空间模型的文本表示方法的特征提取对应特征项的选择特征权重计算两部分。特征选择的基本思路是根据某个评价指标独立的对原始特征项(词项)进行评分排序,从中选择得分最高的一些特征项,过滤掉其余的特征项。常用的评价有文档频率、互信息、信息增益、χ²统计量等。

    特征权重主要是经典的TF-IDF方法及其扩展方法,主要思路是一个词的重要度与在类别内的词频成正比,与所有类别出现的次数成反比。

    关于特征选择和特征权重计算可以看这篇博文 NLP --- 文本分类(向量空间模型(Vector Space Model)VSM)

    1.1.3 基于语义的文本表示

    传统做法在文本表示方面除了向量空间模型,还有基于语义的文本表示方法,比如LDA主题模型、LSI/PLSI概率潜在语义索引等方法,一般认为这些方法得到的文本表示可以认为文档的深层表示,而word embedding文本分布式表示方法则是深度学习方法的重要基础,下文会展现。

    1.2 分类器

    朴素贝叶斯分类(Naïve Bayes)

    用朴素贝叶斯分类算法做中文文本分类

    KNN

    该算法的基本思想是:根据传统的向量空间模型,文本内容被形式化为特征空间中的加权特征向量。对于一个测试文本,计算它与训练样本集中每个文本的相似度,找出K个最相似的文本,根据加权距离和判断测试文本所属的类别,具体算法步骤如下:

    1. 对于一个测试文本,根据特征词形成测试文本向量。
    2. 计算该测试文本与训练集中每个文本的文本相似度,按照文本相似度,在训练文本集中选出与测试文本最相似的k个文本。
    3. 在测试文本的k个近邻中,依次计算每类的权重。
    4. 比较类的权重,将文本分到权重最大的那个类别中。

    针对海量文本数据的改进方法可见这篇博文:用于大数据分类的KNN算法研究

    SVM

    基于支持向量机SVM的文本分类的实现

    最大熵

     

    2 深度学习的文本分类方法

    上文介绍了传统的文本分类做法,传统做法主要问题的文本表示是高纬度高稀疏的,特征表达能力很弱,而且神经网络很不擅长对此类数据的处理;此外需要人工进行特征工程,成本很高。而深度学习最初在之所以图像和语音取得巨大成功,一个很重要的原因是图像和语音原始数据是连续和稠密的,有局部相关性。应用深度学习解决大规模文本分类问题最重要的是解决文本表示,再利用CNN/RNN等网络结构自动获取特征表达能力,去掉繁杂的人工特征工程,端到端的解决问题。接下来会分别介绍:

    2.1 文本的分布式表示:词向量(word embedding)

    分布式表示(Distributed Representation)其实Hinton 最早在1986年就提出了,基本思想是将每个词表达成 n 维稠密、连续的实数向量,与之相对的one-hot encoding向量空间只有一个维度是1,其余都是0。分布式表示最大的优点是具备非常powerful的特征表达能力,比如 n 维向量每维 k 个值,可以表征 k^{^{n}} 个概念。事实上,不管是神经网络的隐层,还是多个潜在变量的概率主题模型,都是应用分布式表示。下图是03年Bengio在 A Neural Probabilistic Language Model 的网络结构:

    这篇文章提出的神经网络语言模型(NNLM,Neural Probabilistic Language Model)采用的是文本分布式表示,即每个词表示为稠密的实数向量。NNLM模型的目标是构建语言模型:

    词的分布式表示即词向量(word embedding)是训练语言模型的一个附加产物,即图中的Matrix C。

    尽管Hinton 86年就提出了词的分布式表示,Bengio 03年便提出了NNLM,词向量真正火起来是google Mikolov 13年发表的两篇word2vec的文章 Efficient Estimation of Word Representations in Vector Space 和 Distributed Representations of Words and Phrases and their Compositionality,更重要的是发布了简单好用的word2vec工具包,在语义维度上得到了很好的验证,极大的推进了文本分析的进程。下图是文中提出的CBOW 和 Skip-Gram两个模型的结构,基本类似于NNLM,不同的是模型去掉了非线性隐层,预测目标不同,CBOW是上下文词预测当前词,Skip-Gram则相反。

    除此之外,提出了Hierarchical Softmax 和 Negative Sample两个方法,很好的解决了计算有效性,事实上这两个方法都没有严格的理论证明,有些trick之处,非常的实用主义。详细的过程不再阐述了,有兴趣深入理解word2vec的,推荐读读这篇很不错的paper:word2vec Parameter Learning Explained。额外多提一点,实际上word2vec学习的向量和真正语义还有差距,更多学到的是具备相似上下文的词,比如“good”“bad”相似度也很高,反而是文本分类任务输入有监督的语义能够学到更好的语义表示,有机会后续系统分享下。

    至此,文本的表示通过词向量的表示方式,把文本数据从高纬度高稀疏的神经网络难处理的方式,变成了类似图像、语音的的连续稠密数据。深度学习算法本身有很强的数据迁移性,很多之前在图像领域很适用的深度学习算法比如CNN等也可以很好的迁移到文本领域了,下一小节具体阐述下文本分类领域深度学习的方法。

    2.2 深度学习文本分类模型

    词向量解决了文本表示的问题,该部分介绍的文本分类模型则是利用CNN/RNN等深度学习网络及其变体解决自动特征提取(即特征表达)的问题。

    2.2.1 fastText

    fastText 是上文提到的 word2vec 作者 Mikolov 转战 Facebook 后16年7月刚发表的一篇论文 Bag of Tricks for Efficient Text Classification。把 fastText 放在此处并非因为它是文本分类的主流做法,而是它极致简单,速度快,模型图见下:

    具体结构参考这篇文章 fastText原理及实践

    fastText的核心思想就是:将整篇文档的词及n-gram向量叠加平均得到文档向量,然后使用文档向量做softmax多分类。这中间涉及到两个技巧:字符级n-gram特征的引入以及分层Softmax分类。

    2.2.2 TextCNN

    本篇文章的题图选用的就是14年这篇文章提出的TextCNN的结构(见下图)。fastText 中的网络结果是完全没有考虑词序信息的,而它用的 n-gram 特征 trick 恰恰说明了局部序列信息的重要意义。卷积神经网络(CNN Convolutional Neural Network)最初在图像领域取得了巨大成功,CNN原理就不讲了,核心点在于可以捕捉局部相关性,具体到文本分类任务中可以利用CNN来提取句子中类似 n-gram 的关键信息。

    TextCNN的详细过程原理图见下:

    2.2.3 TextRNN

    尽管TextCNN能够在很多任务里面能有不错的表现,但CNN有个最大问题是固定 filter_size 的视野,一方面无法建模更长的序列信息,另一方面 filter_size 的超参调节也很繁琐。CNN本质是做文本的特征表达工作,而自然语言处理中更常用的是递归神经网络(RNN, Recurrent Neural Network),能够更好的表达上下文信息。具体在文本分类任务中,Bi-directional RNN(实际使用的是双向LSTM)从某种意义上可以理解为可以捕获变长且双向的的 "n-gram" 信息。

    RNN算是在自然语言处理领域非常一个标配网络了,在序列标注/命名体识别/seq2seq模型等很多场景都有应用,Recurrent Neural Network for Text Classification with Multi-Task Learning文中介绍了RNN用于分类问题的设计,下面介绍两种structure。

    1)structure 1

    流程:embedding--->BiLSTM--->concat final output/average all output----->softmax layer

    2)structure 2

    流程:embedding-->BiLSTM---->(dropout)-->concat ouput--->UniLSTM--->(droput)-->softmax layer

    结构图如下图所示:

    与之前结构不同的是,在双向LSTM(上图不太准确,底层应该是一个双向LSTM)的基础上又堆叠了一个单向的LSTM。把双向LSTM在每一个时间步长上的两个隐藏状态进行拼接,作为上层单向LSTM每一个时间步长上的一个输入,最后取上层单向LSTM最后一个时间步长上的隐藏状态,再经过一个softmax层(输出层使用softamx激活函数,2分类的话则使用sigmoid)进行一个多分类。

    2.2.4 TextRNN + Attention

    CNN和RNN用在文本分类任务中尽管效果显著,但都有一个不足的地方就是不够直观,可解释性不好,特别是在分析badcase时候感受尤其深刻。而注意力(Attention)机制是自然语言处理领域一个常用的建模长时间记忆机制,能够很直观的给出每个词对结果的贡献,基本成了Seq2Seq模型的标配了。实际上文本分类从某种意义上也可以理解为一种特殊的Seq2Seq,所以考虑把Attention机制引入近来,研究了下学术界果然有类似做法。

    这其中比较典型的就是HAN,具体可以见这篇文章HAN(Hierarchical Attention Network)

    2.2.5 TextRCNN

    我们参考的是中科院15年发表在AAAI上的这篇文章 Recurrent Convolutional Neural Networks for Text Classification 的结构:

    2.2.6 EntNet/DMN

    对这两个网络没有研究过,具体参考这篇文章 基于深度学习的文本分类

    2.2.7 Bert

    Ber的结构讲解有很多,大家可自行搜索。

    2.2.8 DPCNN

    DPCNN可参考这篇文章DPCNN深度金字塔卷积神经网络介绍

    2.3 总结

    文本分类在深度学习的时代逃过了特征提取类似距离的定义的过程, 但是依然逃不了模型的选择, 参数的优化,编码和预处理的考量(one-hot, n-gram等等) ,以及时间的平衡。

    概况说来,主要有5大类模型:

    1. 词嵌入向量化:word2vec, FastText等等
    2. 卷积神经网络特征提取:Text-CNN, Char-CNN等等
    3. 上下文机制:Text-RNN, BiRNN, RCNN等等
    4. 记忆存储机制:EntNet, DMN等等
    5. 注意力机制:HAN等等

    最后再推荐下Github上关于文本分类的总结,讲的非常全面:https://github.com/brightmart/text_classification

    Reference

    用深度学习(CNN RNN Attention)解决大规模文本分类问题 - 综述和实践

    用于大数据分类的KNN算法研究

    fastText原理及实践

    textRNN & textCNN的网络结构与代码实现!

    基于深度学习的文本分类

    展开全文
  • python 中文文本分类

    万次阅读 多人点赞 2017-02-06 11:31:21
    测试预料可以从1.1中的训练预料中随机抽取,也可以下载独立的测试语料库,复旦中文文本分类语料库测试集链接: http://download.csdn.net/detail/github_36326955/9747929 路径修改参考1.1,例如可以设置为 ./...
  • 针对篇章级别情感文本分类问题,分析了传统的生成式模型和判别式模型的性能,提出了一种级联式情感文本分类混合模型以及句法结构特征扩展策略,在该模型中,生成式模型(朴素贝叶斯分类器)和判别式模型(支持向量机)以级联...
  • 文本分类示例

    2020-03-12 12:57:19
    git地址:分类git 参考:说明
  • 文本分类的总结

    万次阅读 2018-08-28 08:43:17
    笨妞很少做文本分类,因为工作中文本分类确实不怎么用得到,唯一一个项目用到短文本分类,验证集acc和f1都到90%以上,所以在笨妞印象中文本分类应该是很简单的分类问题,都不属于NLP问题。偶然碰到DC竞赛中“达观杯...
  • 用深度学习(CNN RNN Attention)解决大规模文本分类问题 - 综述和实践 近来在同时做一个应用深度学习解决淘宝商品的类目预测问题的项目,恰好硕士毕业时论文题目便是文本分类问题,趁此机会总结下文本分类领域特别...
  • 自然语言处理实战:新闻文本分类(附代码)

    千次阅读 多人点赞 2020-08-13 18:06:15
    自然语言处理实战:新闻文本分类 ——本文比赛来源于天池零基础入门NLP - 新闻文本分类。 目录自然语言处理实战:新闻文本分类一、赛题理解1、学习目标2、赛题数据3、数据标签4、评测指标5、数据读取6、解题思路二...
  • 基于sklearn的贝叶斯文本分类

    千次阅读 2019-09-25 09:59:47
    1. 文本分类问题 随着互联网的发展,非结构化的文本数据急剧增加,在为人们提供更多可用信息的同时,也导致人们更难从中发现自己最感兴趣的信息,也就是说,信息爆炸导致了信息迷航,因此,如何从海量的信息中挖掘出...
  • 该实现基于以下文件: 基于N-Gram的文本分类威廉·B·卡夫纳(William B.Cavnar)和约翰·特伦克(John M.Trenkle) 密歇根州环境研究所邮政信箱134001 安阿伯MI 48113-4001 通过语言配置文件检测 语言配置文件是...
  • 文本分类

    千次阅读 2018-09-07 16:56:06
    一、传统文本分类方法  文本分类问题算是自然语言处理领域中一个非常经典的问题了,相关研究最早可以追溯到上世纪50年代,当时是通过专家规则(Pattern)进行分类,甚至在80年代初一度发展到利用知识工程建立专家...
  •      基于标签语义注意力的多标签...传统的多标签文本分类算法将标签视为没有语义信息的符号,然 而,在许多情况下,文本的标签是具有特定语义的,标签的语义信息和文档的内容信息是有对应关系的
  • 文本分类(一) | (1) 任务定义

    千次阅读 2019-12-19 17:56:26
    项目Github地址 近年来,文本的数量呈指数增长,为了能在许多应用中准确地对文本进行分类,需要对机器学习方法有更深入的了解...在文本分类专栏系列博客中,我将系统的介绍如何搭建一个完整的文本分类系统,包括数...
  • 文本分类算法比较

    2020-09-07 14:04:02
    本文对常用文本分类算法进行了比较,第一部分包括Rocchio算法,boosting,bagging,,逻辑回归,朴素贝叶斯分类器,k最近邻和支持向量机。另外还包括决策树、条件随机场、随机森林和深度学习算法。 第二部分将文本...
  • 近年来卷积神经网络和循环神经网络在文本分类领域得到了越来越广泛的的应用。提出一种卷积神经网络和长短时记忆网络特征融合的模型,通过长短期记忆网络作为池化层的替代来获得长期依赖性,从而构建一个联合CNN和RNN...
  • 文本分类的基本原理

    2021-02-18 16:44:14
    文本分类的基本原理 文本分类的概念 文本分类用电脑对文本集(或其他实体或物件)按照一定的分类体系或标准进行自动分类标记。 它根据一个已经被标注的训练文档集合, 找到文档特征和文档类别之间的关系模型, 然后利用...
  • 因此,我们提出联合文本信息和视觉信息作用于图片分类中,充分利用图片上的特征,将文本检测与识别算法和通用的图片分类方法结合,应用于细粒度图片分类中,在Con-text数据集上的实验结果表明我们提出的算法得到的...
  • Keras之文本分类实现

    千次阅读 2018-12-17 20:17:59
    写在前面从优达DLND毕业后,一直想自己动手做点什么来着,互助班的导师也鼓励自己动手写点心得体验...于是,想着先从自己熟悉的内容着手吧,Siraj老师第三周的编程挑战是做一个多类别的文本分类器,链接在此:Github...
  • 包含文本分类和词向量训练两个功能 Fasttext的分类实现很简单:把输入转化为词向量,取平均,再经过线性分类器得到类别。输入的词向量可以是预先训练好的,也可以随机初始化,跟着分类任务一起训练。 (2)优点 模型...
  • 文本分类之深度学习应用总结

    千次阅读 2018-06-27 14:46:57
    总览本教程分为五个部分,分别是:词嵌入(Word Embeddings) + 卷积神经网络(CNN,Convolutional Neural Network) = 文本分类使用一个单层 CNN 架构调整 CNN 超参数考虑字符级的 CNN考虑用更深层的 CNN 进行分类1...
  • 循环神经网络解决文本分类问题

    千次阅读 2019-09-19 11:30:10
    另一个文本分类模型就是HAN(Hierarchy Attention Network),首先将文本分为句子、词语级别,将输入的词语进行编码然后相加得到句子的编码,然后再将句子编码相加得到最后的文本编码。而attention是指在每一个级别的...
  • 1.文本分类任务介绍 2.TextRNN原理概述 3.TextRNN的典型结构 4.总结 1.文本分类任务介绍 文本分类是自然语言处理的一个基本任务,试图推断出给定文本(句子、文档等)的标签或标签集合。 文本分类的应用非常...
  • 1.文本分类任务介绍 2.RCNN原理概述 3.RCNN模型处理步骤 4.RCNN小结 1.文本分类任务介绍 文本分类是自然语言处理的一个基本任务,试图推断出给定文本(句子、文档等)的标签或标签集合。 文本分类的应用非常广泛...
  • 文本分类---逻辑回归(1)

    万次阅读 多人点赞 2018-01-03 17:40:04
    基于sklearn的文本分类—逻辑回归(1) 本文是文本分类的第一篇,记录使用逻辑回归进行文本分类任务,数据集下载地址:http://thuctc.thunlp.org/ 文本分类的主要内容如下: - 1.基于逻辑回归的文本分类 - 2....
  • 本文是参考gaussic大牛的“ text-classification-cnn-rnn”后,基于同样的数据集,嵌入词级别操作的CNN文本分类实验结果,gaussic大牛是基于字符级的;进行了第二版的更新:1。加入不同的卷积核; 2。加入正则化; 3...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 68,400
精华内容 27,360
关键字:

文本分类级别