为文本分类添加额外维度

Posted

技术标签:

【中文标题】为文本分类添加额外维度【英文标题】:Adding an extra dimension to text classification 【发布时间】:2019-06-18 05:21:21 【问题描述】:

我想在 Keras 中使用神经网络进行文本分类。我使用以下网络设置了一个简单的测试样本:

model = Sequential()
model.add(Embedding(NUMVOCABOLARYWORDS, 5, input_length = sequenceDataPadded.shape[1]))
model.add(LSTM(256, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(128))
model.add(Dense(1))

此网络接受标记化的填充文本序列。例如。我标记了文本“hello world”= [0,1,0,0,0..]。它可以很好地训练和评估。

现在我的问题是我不想将单个序列输入网络,而是将一个集合(比如说 500 个)序列输入网络并输出一个类别。因此,现在不是形状为 (100) 的输入,而是 (500, 100)。我不确定如何最好地创建网络架构,即:

1) 我应该展平输入还是尝试减小尺寸?我可以使用哪些层来完成这项工作?

2) 我应该只创建一个包含所有文本的大序列吗?

3) 拥有 4 维的 LSTM 是否有意义?

4) 是否存在使用一组标记数组进行分类的示例?

文本是从不同来源收集的文本,因此每批中的不同序列不一定与日期相关。

【问题讨论】:

我正在考虑合并给定批次的所有文本并输入标记化的文本和频率,例如 [0, 1, 2, 5, 6, 4, 3...] [1, 2, 4, 5, 6, 7...],但我真的很想要一些建议。 【参考方案1】:

我不认为将所有文本合并在一起是解决方案。那么问题是,如果你将它提供给 LSTM,那么每个文本的隐藏状态最初都不会开始。因此,您输入第一个文本,然后第二个和所有其他文本将具有当前隐藏状态。

您可以使用函数式 API 并创建不同的输入,并为每个输入提供自己的 LSTM。然后你可以合并它们并在最后拥有密集层。 您可以尝试的另一件事是使用 CNN。同样,您要么必须创建多个输入,要么连接所有输入,然后使用 CNN 层。这里的优势可能是速度。因为取决于你有多少 LSTM 以及你的输入有多大,训练可能需要相当长的时间。特别是因为反向传播也必须经过每个时间步长。所以在性能方面,你可能会更好地使用 CNN。

所以我要做的是将数组分开保持最大长度。然后你将每个数组填充到这个长度(如果它们很短)。然后使用Functional API 创建多个输入,并在其后面使用 Conv1D 层。你做了一些conv操作(也许堆叠几个conv层,maxpooling等)。然后将它们与concatenate layer 合并。然后你有一些更密集的或 CNN。

【讨论】:

嗨,Syrius。谢谢你的反馈。如果我理解正确,您会使用 CNN 来提高速度,而不是降维。我知道 CNN 在图像中有它们的用途,但我发现它们对于标记化的输入有点模糊。例如。如果数组 [1,2,6,4,7] 中的每个整数都代表一个单词,那么应用内核乘以输入是否有意义?也许我这样想是错误的。无论如何,我会做一些测试:-​​) CNN 最近实际上也大量用于 NLP 任务。以下是一些博文和 github 存储库:medium.com/jatana/…github.com/bhaveshoswal/CNN-text-classification-kerasdavidsbatista.net/blog/2018/03/31/… 您仍然可以预先使用嵌入层,这可能会提高性能。这也可能有助于过滤器(内核),因为相似的词应该被投射到相似的空间中。

以上是关于为文本分类添加额外维度的主要内容,如果未能解决你的问题,请参考以下文章

文本分类学习 支持向量机SVM 的前奏 结构风险最小化和VC维度理论

文本分类学习 特征权重(TF/IDF)和特征提取

使用 Weka 进行文本分类

Datawhale-新闻文本分类-task4-基于深度学习的文本分类1-fastText

GCN和GCN在文本分类中应用

使用gensim和sklearn搭建一个文本分类器:文档向量化