使用keras进行情感分析,包括中性推文

时间:2018-07-22 05:18:26

标签: python twitter keras sentiment-analysis

我正在使用keras在python中进行情感分析项目,使用CNN和word2vec作为嵌入方法,我想检测积极,消极和中性的推文(在我的语料库中,我考虑了所有带有0标签的消极推文,Positive = 1,中立= 2)。由于我是该领域的新手,所以我有一些疑问, 这是我的代码的一部分: ***假设X训练和X测试包含推文,而Y训练和Y测试包含推文的标签。

 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(如果labels [index] == 0 :)为负,我将[1.0,0.0]放在某些特定列表中,以及标签是否为1(if 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部分: 我想知道这样预测是真的吗?据我所知,我认为标签2是中性推文,因此我考虑了如果(np.argmax(sentiment)== 2)然后打印中性-这是否合乎逻辑或可以接受?

我的意思是我考虑在火车和测试集中为中性推文分配[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 :(得分:2)

我不建议以这种方式标记您的数据,因为定义损失函数来适当地激励学习非常困难。以下是更标准的方法。

1。分类

标记您的数据,因为它已经是:简单的0,1,2。您可以将它们标记为one-hot vectors

[1., 0., 0.]  # liberal
[0., 1., 0.]  # neutral 
[0., 0., 1.]  # conservative 

并使用categorical_crossentropy损失函数,或简单地将标签传递为012并使用sparse_categorical_crossentropy损失函数。两者的行为应相同。无论哪种方式,请在softmax激活的输出层上使用3个神经元。

2。回归

将情感标记为从01的回归任务,其中0在左侧,1在右侧,0.5 。这样,您的模型将不断训练以预测推文的政治意识形态-这可能对您很有趣。如果走这条路线,请使用一个激活了sigmoid的输出神经元。


此外,如果有帮助,我对一个课堂项目也表现出了政治情感。我使用RNN代替了1D卷积-here仍然是代码。