使用 keras 进行情感分析,包括中性推文
Sentiment analysis with keras including neutral tweet
我正在 python 中使用 keras 使用 CNN 和 word2vec 作为嵌入方法进行情绪分析项目0 标签,正 = 1 和中性 = 2)。由于我是这个领域的新手,所以我有一些问题,
这是我的代码的一部分:
***假设 X-train 和 X-test 包含推文,Y-train 和 Y-test 包含推文的标签。
if i < train_size:
if labels[index] == 0 :
Y_train[i, :] = [1.0, 0.0]
elif labels[index] == 1 :
Y_train[i, :] = [0.0, 1.0]
else:
Y_train[i, :] = [1.0, 1.0]
else:
if labels[index] == 0 :
Y_test[i - train_size, :] = [1.0, 0.0]
elif labels[index] == 1 :
Y_test[i - train_size, :] = [0.0, 1.0]
else:
Y_test[i - train_size, :] = [1.0, 1.0]
在上面的代码中,您看到我考虑了相关标签是否为 0(如果标签 [index] == 0 :) 作为负数,我将 [1.0, 0.0] 放在某个特定列表中,如果标签为 1 (如果 labels[index] == 1 :) 我把 [0.0, 1.0] 作为正面推文,否则(如果 labels[index] == 2 :) 作为中性我把 [1.0, 1.0] 所以只考虑逻辑部分我提到的代码没问题。
这是我的 keras 模型:
model = Sequential()
model.add(Conv1D(32, kernel_size=3, activation='elu',
padding='same', input_shape=
(max_tweet_length,vector_size)))
model.add(Conv1D(32, kernel_size=3, activation='elu',
padding='same'))
model.add(Conv1D(32, kernel_size=3, activation='elu',
padding='same'))
model.add(Conv1D(32, kernel_size=3, activation='elu',
padding='same'))
model.add(Dropout(0.25))
model.add(Conv1D(32, kernel_size=2, activation='elu',
padding='same'))
model.add(Conv1D(32, kernel_size=2, activation='elu',
padding='same'))
model.add(Conv1D(32, kernel_size=2, activation='elu',
padding='same'))
model.add(Conv1D(32, kernel_size=2, activation='elu',
padding='same'))
model.add(Dropout(0.25))
model.add(Dense(256, activation='tanh'))
model.add(Dense(256, activation='tanh'))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(2, activation='sigmoid'))
所以为了预测一个新的输入,我有这个代码:
sentiment = model.predict(np.array(a),batch_size=1,verbose = 2)[0]
if(np.argmax(sentiment) == 0):
print("negative")
print('the label is')
print(np.argmax(sentiment))
elif (np.argmax(sentiment) == 1):
print("positive")
print('the label is')
print(np.argmax(sentiment))
elif (np.argmax(sentiment) ==2):
print("neutral")
print('the label is')
print(np.argmax(sentiment))
我的问题包含两部分:
我想知道这样预测是真的吗?据我所知,我考虑了中性推文的标签 2,因此我考虑了 if (np.argmax(sentiment) ==2) then print neutral - 这对于预测是否合乎逻辑或可接受??
我的意思是我考虑过为训练和测试集中的中性推文分配 [0.1, 1.0] 所以如果我认为 2 在预测部分是中性的,它有意义吗??
非常感谢
****对于回归,以这种方式更改我的火车和测试代码是真的吗?
将 0,1,2 视为我语料库中的极性
if i < train_size:
if labels[index] == 0 :
Y_train[i, :] = [1.0, 0.0]
elif labels[index] == 1 :
Y_train[i, :] = [0.0, 1.0]
elif labels[index]==2
Y_train[i, :] = [0.5, 0.5]
else:
if labels[index] == 0 :
Y_test[i - train_size, :] = [1.0, 0.0]
elif labels[index] == 1 :
Y_test[i - train_size, :] = [0.0, 1.0]
else:
Y_test[i - train_size, :] = [0.5, 0.5]
然后设置'sigmoid'激活:
model.add(Dense(256, activation='tanh'))
model.add(Dense(256, activation='tanh'))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(2, activation='sigmoid'))
我可以按照上面提到的方式预测我输入的推文吗??
if (np.argmax(sentiment) ==2):
print("neutral")
print('the label is')
print(np.argmax(sentiment))
*****如果我使用 word2vec 进行嵌入并在我的语料库中考虑 0,1,2 作为极性,我可以这样设置标签吗?
if i < train_size:
if labels[index] == 0 :
Y_train[i, :] = [1.0, 0.0,0.0]
elif labels[index] == 1 :
Y_train[i, :] = [0.0, 1.0,0.0]
else:
Y_train[i, :] = [0.0, 0.0,1.0]
else:
if labels[index] == 0 :
Y_test[i - train_size, :] = [1.0, 0.0,0.0]
elif labels[index] == 1 :
Y_test[i - train_size, :] = [0.0, 1.0,0.0]
else:
Y_test[i - train_size, :] = [0.0, 0.0,1.0]
然后进行编译:
model.compile(loss='categorical_crossentropy',
optimizer=Adam(lr=0.0001, decay=1e-6),
metrics=['accuracy'])
感谢您的耐心等待
我不建议以这种方式标记您的数据,因为定义损失函数以适当地激励学习将非常困难。以下将是更标准的方法。
1.分类
按原样标记您的数据:简单的 0,1,2。您可以将它们标记为 one-hot vectors
:
[1., 0., 0.] # liberal
[0., 1., 0.] # neutral
[0., 0., 1.] # conservative
并使用categorical_crossentropy
loss function, or simply pass in your labels as 0
, 1
, or 2
and use the sparse_categorical_crossentropy
损失函数。两者的行为方式应该相同。无论哪种方式,在输出层上使用 3 个神经元并激活 softmax
。
2。回归
将标记情绪作为从 0
到 1
的回归任务,0
在左边,1
在右边,0.5
.通过这种方式,您的模型将训练以持续预测推文的政治意识形态——您可能会感兴趣。如果你走这条路,使用一个具有 sigmoid
激活的输出神经元。
此外,如果有帮助的话,我为一个class项目做了政治情绪。尽管我使用了 RNN 而不是 1D 卷积 - here 无论如何都是代码。
我正在 python 中使用 keras 使用 CNN 和 word2vec 作为嵌入方法进行情绪分析项目0 标签,正 = 1 和中性 = 2)。由于我是这个领域的新手,所以我有一些问题, 这是我的代码的一部分: ***假设 X-train 和 X-test 包含推文,Y-train 和 Y-test 包含推文的标签。
if i < train_size:
if labels[index] == 0 :
Y_train[i, :] = [1.0, 0.0]
elif labels[index] == 1 :
Y_train[i, :] = [0.0, 1.0]
else:
Y_train[i, :] = [1.0, 1.0]
else:
if labels[index] == 0 :
Y_test[i - train_size, :] = [1.0, 0.0]
elif labels[index] == 1 :
Y_test[i - train_size, :] = [0.0, 1.0]
else:
Y_test[i - train_size, :] = [1.0, 1.0]
在上面的代码中,您看到我考虑了相关标签是否为 0(如果标签 [index] == 0 :) 作为负数,我将 [1.0, 0.0] 放在某个特定列表中,如果标签为 1 (如果 labels[index] == 1 :) 我把 [0.0, 1.0] 作为正面推文,否则(如果 labels[index] == 2 :) 作为中性我把 [1.0, 1.0] 所以只考虑逻辑部分我提到的代码没问题。
这是我的 keras 模型:
model = Sequential()
model.add(Conv1D(32, kernel_size=3, activation='elu',
padding='same', input_shape=
(max_tweet_length,vector_size)))
model.add(Conv1D(32, kernel_size=3, activation='elu',
padding='same'))
model.add(Conv1D(32, kernel_size=3, activation='elu',
padding='same'))
model.add(Conv1D(32, kernel_size=3, activation='elu',
padding='same'))
model.add(Dropout(0.25))
model.add(Conv1D(32, kernel_size=2, activation='elu',
padding='same'))
model.add(Conv1D(32, kernel_size=2, activation='elu',
padding='same'))
model.add(Conv1D(32, kernel_size=2, activation='elu',
padding='same'))
model.add(Conv1D(32, kernel_size=2, activation='elu',
padding='same'))
model.add(Dropout(0.25))
model.add(Dense(256, activation='tanh'))
model.add(Dense(256, activation='tanh'))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(2, activation='sigmoid'))
所以为了预测一个新的输入,我有这个代码:
sentiment = model.predict(np.array(a),batch_size=1,verbose = 2)[0]
if(np.argmax(sentiment) == 0):
print("negative")
print('the label is')
print(np.argmax(sentiment))
elif (np.argmax(sentiment) == 1):
print("positive")
print('the label is')
print(np.argmax(sentiment))
elif (np.argmax(sentiment) ==2):
print("neutral")
print('the label is')
print(np.argmax(sentiment))
我的问题包含两部分: 我想知道这样预测是真的吗?据我所知,我考虑了中性推文的标签 2,因此我考虑了 if (np.argmax(sentiment) ==2) then print neutral - 这对于预测是否合乎逻辑或可接受??
我的意思是我考虑过为训练和测试集中的中性推文分配 [0.1, 1.0] 所以如果我认为 2 在预测部分是中性的,它有意义吗??
非常感谢
****对于回归,以这种方式更改我的火车和测试代码是真的吗? 将 0,1,2 视为我语料库中的极性
if i < train_size:
if labels[index] == 0 :
Y_train[i, :] = [1.0, 0.0]
elif labels[index] == 1 :
Y_train[i, :] = [0.0, 1.0]
elif labels[index]==2
Y_train[i, :] = [0.5, 0.5]
else:
if labels[index] == 0 :
Y_test[i - train_size, :] = [1.0, 0.0]
elif labels[index] == 1 :
Y_test[i - train_size, :] = [0.0, 1.0]
else:
Y_test[i - train_size, :] = [0.5, 0.5]
然后设置'sigmoid'激活:
model.add(Dense(256, activation='tanh'))
model.add(Dense(256, activation='tanh'))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(2, activation='sigmoid'))
我可以按照上面提到的方式预测我输入的推文吗??
if (np.argmax(sentiment) ==2):
print("neutral")
print('the label is')
print(np.argmax(sentiment))
*****如果我使用 word2vec 进行嵌入并在我的语料库中考虑 0,1,2 作为极性,我可以这样设置标签吗?
if i < train_size:
if labels[index] == 0 :
Y_train[i, :] = [1.0, 0.0,0.0]
elif labels[index] == 1 :
Y_train[i, :] = [0.0, 1.0,0.0]
else:
Y_train[i, :] = [0.0, 0.0,1.0]
else:
if labels[index] == 0 :
Y_test[i - train_size, :] = [1.0, 0.0,0.0]
elif labels[index] == 1 :
Y_test[i - train_size, :] = [0.0, 1.0,0.0]
else:
Y_test[i - train_size, :] = [0.0, 0.0,1.0]
然后进行编译:
model.compile(loss='categorical_crossentropy',
optimizer=Adam(lr=0.0001, decay=1e-6),
metrics=['accuracy'])
感谢您的耐心等待
我不建议以这种方式标记您的数据,因为定义损失函数以适当地激励学习将非常困难。以下将是更标准的方法。
1.分类
按原样标记您的数据:简单的 0,1,2。您可以将它们标记为 one-hot vectors
:
[1., 0., 0.] # liberal
[0., 1., 0.] # neutral
[0., 0., 1.] # conservative
并使用categorical_crossentropy
loss function, or simply pass in your labels as 0
, 1
, or 2
and use the sparse_categorical_crossentropy
损失函数。两者的行为方式应该相同。无论哪种方式,在输出层上使用 3 个神经元并激活 softmax
。
2。回归
将标记情绪作为从 0
到 1
的回归任务,0
在左边,1
在右边,0.5
.通过这种方式,您的模型将训练以持续预测推文的政治意识形态——您可能会感兴趣。如果你走这条路,使用一个具有 sigmoid
激活的输出神经元。
此外,如果有帮助的话,我为一个class项目做了政治情绪。尽管我使用了 RNN 而不是 1D 卷积 - here 无论如何都是代码。