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

Nlp 如何使用CNN(Keras)处理文本分类的长度变化,nlp,deep-learning,text-classification,keras,Nlp,Deep Learning,Text Classification,Keras,事实证明,CNN(卷积神经网络)在文本/文档分类中是非常有用的。我想知道如何处理长度的差异,因为在大多数情况下,文章的长度是不同的。Keras中有什么例子吗?谢谢 这里有三个选项: 裁剪较长的文章 把较短的文章垫起来 使用一个自然支持可变长度输入的递归神经网络 您可以在这里看到一个具体的示例:一个可能的解决方案是以1为一批发送序列 n_batch = 1 model.fit(X, y, epochs=1, batch_size=n_batch, verbose=1, shuffle=False)

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

这里有三个选项:

  • 裁剪较长的文章
  • 把较短的文章垫起来
  • 使用一个自然支持可变长度输入的递归神经网络

  • 您可以在这里看到一个具体的示例:

    一个可能的解决方案是以1为一批发送序列

    n_batch = 1
    model.fit(X, y, epochs=1, batch_size=n_batch, verbose=1, shuffle=False)
    
    官方keras回购协议的这一问题提供了很好的见解和可能的解决方案:

    引用帕特约克的评论:

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

  • 扣垫
  • 将输入样本分离到具有 相似的长度,理想情况下,每个桶具有多个样本 这是每个铲斗的最小批量的倍数,请将 样本长度为该桶中最长样本的长度,带有 中性号码。0是经常出现的,但对于语音数据之类的东西, 通常使用非零的沉默表示(例如 音频无声部分的FFT用作中性填充)

  • 将输入样本分离到完全相同的桶中 长度消除了确定什么是中性填充的需要 但是,在这种情况下,铲斗的大小通常不是一个问题 小批量大小的倍数,因此在每个历元中 更新不会基于完整的小批量


    我刚刚用Keras的LSTM RNN模型制作了一个模型。它迫使我输入(即句子)。但是,我只是在句子中添加了一个空字符串,直到达到所需的长度。可能=最大长度(大写)的特征长度。然后,在运行模型之前,我可以使用手套将特征转换为向量空间

    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
    

    Keras要求在输入数据之前使用numpy数组,因此“我的功能”和“标签”都是numpy数组。

    选项1和2在剪切或填充后会影响文章的原始含义吗?剪切可能会(没有那么多填充),但你真的需要阅读整篇新闻文章才能了解其要点吗?切割的不利程度取决于你的任务。关于3,我认为如果你有一个顺序对顺序的问题,比如词性标注,这是真的。在序列标签中,如情绪分析或情绪检测,我相信您必须在Keras中进行截断/填充,以便使用RNN进行序列标记。@pedrobisp使用RNN标记可变长度序列肯定是可行的。您是否有任何示例代码,其中可变长度序列作为输入提供给Keras中的RNN?到目前为止,我所看到的是,为了获得相同大小的序列,您必须始终应用填充/截断。
    X = getWordVectors(features)
    y = to_categorical(y)# for categorical_crossentropy
    model.fit(X, y, batch_size=16, epochs=5, shuffle=False)