如何使用CNN(Keras)处理文本分类的长度变化

时间:2016-06-02 01:40:48

标签: nlp deep-learning text-classification keras

已经证明CNN(卷积神经网络)对于文本/文档分类非常有用。我想知道如何处理长度差异,因为在大多数情况下文章的长度是不同的。在Keras有什么例子吗?谢谢!!

4 个答案:

答案 0 :(得分:3)

以下是三个选项:

  1. 裁剪较长的文章。
  2. 填写较短的文章。
  3. 使用循环神经网络,它自然支持可变长度输入。

答案 1 :(得分:3)

答案 2 :(得分:1)

一种可能的解决方案是分批发送序列。

n_batch = 1
model.fit(X, y, epochs=1, batch_size=n_batch, verbose=1, shuffle=False)

官方keras repo上的这个问题提供了很好的见解和可能的解决方案:https://github.com/keras-team/keras/issues/85

引用patyork的评论:

  

有两种简单且最常用的处理方法:

     
      
  1. Bucketing and Padding
  2.         

    将输入样本分成具有的桶   类似的长度,理想情况下每个桶具有多个样本   这是迷你批量大小的倍数对于每个桶,填充   用a表示该桶中最长样品的长度   中性数字。 0是经常出现的,但对于像语音数据这样的东西,   使用静音的表示,其通常不是零(例如,   音频静音部分的FFT用作中性填充。)

         
        
    1. Bucketing
    2.         

      将输入样本分成完全相同的桶   长度消除了确定中性填充是什么的需要   但是,在这种情况下,桶的大小通常不是a   多个小批量大小,所以在每个时代,多次   更新不会基于完整的小批量。

答案 3 :(得分:0)

我刚刚使用他们的LSTM RNN模型在Keras中建立了一个模型。它迫使我填写自己的输入内容(即句子)。但是,我只是在句子中添加了一个空字符串,直到达到所需的长度为止。可能=等于具有最大长度的特征的长度(以字为单位)。然后,在运行模型之前,我可以使用手套将特征转换为矢量空间。

def getWordVector(X):
    global num_words_kept
    global word2vec
    global word_vec_dim

    input_vector = []
    for row in X:
        words = row.split()
        if len(words) > num_words_kept:
            words = words[:num_words_kept]
        elif len(words) < num_words_kept:
            for i in range(num_words_kept - len(words)):
                words.append("")
        input_to_vector = []
        for word in words:
            if word in word2vec:
                input_to_vector.append(np.array(word2vec[word]).astype(np.float).tolist())#multidimensional wordvecor
            else:
                input_to_vector.append([5.0] * word_vec_dim)#place a number that is far different than the rest so as not to be to similar
        input_vector.append(np.array(input_to_vector).tolist())
    input_vector = np.array(input_vector)
    return input_vector

其中X是句子列表,此函数将为返回数组中的每个函数返回一个具有num_words_kept长度的特征的词向量(使用手套的word_to_vec)。所以我同时使用填充和截断。 (填充Keras的实现并截断,因为当您在输入大小上存在如此巨大的差异时,Keras也会遇到问题...我不确定为什么。当我开始用100多个空字符串填充一些句子时,我遇到了问题

X = getWordVectors(features)
y = to_categorical(y)# for categorical_crossentropy
model.fit(X, y, batch_size=16, epochs=5, shuffle=False)

Keras要求您在输入数据之前使用numpy数组,因此我的特征和标签都是numpy数组。