具有同步 POS 标记和情感分类的 RNN?
RNN with simultaneous POS tagging and sentiment classification?
我正在解决一个问题,我需要同时执行词性 (POS) 标记和情感分析。我正在使用 Tensorflow,正在考虑使用 Keras。
我有一个很大的英语句子数据集,这些句子都标有 POS 标签和情绪(负面、中性、正面)。
是否可以训练循环神经网络(vanilla RNN、GRU 或 LSTM)来学习 词性标注和情感分类?当然,在测试期间,我想输入一个句子,让 RNN 一起为 POS 标签和情感生成预测。
我在想下面的 RNN 架构。我不确定 Tensorflow(我一直在使用)或 Keras(我现在才刚学)是否可行。我之前实现的 RNN 只完成一项任务,而不是两项。
感谢您的帮助。
可能适用于词性标记的非常简单的 Keras 模型可能如下所示:
from keras.layers import Dense, LSTM
from keras.models import Model, Sequential
model = Sequential()
model.add(
LSTM(
hidden_layer_size,
return_sequences=True,
input_shape=(seq_length, nb_words),
unroll=True
)
)
model.add(Dense(nb_pos_types, activation="softmax"))
model.compile(loss="categorical_crossentropy", optimizer="rmsprop")
我假定各种参数的地方:
hidden_layer_size
:内部循环层的任意维度。
seq_length
:输入序列长度。
nb_words
:词汇表大小,用于单热编码输入,详细说明哪个单词对应哪个序列位置。
nb_pos_types
:不同可能的 POS 标签的数量(对于单热编码标签)。
目标是像这样修改一个简单的网络,以便它也能预测情绪(不清楚你的情绪是分数还是类别标签,但我假设是类别标签),这样损失函数包括该情绪预测的惩罚项。
有很多方法可以做到这一点,但一种常见的方法是 "fork" 模型的新辐条脱离一些早期层,并让这个辐条产生额外的预测(通常称为 "multi-task"或"joint-task"学习)。
为此,我们将从 Sequential
开始,但将其重命名为 base_model
以明确它在为多个任务分支之前用作一组基础层.然后我们将使用 Keras 的函数语法对每个分支执行我们需要的操作,然后将它们组合在一起作为 final_model
的多个输出,我们可以在其中表达每个输出的整体损失函数的一部分。
下面是我们如何修改上面的例子来做到这一点:
base_model = Sequential()
base_model.add(
LSTM(
hidden_layer_size,
return_sequences=True,
input_shape=(seq_length, nb_words),
unroll=True
)
)
# Get a handle to the output of the recurrent layer.
rec_output = base_model.outputs[0]
# Create a layer representing the POS prediction.
pos_spoke = Dense(nb_pos_types, activation="softmax",
name="pos")(rec_output)
# Create a layer representing the sentiment prediction.
# I assume `nb_sentiments` is the number of sentiment categories.
sentiment_spoke = Dense(nb_sentiments, activation="softmax",
name="sentiment")(rec_output)
# Reunify into a single model which takes the same inputs as
# determined for `base_model`, and provides a list of 2 outputs,
# one for each spoke (POS and sentiment).
final_model = Model(inputs=base_model.inputs,
outputs=[pos_spoke, sentiment_spoke])
# Finally, use a dictionary for the loss function to specify the
# loss for each output, and optionally separate weights for when
# the losses are added as a weighted sum for the total loss.
final_model.compile(
optimizer='rmsprop',
loss={'pos': 'categorical_crossentropy',
'sentiment': 'categorical_crossentropy'},
loss_weights={'pos': 1.0, 'sentiment': 1.0}
)
最后,在调用 final_model.fit
时,您将提供一个标签列表,其中包含与每个输出关联的两个张量或标签数组。
您可以阅读更多关于多输出损失和架构的信息at the Keras docs on multi-input and multi-output models。
最后,请注意,这是一个非常简单的模型(并且可能表现不佳——它仅用于说明)。如果您有特定的 POS 特定或情感特定架构,您可以使用我们创建的辐条 pos_spoke
和 sentiment_spoke
来获得具有更复杂网络拓扑的附加层。
而不是直接将它们定义为 Dense
,它们可以是额外的循环层,甚至可能是卷积层等,然后是一些最终的 Dense
层,其变量名称和层名称将是用于输出和损失中的适当位置。
还要注意此处使用 return_sequences=True
。这允许在序列 的每个步骤中进行 POS 和 情绪预测 ,即使您可能只关心最后的情绪预测。一种可能的选择是修改 sentiment_spoke
以仅对来自 rec_output
的最终序列元素进行操作,或者另一种(不太可能)的选择是为输入序列中的每个单词重复句子的整体情感标签.
我正在解决一个问题,我需要同时执行词性 (POS) 标记和情感分析。我正在使用 Tensorflow,正在考虑使用 Keras。
我有一个很大的英语句子数据集,这些句子都标有 POS 标签和情绪(负面、中性、正面)。
是否可以训练循环神经网络(vanilla RNN、GRU 或 LSTM)来学习 词性标注和情感分类?当然,在测试期间,我想输入一个句子,让 RNN 一起为 POS 标签和情感生成预测。
我在想下面的 RNN 架构。我不确定 Tensorflow(我一直在使用)或 Keras(我现在才刚学)是否可行。我之前实现的 RNN 只完成一项任务,而不是两项。
感谢您的帮助。
可能适用于词性标记的非常简单的 Keras 模型可能如下所示:
from keras.layers import Dense, LSTM
from keras.models import Model, Sequential
model = Sequential()
model.add(
LSTM(
hidden_layer_size,
return_sequences=True,
input_shape=(seq_length, nb_words),
unroll=True
)
)
model.add(Dense(nb_pos_types, activation="softmax"))
model.compile(loss="categorical_crossentropy", optimizer="rmsprop")
我假定各种参数的地方:
hidden_layer_size
:内部循环层的任意维度。seq_length
:输入序列长度。nb_words
:词汇表大小,用于单热编码输入,详细说明哪个单词对应哪个序列位置。nb_pos_types
:不同可能的 POS 标签的数量(对于单热编码标签)。
目标是像这样修改一个简单的网络,以便它也能预测情绪(不清楚你的情绪是分数还是类别标签,但我假设是类别标签),这样损失函数包括该情绪预测的惩罚项。
有很多方法可以做到这一点,但一种常见的方法是 "fork" 模型的新辐条脱离一些早期层,并让这个辐条产生额外的预测(通常称为 "multi-task"或"joint-task"学习)。
为此,我们将从 Sequential
开始,但将其重命名为 base_model
以明确它在为多个任务分支之前用作一组基础层.然后我们将使用 Keras 的函数语法对每个分支执行我们需要的操作,然后将它们组合在一起作为 final_model
的多个输出,我们可以在其中表达每个输出的整体损失函数的一部分。
下面是我们如何修改上面的例子来做到这一点:
base_model = Sequential()
base_model.add(
LSTM(
hidden_layer_size,
return_sequences=True,
input_shape=(seq_length, nb_words),
unroll=True
)
)
# Get a handle to the output of the recurrent layer.
rec_output = base_model.outputs[0]
# Create a layer representing the POS prediction.
pos_spoke = Dense(nb_pos_types, activation="softmax",
name="pos")(rec_output)
# Create a layer representing the sentiment prediction.
# I assume `nb_sentiments` is the number of sentiment categories.
sentiment_spoke = Dense(nb_sentiments, activation="softmax",
name="sentiment")(rec_output)
# Reunify into a single model which takes the same inputs as
# determined for `base_model`, and provides a list of 2 outputs,
# one for each spoke (POS and sentiment).
final_model = Model(inputs=base_model.inputs,
outputs=[pos_spoke, sentiment_spoke])
# Finally, use a dictionary for the loss function to specify the
# loss for each output, and optionally separate weights for when
# the losses are added as a weighted sum for the total loss.
final_model.compile(
optimizer='rmsprop',
loss={'pos': 'categorical_crossentropy',
'sentiment': 'categorical_crossentropy'},
loss_weights={'pos': 1.0, 'sentiment': 1.0}
)
最后,在调用 final_model.fit
时,您将提供一个标签列表,其中包含与每个输出关联的两个张量或标签数组。
您可以阅读更多关于多输出损失和架构的信息at the Keras docs on multi-input and multi-output models。
最后,请注意,这是一个非常简单的模型(并且可能表现不佳——它仅用于说明)。如果您有特定的 POS 特定或情感特定架构,您可以使用我们创建的辐条 pos_spoke
和 sentiment_spoke
来获得具有更复杂网络拓扑的附加层。
而不是直接将它们定义为 Dense
,它们可以是额外的循环层,甚至可能是卷积层等,然后是一些最终的 Dense
层,其变量名称和层名称将是用于输出和损失中的适当位置。
还要注意此处使用 return_sequences=True
。这允许在序列 的每个步骤中进行 POS 和 情绪预测 ,即使您可能只关心最后的情绪预测。一种可能的选择是修改 sentiment_spoke
以仅对来自 rec_output
的最终序列元素进行操作,或者另一种(不太可能)的选择是为输入序列中的每个单词重复句子的整体情感标签.