【问题标题】:Sentiment analysis with keras including neutral tweet使用 keras 进行情绪分析,包括中性推文
【发布时间】:2018-12-29 22:19:14
【问题描述】:

我正在使用 CNN 和 word2vec 作为嵌入方法在 python 中使用 keras 进行情绪分析项目我想检测正面、负面和中性推文(在我的语料库中,我认为每个负面推文都带有 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(如果标签 [索引] == 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) 然后打印中性 - 这是合乎逻辑的还是可以接受的预测??

我的意思是我考虑为训练和测试集中的中性推文分配 [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']) 

感谢您的耐心等待

【问题讨论】:

    标签: python twitter keras sentiment-analysis


    【解决方案1】:

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

    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 损失函数。两者的行为方式应该相同。无论哪种方式,在您的输出层上使用 3 个神经元并激活 softmax

    2。回归

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


    另外,如果有帮助的话,我为一个班级项目做了政治情绪。我使用 RNN 而不是一维卷积 - here 无论如何都是代码。

    【讨论】:

    • 感谢您的关注。正如我告诉你的那样,我在这个领域有点新,所以我必须以一种简单的方式解释你的建议 - 所以我应该编辑我的基本问题以检查我的理解 - 如果你能抢到我,我将不胜感激
    • 顺便说一下,考虑到我将标签作为 0,1,2 传递,就像以前一样。我应该只使用 sparse_categorical_crossentropy 损失函数,其余的没有任何问题?谢谢您的耐心
    • @ZahraBokaee 你是正确的分类。对于回归,只需使用标量。对 2dim 标签进行回归很可能会失败
    • @ZahraBokaee 如果您将标签作为 0,1 或 2 传递并使用稀疏 cce,它的行为与使用常规 cce 的一个热向量相同。
    • 感谢一百万 - 我将在我的整个语料库中对其进行测试并报告结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多