【问题标题】:Algorithm to determine how positive or negative a statement/text is确定语句/文本的积极或消极程度的算法
【发布时间】:2010-09-22 12:31:48
【问题描述】:

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

例如:

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

Jason 是 SO 用户 (0)

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

Jason 最擅长吸吮 SO (-10)

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

不容易吧? :)

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

谢谢。

【问题讨论】:

  • 您将如何处理此类算法中的讽刺或其他复杂的修辞格?有可能吗?
  • 您可以通过 nltk corenlp.run 快速查看使用此 Web 服务对您的数据进行的一些情绪分析结果。但是这里的情绪分类器只在 Twitter 情绪和电影评论数据上进行训练。因此,如果您的问题域包含与上述语料库显着不同的单词,您可能不会得到想要的结果。

标签: algorithm nlp


【解决方案1】:

这属于Natural Language Processing 的保护伞,因此阅读它可能是一个不错的起点。

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

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

【讨论】:

  • 谢谢。问题是,我正在分析的文本不像我的例子那么微妙。例如,我希望能够查看一篇文章对于某个主题是中性的、正面的还是负面的。加权的话是不够的。 ;( 但是,自然语言处理是一个开始。谢谢。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      您还可以使用某种形式的电子邮件过滤器来处理负面信息,而不是垃圾邮件。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          肯定过滤器(一旦播种)会寻找肯定的词。也许它会以 lovepeace 等词结束。负面过滤器也会适当地播种。

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

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

          【讨论】:

          • 这只是一个小问题,但为什么要“两个过滤器”呢?它基本上是一个单一的过滤器,将在正面和负面文档上进行训练(和测试),不是吗?
          • 我会怎么做。
          【解决方案7】:

          讽刺又如何:

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

          【讨论】:

            【解决方案8】:

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

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

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

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

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

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

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

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

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

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

            【讨论】:

            • 谢谢兄弟很好的回答。你能解释一下“朴素贝叶斯”的方法吗?
            • 如何从一个句子中创建两个单独的句子。例如。 abc先生擅长学习和运动。 abc先生学习好,abc先生运动好吗
            【解决方案9】:

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

            【讨论】:

              【解决方案10】:
                 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});
              

              【讨论】:

              • -1 用于复制/粘贴 Algorithm::NaiveeBayes 手册页而不将其连接到原始问题。
              【解决方案11】:

              你可以这样做:

                  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)
              

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

              【讨论】:

              • @Faizal:当我的句子是“我们会很感激奥尔加更好的回应”时会发生什么?根据您的逻辑,它变成:赞赏(+),更好(+)。所以,(+) + (+) = (+)
              • @faizal 你在开玩笑吗?不会那么简单哈哈。像“杰森更擅长不做坏人”这样更简单的东西呢?这里更好+坏-不是-,所以(+)+(-)+(-)=(-)
              【解决方案12】:

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

              weka分类算法

              • 支持向量机
              • 天真的基础
              • J48

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

              【讨论】:

                【解决方案13】:

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

                【讨论】:

                  【解决方案14】:

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

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2022-08-08
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-02-20
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-11-08
                    相关资源
                    最近更新 更多