算法用于确定一段语句/文本的情感倾向是积极还是消极

67

我需要一个算法来确定一句话、段落或文章的语气是消极还是积极,或者更确切地说,有多消极或积极。

例如:

Jason是我见过的最差的SO用户(-10)

Jason是一个SO用户(0)

Jason是我见过的最好的SO用户之一(+10)

在SO方面很擅长,但Jason是最糟糕的(-10)

虽然在SO方面表现尚可,但Jason是最烂的(+10)

不容易,对吧? :)

我并不指望有人向我解释这个算法,但我认为学术界已经对这方面做了很多工作。如果你能指引我一些相关的文章或研究,我将不胜感激。

谢谢。


7
在这样的算法中,您将如何处理讽刺或其他复杂的修辞手法?这是否可能? - lprsd
您可以使用nltk的此Web服务(http://corenlp.run/)快速查看数据情感分析的一些结果。但是,此处的情感分类器仅针对Twitter情感和电影评论数据进行了训练。因此,如果您的问题域包含与上述语料库显着不同的单词,则可能无法获得所需的结果。 - sudo
14个回答

55

有一个自然语言处理的子领域叫做情感分析,专门处理这个问题领域。由于消费者产品在在线用户论坛(ugc或用户生成内容)中受到如此大量的评论,因此该领域有相当数量的商业工作。此外还有一种文本分析的原型平台叫做GATE来自谢菲尔德大学,以及一个名为nltk的python项目。两者都被认为是灵活的,但性能不高。其中之一可能适合于实现您自己的想法。


38
在我的公司里,我们有一个产品,它可以做到这一点并且表现良好。我完成了大部分工作。我可以简要介绍一下:
您需要将段落分成句子,然后将每个句子分成更小的子句 - 基于逗号、连字符、分号、冒号、'and'、'or'等进行拆分。 每个子句在某些情况下都会表达完全不同的情感。
有些句子即使被分开,也必须合并在一起。
例如:该产品非常惊人,优秀和棒极了。
我们制定了一套全面的规则,用于确定哪些类型的句子需要拆分,哪些不需要(基于单词的POS标记)
在第一层级上,您可以使用词袋方法,即 - 拥有一个正面和负面单词/短语列表,并检查每个子句。在此过程中,还要注意否定词,例如“not”、“no”等,它们会改变句子的极性。
即使如此,如果您无法找到情感,仍然可以采用naive bayes方法。这种方法并不是非常准确(约为60%)。但是,如果您仅将其应用于未通过第一组规则的句子,您可以轻松获得80-85%的准确性。
重要的部分是正面/负面词汇表以及您分割内容的方式。如果您想,甚至可以通过实现HMM(隐马尔可夫模型)或CRF(条件随机场)来提高一个级别。但我不是自然语言处理专家,其他人可能会告诉您相关部分。
对于好奇的人,我们使用NLTK和Reverend Bayes模块在Python中实现了所有这些。
非常简单,可以处理大多数句子。但是,当尝试标记来自网络的内容时,您可能会遇到问题。大多数人在网络上不写正确的句子。此外,处理讽刺非常困难。

谢谢兄弟,好答案。你能解释一下“朴素贝叶斯”方法吗? - Roshan Dandgavhal
如何将一个句子分成两个独立的句子。例如,Mr. ABC在学习和运动方面都很优秀。可变为:Mr. ABC在学习方面很优秀。Mr. ABC在运动方面也很出色。 - Roshan Dandgavhal

9

这属于自然语言处理的范畴,因此阅读相关内容可能是一个不错的起点。

如果您不想涉及到非常复杂的问题,可以创建“积极”和“消极”单词列表(并根据需要进行加权),并对文本部分进行单词计数。显然,这不是一个“智能”的解决方案,但它可以在很少的工作量下为您提供一些信息,而进行严肃的NLP则需要很多时间。

使用这种方法,您的一个例子可能会被标记为积极,实际上却是消极的(“Jason是SO中最擅长吸氧的人”),除非您恰好将“吸氧”加权更高。“但这也只是一个小的文本样本,如果您正在查看段落或更多的文本,则加权变得更加可靠,除非有人故意试图欺骗您的算法。


谢谢。问题是,我分析的文本不像我的例子那样微妙。例如,我想要能够看出一篇文章对一个主题是中立的、积极的还是消极的。加权词语是不够的。但是,自然语言处理是一个开始。谢谢。 - Jason

5
如上所述,这属于自然语言处理中的情感分析范畴。据我所知,GATE没有任何进行情感分析的组件。根据我的经验,我实现了一种算法,该算法是Theresa Wilson,Janyce Wiebe和Paul Hoffmann在论文“Recognizing Contextual Polarity in Phrase-Level Sentiment Analysis”(链接:this)中的一种改编版本,作为一个GATE插件,能够给出相当不错的结果。如果您想要启动实现,它可能会对您有所帮助。

5

根据您的应用程序,您可以通过贝叶斯过滤算法来完成它(通常在垃圾邮件过滤器中使用)。

一种方法是使用两个过滤器。一个用于正面文档,另一个用于负面文档。您可以用正面文档(无论您使用什么标准)来填充正面过滤器,然后用负面文档填充负面过滤器。诀窍在于找到这些文档。也许您可以设置为让用户有效地评价文档。

正面过滤器(一旦被填充)将寻找积极的词语,也许最终会得出像和平等词语。负面过滤器也会适当地进行填充。

一旦设置好过滤器,您就可以将测试文本通过它们运行,以得出正面和负面分数。基于这些分数和一些加权,您可以得出数字分数。

虽然贝叶斯过滤器很简单,但其效果令人惊讶。


这只是一个小问题,但为什么要“两个过滤器”?它基本上是一个单一的过滤器,将在正面和负面文档上进行训练(和测试),不是吗? - Yaser Sulaiman
我会使用一个包含2个类别的单一过滤器(语料库)来完成它。 - Matthew Lock

3
你可以像这样做:

你可以按照以下步骤操作:

    Jason is the worst SO user I have ever witnessed (-10)

最差情况是负数,其余都是正数。所以,这将是负数加正数等于负数。
    Jason is an SO user (0)

( ) + ( ) = ( )

    Jason is the best SO user I have ever seen (+10)

最好的部分是 (+),其余部分是 ( )。因此,(+)+( )=(+)。
    Jason is the best at sucking with SO (-10)

最好的(+),最差的(-)。因此,(+)+(-)=(-)
    While, okay at SO, Jason is the worst at doing bad (+10)

最差的(-),表现不好(-)。所以,(-)+(-)=(+)。

2
@Faizal:当我的句子是“We would have appreciated better response from Olga”时会发生什么? 根据您的逻辑,它变成了: appreciated(+),better(+)。所以,(+)+(+)=(+)。 - m2pathan
@faizal 你在开玩笑吗?这不会那么简单哈哈。要不考虑一些更简单的东西,比如“Jason 擅长不做坏人”。这里的 better + bad - not -,所以 (+) + (-) + (-) = (-)。 - Aakash Verma

1

这种情感分析有许多机器学习方法。我使用了大部分已经实现的机器学习算法。在我的案例中,我使用了

weka分类算法

  • SVM
  • 朴素贝叶斯
  • J48

    你只需要训练模型以适应你的上下文,添加特征向量和基于规则的调整即可。在我的案例中,我获得了一些(61%的准确率)。因此,我们转向stanford core nlp(他们为电影评论训练了自己的模型),并使用了他们的训练集和我们的训练集。我们可以达到80-90%的准确率。


1
这是一个旧问题,但我在寻找一种可以分析文章语气的工具时发现了IBM的Watson Tone Analyzer。它每月允许免费使用1000个API调用。

0

大多数情感分析工具都是基于词典的,它们中没有一个是完美的。此外,情感分析可以被描述为三元情感分类或二元情感分类。此外,这是一个特定领域的任务。这意味着在新闻数据集上表现良好的工具可能在非正式和非结构化的推文上无法胜任。

我建议使用几种工具,并采用聚合或投票机制来决定情绪的强度。我遇到的最好的情感分析工具调查研究是SentiBench。您会发现它很有帮助。


0

讽刺怎么样:

  • Jason是我见过的最好的SO用户,不是吗
  • Jason是我见过的最好的SO用户,对吧

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接