我对NLP和情感分析还比较新,但我在学习一门机器学习课程,并且正在创建一个情感分析NLP,它将读取一篇金融文章并确定整体情感是好还是坏。
目前,我有一个大约2000篇文章的数据集。我知道需要实现TF-IDF向量方法,将数据集中的所有实例转换到相同的向量空间中。我也知道TF-IDF需要一个“词汇表”,这个“词汇表”的大小就是向量的长度,每个向量代表一篇文章。
我的问题是,如何确定这个词汇表?我找到的一种方法是进行预处理(去除停用词、噪音词、标点符号等),然后使用训练集中所有文章中的所有词。从这里你可以去除出现次数很少的词(不重要的词)和出现次数太多的词(非区分性的词)。然而,在我看来,“词汇表”仍然会相当大,因此,向量的大小也会非常大。
总体来说,这种方法看似合理,但处理量很大。我觉得最初创建一个包含每篇文章中所有词的“词汇表”将会非常大。然后遍历每篇文章以查看“词汇表”中的词出现的次数将会需要大量的处理能力。如果我使用NLTK和scikit-learn,我有什么需要担心的吗?如果有,更好的创建词汇表的方法是什么?
回答:
情感分析的基本方法包括从训练语料库中创建词汇表,并用它为数据创建特征向量。几十万词的词汇表是很常见的,不必担心。该方法的主要挑战实际上与你所想的相反。你应该寻找增加词汇表大小的方法,而不是减少它。
你可以尝试通过使用其他情感分析词典,如SentiWordNet来增强词汇表。
关于你方法的实现,你可以构建一个scikit管道,使用CountVectorize来构建词汇表和特征向量。使用CountVectorize()构建词汇表的一个优点是它使用稀疏矩阵来构建向量,这解决了你对大小的担忧。然后使用TfIdf Vectorizer计算词频和逆词频,最后使用一个模型进行训练。
考虑在纯词袋之外为你的向量添加更多特征。确保对你的模型和预处理阶段进行网格搜索,以微调参数以获得最佳准确性。我最近做了一个类似的项目,对股票推文数据进行情感分析。我使用了朴素贝叶斯分类器,准确率达到了72%。朴素贝叶斯证明比一些深度学习模型如RNN/DNN分类器还要好。虽然模型选择与你的问题无关,但它是你构建项目的一个组成部分,所以要不断调整直到获得好的结果。如果你想了解我的实现方式,请查看我的项目。
在进行你的项目时,请注意以下几点:
- 一些研究者认为停用词实际上增加了情感的意义,所以我建议在预处理阶段不要去除它们。参见这篇论文
- 在进行情感分析时,始终使用领域知识。一个领域中的负面情感,如“可预测的”电影,在另一个领域如“可预测的”股市中可能是正面的。
- 不要根据频率(如你在问题中提到的)自己从词汇表中去除词。TfIdf标准化就是为了这个目的而设计的。
情感分析领域充满了众多研究和令人兴奋的新技术。我建议你阅读一些这领域先驱者的论文,如这篇。