文本分类的一些实践(三)

基于多个句子的分类

除了一般的对于单句的文本分类的场景,还有一些场景句子和上下文的标签是相关的。如多伦对话中的话题、可能几句句子表示同一个话题;文章的段落结构,简历的段落结构等;其中每一行文本都不是孤立的,于是想尝试对词的NER做一下扩展,变成基于句子的NER,来学习句子间的上下文关系。

模型构建的思路

首先将每一行的词表示成句字的编码,然后把句子当成词构建LSTM + CRF的NER模型。当然在构建时可以进行一些小的变形,如增加BiLSTM,Attention等
当然本人也尝试了用CRF++工具对句子序列标注的方案。

doc-lable

        embedding_layer = Embedding(self.vocab_size,
                                    self.embed_dim,
                                    input_length=self.sentence_len_max)

        sentence_input = Input(shape=(self.sentence_len_max,), dtype='int32')
        embedded_sequences = embedding_layer(sentence_input)
        l_lstm = Bidirectional(LSTM(100, return_sequences=True))(embedded_sequences)
        l_dense = TimeDistributed(Dense(200))(l_lstm)
        l_att = AttentionLayer()(l_dense) 
        sentEncoder = Model(sentence_input, l_att)

        review_input = Input(shape=(self.doc_sent_len_max, self.sentence_len_max), dtype='int32')
        review_encoder = TimeDistributed(sentEncoder)(review_input)

        l_lstm_sent = Bidirectional(LSTM(100, return_sequences=True))(review_encoder)
        l_dense_sent = TimeDistributed(Dense(200))(l_lstm_sent)

        preds = Dense(units=self.num_class, activation='softmax')(l_dense_sent)
        crf = CRF(self.num_class,sparse_target=False)
        crf_out = crf(preds)
        model = Model(review_input, crf_out)
        model.compile(optimizer="rmsprop", loss=crf.loss_function, metrics=[crf.accuracy])
        print(model.summary())
        return model

实验结果:

在本次实验中并没有取得比单行文本更好的效果,可能因素有如下:

  1. 样本太少,不足以支撑复杂模型。

  2. 在句子的表示方面,和单句的表示方式差异不大,在句子表示结果不理想的情况下CRF不能学习到更好的结果。

猜你喜欢

转载自blog.csdn.net/cyinfi/article/details/82085905