没有人提到它给我留下了深刻的印象,但其他最佳实践是将句子填充到固定大小,使用 Word2Vec 的权重初始化嵌入层并将其输入 LSTM。所以它基本上是 OP 在这里提到的,但包括处理不同长度的填充:
连接所有单词的向量不起作用,因为它不会导致固定大小的特征向量。
例子
考虑以下句子(取自有毒评论分类挑战):
“解释为什么我的用户名 Hardcore Metallica Fan 下的编辑被还原了?他们不是故意破坏,只是在我在纽约娃娃 FAC 投票后关闭了一些 GA。请不要从讨论页面中删除模板,因为我'我现在退休了。89.205.38.27"
首先,我们清理这样的句子:
“解释为什么我的用户名 hardcore metalica fan 下所做的编辑被还原了?他们不是故意破坏,只是在我在纽约娃娃 fac 投票后关闭了一些气体。请不要从讨论页面中删除模板,因为我 '我现在退休了。ipaddress"
接下来,我们将他们的单词编码成整数:
776 92 2 161 153 24964 2492 10 29 75 24 3 2 2 2 2 2 2 2 2 2 75 2730 29 29 23 67 73 10 29 29 2 3 9 10 81 10 81 4030 107 1 216
最后,如果我们执行长度为 200 的填充,它看起来像这样:
array([ 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 776, 92, 2, 161, 153, 212, 44,
754, 4597, 9964, 1290, 104, 399, 34, 57, 2292,
10, 29, 14515, 3, 66, 6964, 22, 75, 2730,
173, 5, 2952, 47, 136, 1298, 16686, 2615, 1,
8, 67, 73, 10, 29, 290, 2, 398, 45,
2, 60, 43, 164, 5, 10, 81, 4030, 107,
1, 216], dtype=int32)
我们可以强制所有句子最多包含 200 个单词,如果少则用零填充,如果多的话则删去后面的单词。
接下来,我们使用 word2vec 的权重初始化一个嵌入模型,这是一个使用 Keras 的示例:
model.add(Embedding(nb_words, WV_DIM, weights=[wv_matrix], input_length=MAX_SEQUENCE_LENGTH, trainable=False))
wv_matrix
包含一个形状为的矩阵(唯一词的数量与嵌入维度的关系)。Rnd
最后我们在这之后添加一个 LSTM 层,例如:
embedded_sequences = SpatialDropout1D(0.2)(embedded_sequences)
x = Bidirectional(CuDNNLSTM(64, return_sequences=False))(embedded_sequences)
参考