Nlp 如何使用CNN(Keras)处理文本分类的长度变化
事实证明,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)
您可以在这里看到一个具体的示例:一个可能的解决方案是以1为一批发送序列
n_batch = 1
model.fit(X, y, epochs=1, batch_size=n_batch, verbose=1, shuffle=False)
官方keras回购协议的这一问题提供了很好的见解和可能的解决方案:
引用帕特约克的评论:
有两种简单且最常用的处理方法:
我刚刚用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)