使用TF-IDF矢量大小的NLP情感分析

时间:2018-04-17 06:58:23

标签: python machine-learning nlp sentiment-analysis tf-idf

我对NLP&情绪分析,但我参加了机器学习课程,并创建了一个情感分析NLP,它将阅读一篇金融文章,并确定整体情绪是好还是坏。

目前,我有一篇约2000篇文章的数据集。我知道我需要实现TF-IDF向量方法将数据集中的所有实例转换为相同的向量空间。另外,我知道TF-IDF需要一个“词汇表”,这个“词汇表”的大小是矢量的长度,每个矢量代表一篇文章。

我的问题是,如何确定这个词汇?我发现的一种方法是实现预处理(去除停用词,嘈杂的单词,标点符号等),然后在训练集中的每篇文章中使用所有单词。从这里你可以删除具有非常少的实例(不重要的单词)的单词并删除具有太多实例的单词(无区别单词)。但是,在我看来,“词汇”仍然会很大,因此,矢量大小会非常大。

总的来说,这种方法似乎合乎逻辑,但处理繁重。我觉得最初创建一个包含每篇文章中所有单词的“词汇表”将是巨大的。然后遍历每篇文章,看看“词汇”中的单词出现了多少次,需要大量的处理能力。如果我使用NLTK和scikit-learn,我有什么需要担心的吗?如果是这样,是否有更好的方法来创建词汇表?

2 个答案:

答案 0 :(得分:0)

首先,我不认为你有什么值得担心的。这些库用于处理这些(实际上甚至更大的)数据库。有些方法读取了英文维基百科的所有页面,因此2000篇文章似乎很容易。

有一些方法可以创建更小,更有效的词汇表来描述每个单词。例如,你可以检查"字到vec"这是NLP的一个非常重要的部分。我甚至建议在你的情况下使用它,因为它往往在情绪分析等任务中有更好的结果(但是如果课程专门教授TF-IDF,那么我显然撤回了这个建议)。

如果你的词汇量对你来说太大了,你也可以选择不同的词干分析器(你在预处理阶段使用什么去除词语中的词汇)。虽然最常用的干扰器是" Snowball"," Lancaster"更具攻击性(因此会减少单词之间的差异)。您可以在此处阅读:What are the major differences and benefits of Porter and Lancaster Stemming algorithms?

享受了解NLP,这是一个了不起的主题:)

答案 1 :(得分:0)

情感分析的基本方法,包括从训练语料库中创建词汇表,并使用它来为您的数据制作特征向量。一个大到几十万字的词汇是很常见的,没有什么可担心的。这种方法的主要挑战实际上与您的想法相反。您应该找到增加词汇量而不是减少词汇量的方法。

您也可以尝试使用其他情感分析词典来增强词汇量,例如SentiWordNet

就您的方法的实现而言,您可以构建一个包含CountVectorize的scikit管道来构建词汇和特征向量。使用CountVectorize()构建词汇表的一个优点是它使用稀疏矩阵来构建处理大尺寸问题的向量。然后使用TfIdf Vectorizer计算术语频率和反向术语频率,最后使用训练模型。

除了纯粹的文字之外,请考虑为您的矢量添加更多功能。请务必在模型和预处理阶段执行GridSearch以微调参数以获得最佳精度。我最近做了一个关于stocktwits数据情绪分析的类似项目。我使用了Naive Bayes分类器,准确度达到了72%。事实证明,朴素贝叶斯甚至比RNN / DNN分类器等深度学习模型更好。模型选择虽然与您的问题无关,但却是构建项目不可或缺的一部分,因此请不断调整以获得良好的结果。如果您想了解我的实施情况,请查看我的project

在执行项目时请注意以下几点:

  • 一些研究人员认为,停用词实际上增加了情绪的意义所以我建议不要在预处理阶段删除它们。请参阅this paper
  • 在进行情绪分析时始终使用领域知识。像“可预测的电影”这样的一个领域的负面情绪在其他类似“可预测的股票市场”中可能是积极的。
  • 不要从词汇表中删除您自己的单词(根据您在问题中提到的频率)。 TfIdf标准化仅用于此目的。

情感分析领域充满了大量的研究和激动人心的新技术。我建议你阅读这个领域的先驱者的this等论文。