结合机器学习分类器与 NLTK Vader 进行情感分析

数据挖掘 机器学习 神经网络 scikit-学习 情绪分析 nltk
2021-09-27 16:17:58

作为我大学项目的一部分,我正在研究/开发一个情感分析模型,其中我试图将 NLTK Vader (SentimentIntensityAnalyzer) 结果与机器学习训练的分类器相结合,以预测 Twitter 数据上的情感。

详细说明 -

为了解释我想要做的是 - 结合机器学习分类器和 NLTK Vader 情绪分析,以更好地将推文分类为正面、负面或中性。

我所做的是——

  1. 清理数据(Niek Sanders 推特语料库)并预处理推文,包括停用词删除、URL 删除、用户提及删除、从 Hashtags 中删除 # 符号、小写转换、词干处理等。

  2. 拆分为 80:20 训练:测试比例

  3. 使用 TfidfVectorizer 创建带有 TFIDF 单词的稀疏特征矩阵。列数等于干净数据中的字数。

  4. 使用此向量矩阵使用 scikit-learn 训练和测试分类器。

使用的分类器——同样的向量矩阵被用于训练——KNN、随机森林、朴素贝叶斯、SVM、人工神经网络和卷积神经网络。

现在,在尝试结合 NLTK Vader(SentimentIntensityAnalyzer 结果)时出现了主要疑问。

我正在做的是 - 从上面的第三步开始,在 tfidf 向量矩阵中,我添加了 2 列,并且我正在为 NLTK 给出的推文添加正极性和负极性结果,所以现在向量矩阵有 2 个新列 n +1(NLTK 推文的总正极性),n+2(NLTK 推文的总负极性),它看起来像 -

    0      1     2     3     4     5     6     7  ......... |  n+1    |   n+2
------------------------------------------------------------|---------|----------
    0.4   0.3   0.4   0.1   0.5   0.3   0.2   0.4 ......... |  0.345  |  0.345
    0.5   0.3   0.2   0.8   0.3   0.6   0.4   0.5 ......... |  0.765  |  0.523
    0.6   0.4   0.1   0.7   0.8   0.8   0.2   0.2 ......... |  0.392  |  0.664
    0.2   0.9   0.7   0.4   0.9   0.9   0.8   0.5 ......... |  0.832  |  0.658
    0.9   0.5   0.9   0.7   0.3   0.2   0.2   0.5 ......... |  0.273  |  0.283
    0.5   0.2   0.2   0.7   0.2   0.1   0.6   0.6 ......... |  0.505  |  0.194
    0.4   0.3   0.2   0.3   0.3   0.9   0.5   0.5 ......... |  0.102  |  0.927
    0.1   0.8   0.1   0.2   0.1   0.5   0.2   0.7 ......... |  0.735  |  0.455

问题- 那么以这种方式添加它是否正确?

我还可以将这些极性转换为二进制值,以使用 0 和 1 来标记整体情绪是积极的、消极的还是中性的。

注意- 我使用 2 列代表 3 个类别(正面、负面或中性)以避免虚拟变量陷阱。

尽管它以 1-2% 的小幅度提高了分类器的整体准确度。

但我做得对吗? 如果没有,请告诉我如何将上述两者协作,即 NLTK Vader 结果与机器学习分类器。

2个回答

有趣的方法,但NLTK Vader 的全部目的是拥有一个预训练模型毕竟,NLTK Vader 是手动 (!) 标记的。

我刚刚“我并不讨厌这部电影”上测试了Google 与 NLTK Vader(对于算法而言,否定是出了名的难以捕捉),而 NLTK Vader 的表现比 Google 好得多。NLTK Vader 的评分是正面的(0.45),而谷歌的评分是负面的(-0.6)。

有趣的 ... :-)

强文本

在此处输入图像描述

祝你好运!

我会一一解答你的问题:


问题 - 那么以这种方式添加它是否正确?

这是一个潜在的好方法。一个潜在的改进(但这是个人意见)是用其他东西改变整体极性分数。我认为这种方法太多“词袋”(即它丢失了序列信息)。

由于您熟悉神经网络,我建议您使用RNN原因如下:当您使用自然语言时,有时单词的顺序比单词本身的含义更重要有时单词的顺序本身就决定了它们的含义!这就是为什么 NLP 在使用能够理解序列的模型(例如 RNN)时实现最先进的性能的原因。


我还可以将这些极性转换为二进制值,以使用 0 和 1 来标记整体情绪是积极的、消极的还是中性的。

这是一个很好的观点。这样,你可以训练一个 RNN 来读取序列,并根据单词表示和它们的序列来进行分类。

我想到的模型将从循环层LSTMGRU)开始,它将学习序列信息的表示。稍后,这些信息将传递给密集层,然后可以执行分类任务。


注意 - 我使用 2 列代表 3 个类别(正面、负面或中性)以避免虚拟变量陷阱。

如果您正在使用神经网络,我建议您使用三个输出节点和一个softmax激活函数(用于最后一层)。


但我做得对吗?如果没有,请告诉我如何将上述两者协作,即 NLTK Vader 结果与机器学习分类器。

你的模型可以很好,我只建议潜在的改进。

我建议的另一件事是使用单词嵌入,例如word2vecGlove,而不是单词的 tf-idf 表示。这是因为神经网络喜欢密集向量,而它们往往在稀疏向量(例如 tf-idf)上效果不佳。你可以通过谷歌搜索在线找到预训练的数据集。


祝你任务顺利!