67

我需要一种算法来确定一个句子、段落或文章的语气是消极的还是积极的……或者更好的是,是消极的还是积极的。

例如:

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

Jason 是 SO 用户 (0)

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

Jason 最擅长吸吮 SO (-10)

虽然,在 SO 上还可以,但 Jason 在做坏事方面是最糟糕的(+10)

不容易吧?:)

我不希望有人向我解释这个算法,但我认为在学术界的某个地方已经有很多类似的工作。如果你能指点我一些文章或研究,我会喜欢的。

谢谢。

4

14 回答 14

53

自然语言处理的一个子领域称为情感分析,专门处理这个问题领域。由于在线用户论坛(ugc 或用户生成的内容)对消费产品进行了如此严格的审查,因此该领域已经完成了大量的商业工作。还有一个来自谢菲尔德大学的名为GATE的文本分析原型平台,以及一个名为nltk的 python 项目。两者都被认为是灵活的,但性能不是很高。一个或另一个可能有利于制定你自己的想法。

于 2008-11-15T20:50:55.913 回答
38

在我的公司,我们有一种产品可以做到这一点并且性能也很好。我做了大部分工作。我可以给出一个简单的想法:

您需要将段落拆分为句子,然后将每个句子拆分为更小的子句子 - 根据逗号、连字符、分号、冒号、“和”、“或”等进行拆分。每个子句子将表现出完全独立的情绪在某些情况下。

有些句子即使是分开的,也必须连接在一起。

例如:产品很棒,很棒,很棒。

我们已经制定了一套关于需要拆分和不应该拆分的句子类型的综合规则(基于单词的 POS 标签)

在第一级,您可以使用词袋方法,即含义 - 列出积极和消极的词/短语并检查每个子句。在这样做的同时,还要看看“不”、“不”等否定词,它们会改变句子的极性。

即使那样,如果您找不到情绪,您也可以采用朴素贝叶斯方法。这种方法不是很准确(大约 60%)。但是,如果您仅将其应用于未能通过第一组规则的句子 - 您可以轻松达到 80-85% 的准确率。

重要的部分是正面/负面的单词列表以及你拆分事物的方式。如果你愿意,你甚至可以通过实现HMM(隐马尔可夫模型)或CRF(条件随机场)来达到更高的水平。但我不是 NLP 方面的专家,其他人可能会填补你的空白。

对于好奇的人,我们用 NLTK 和 Reverend Bayes 模块实现了这一切。

非常简单,可以处理大部分句子。但是,您在尝试标记来自网络的内容时可能会遇到问题。大多数人不会在网络上写出正确的句子。处理讽刺也非常困难。

于 2008-12-24T13:41:12.250 回答
9

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

如果您不想解决一个非常复杂的问题,您可以创建“正面”和“负面”单词的列表(如果需要,可以对它们进行加权)并对文本部分进行字数统计。显然,这不是一个“聪明”的解决方案,但它可以通过很少的工作为您提供一些信息,而在这些地方进行严肃的 NLP 将非常耗时。

您的一个示例可能会被标记为正面,而实际上使用这种方法是负面的(“Jason 最擅长吸吮 SO”),除非您碰巧认为“吸吮”比“最佳”更重要......但也是这个是一个小文本样本,如果您正在查看段落或更多文本,那么加权变得更加可靠,除非您有人故意试图欺骗您的算法。

于 2008-11-15T20:21:05.833 回答
5

正如所指出的,这属于自然语言处理下的情感分析。
Afaik GATE 没有任何进行情绪分析的组件。根据我的经验,我已经实现了一种算法,该算法改编自Theresa Wilson、Janyce Wiebe、Paul Hoffmann( this
) 的论文“Recognizing Contextual Polarity in Phrase-Level Sentiment Analysis”中的一个GATE插件,它给出了合理的好结果。如果您想引导实施,它可以帮助您。

于 2008-11-15T21:26:11.693 回答
5

根据您的应用程序,您可以通过贝叶斯过滤算法(通常用于垃圾邮件过滤器)来实现。

一种方法是使用两个过滤器。一个用于正面文件,另一个用于负面文件。您将使用正面文档(无论您使用什么标准)为正面过滤器播种,并为负面文档播种负面过滤器。诀窍是找到这些文件。也许您可以设置它,以便您的用户有效地评价文档。

积极过滤器(一旦播种)将寻找积极的词。也许它会以lovePeace等词结束。负面过滤器也会适当地播种。

设置过滤器后,您可以通过它们运行测试文本以得出正面和负面分数。根据这些分数和一些权重,您可以得出您的数字分数。

贝叶斯过滤器虽然简单,却出奇地有效。

于 2008-11-15T22:08:23.807 回答
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)

最差(-),做坏事(-)。所以,(-) + (-) = (+)

于 2012-02-21T12:33:10.043 回答
1

这种情绪分析有很多机器学习方法。我使用了大部分已经实现的机器学习算法。我用过的案例

weka分类算法

  • 支持向量机
  • 天真无邪
  • J48

    只有您必须根据您的上下文训练模型,添加特征向量和基于规则的调整。就我而言,我得到了一些(61% 的准确率)。所以我们进入了stanford core nlp(他们为电影评论训练了他们的模型),我们使用了他们的训练集并添加了我们的训练集。我们可以达到 80-90% 的准确率。

于 2014-12-19T04:59:26.067 回答
1

这是一个老问题,但我偶然发现了一个可以分析文章语气的工具,并找到了 IBM 的Watson Tone Analyzer。它允许每月免费调用 1​​000 次 API。

于 2016-07-14T21:47:48.770 回答
0

我认为这完全取决于上下文。如果您正在寻找最擅长吸吮 SO 的人。吸吮最好的东西可能是一件积极的事情。为了确定什么是坏的或好的,我可以推荐多少研究模糊逻辑。

这有点像个子高。1.95m的人可以认为是高个子。如果你把那个人放在一个人都超过 2.10m 的组中,他看起来很矮。

于 2008-11-15T20:29:06.677 回答
0

也许论文评分软件可以用来估计语气?有线文章。
可能的参考。(我看不懂。)
这份报告将写作技巧与阅读它所需的 Flesch-Kincaid 年级水平进行了比较!e-
rator 的第 4 页说他们关注拼写错误等。(也许不好的帖子也拼错了!)Slashdot文章。

您还可以使用某种类型的电子邮件过滤器来处理消极性而不是垃圾邮件。

于 2008-11-15T21:12:16.493 回答
0

讽刺又如何:

  • Jason 是我见过的最好的 SO 用户,不是
  • Jason 是我见过的最好的 SO 用户,对吧
于 2008-12-24T13:01:36.717 回答
0

啊,我记得我们评估过的一个名为LingPipe(商业许可证)的Java 库。对于站点上可用的示例语料库,它可以正常工作,但对于真实数据,它非常糟糕。

于 2008-12-24T13:43:24.820 回答
0

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

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

于 2018-11-24T07:09:50.353 回答
-4
   use Algorithm::NaiveBayes;
     my $nb = Algorithm::NaiveBayes->new;

     $nb->add_instance
       (attributes => {foo => 1, bar => 1, baz => 3},
        label => 'sports');

     $nb->add_instance
       (attributes => {foo => 2, blurp => 1},
        label => ['sports', 'finance']);

     ... repeat for several more instances, then:
     $nb->train;

     # Find results for unseen instances
     my $result = $nb->predict
       (attributes => {bar => 3, blurp => 2});
于 2011-08-22T23:49:13.930 回答