对大量在线对话文本的情感分析
标题已经说得很清楚了;我有一个SQL数据库,里面存满了在线对话的文本。我已经用Python做了这个项目的大部分工作,所以我想用Python的NLTK库来完成这个(除非有很强的理由不这样做)。
这些数据是按主题、用户名和帖子来组织的。每个主题大致上都是围绕我想分析的某个“产品”进行讨论的。最终,当这个项目完成时,我希望能得到每个用户对他们讨论过的任何产品的一个大致看法(比如喜欢或不喜欢)。
所以,我想知道:
1) 我该如何确定每个主题讨论的是什么产品?我在阅读关于关键词提取的内容……这是正确的方法吗?
2) 我如何根据用户的帖子来判断他们的情感?根据我有限的理解,我必须先“训练”NLTK,让它识别某些意见的指示词,然后我是不是只需要在文本中判断这些词出现时的上下文?
正如你们现在可能猜到的,我之前没有接触过自然语言处理(NLP)。根据我到目前为止的阅读,我觉得我可以学会它。如果有人能给我指个方向,即使只是一个基本的、粗略的工作模型也很好。谷歌对我帮助不大。
附言:我有权限分析这些数据(如果这很重要的话)
2 个回答
你可以用类似的数据集来训练任何分类器,然后看看当你把它应用到自己的数据上时,结果会怎么样。例如,NLTK里面有一个叫做电影评论语料库的东西,里面有1000条正面评论和1000条负面评论。这里有一个关于如何用这些评论训练朴素贝叶斯分类器的例子。还有一些其他的评论数据集,比如亚马逊的产品评论数据,你可以在这里找到。
另一种方法是找一份正面和负面词汇的列表,比如这个,然后在你的数据集中统计这些词出现的频率。如果你想要一份完整的列表,可以使用SentiWordNet。
训练任何分类器都需要一个训练集,也就是带有标签的数据,还有一个特征提取器,用来为每个文本获取特征集。一旦你训练好了分类器,就可以把它应用到之前没见过的文本(没有标签的)上,根据使用的机器学习算法来进行分类。NLTK提供了很好的解释和一些可以尝试的示例。
如果你想建立一个用于判断正面或负面情感的分类器,并且使用自己的训练数据集,我建议不要仅仅依靠简单的关键词计数,因为这样做有很多不准确的地方(比如,否定正面词汇:“不快乐”)。一种替代方法是远程监督。简单来说,这种方法使用表情符号或其他特定的文本元素作为噪声标签。你仍然需要选择哪些特征是相关的,但很多研究表明,仅仅使用单词或双词组(分别是单个单词或两个单词的组合)就能取得不错的效果。
所有这些操作在Python和NLTK中都相对简单。你还可以选择使用像NLTK-trainer这样的工具,它是NLTK的一个封装,代码量更少。
我认为Go等人的这项研究是最容易理解的之一。你还可以阅读其他关于远程监督、远程监督情感分析和情感分析的研究。
NLTK中有一些内置的分类器,包含训练和分类的方法(比如朴素贝叶斯、最大熵等),但如果你对使用支持向量机(SVM)感兴趣,就需要去其他地方找资料。技术上NLTK提供了一个SVM类,但它实际上只是对PySVMLight的封装,而后者又是对用C语言编写的SVMLight的封装。不过我在使用这个方法时遇到了很多问题,所以我更推荐LIBSVM。
在确定主题时,很多人使用简单的关键词,但也有一些更复杂的方法可以使用。