用于确定语句/文本的正面或负面的算法

时间:2008-11-15 20:14:25

标签: algorithm nlp

我需要一种算法来判断句子,段落或文章的语气是否为正或者是否为正,或者更好,是否为正或负。

例如:

  
    

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

         

Jason是SO用户(0)

         

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

         

Jason最擅长吸食SO(-10)

         

虽然,在SO,Jason是做坏事的最糟糕的(+10)

  

不容易,对吧? :)

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

感谢。

14 个答案:

答案 0 :(得分:48)

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

答案 1 :(得分:34)

在我的公司,我们有一个产品,它做到这一点,也表现良好。我完成了大部分工作。我可以简单介绍一下:

你需要将段落分成句子,然后将每个句子分成较小的子句 - 基于逗号,连字符,半冒号,冒号,'和','或'等分割。 在某些情况下,每个子句都会表现出完全独立的情绪。

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

例如:该产品令人惊叹,非常棒且非常棒。

我们已经针对需要拆分的句子类型制定了一套全面的规则,这些规则不应该(基于单词的POS标签)

在第一级,你可以使用一袋词的方法,意思是 - 有一个正面和负面的单词/短语列表,并检查每个子句。在这样做的同时,还要看“否”,“否”等否定词会改变句子的极性。

即便如此,如果找不到情绪,也可以采用naive bayes方法。这种方法不是很准确(约60%)。但是如果你只将这个应用于不能通过第一套规则的句子 - 你可以轻松达到80-85%的准确率。

重要的部分是积极/消极的单词列表以及你分开的方式。如果您愿意,可以通过实施HMM(隐藏马尔可夫模型)或CRF(条件随机字段)来提高水平。但我不是NLP的专业人士而且其他人可能会填补你那个部分。

对于好奇的人,我们实现了所有这些是使用NLTK和Reverend Bayes模块的python。

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

答案 2 :(得分:8)

这属于Natural Language Processing的保护伞,因此阅读相关内容可能是一个很好的起点。

如果您不想解决一个非常复杂的问题,您可以创建“正面”和“负面”单词列表(并根据需要加权)并对文本部分进行单词计数。显然,这不是一个“智能”的解决方案,但它可以为您提供一些非常少的工作信息,在这些工作中,做严肃的NLP会非常耗时。

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

答案 3 :(得分:5)

正如所指出的,这是在自然语言处理下的情绪分析。
Afaik GATE没有任何进行情绪分析的组成部分。
根据我的经验,我已经实现了一种算法,该算法改编自Theresa Wilson,Janyce Wiebe,Paul Hoffmann(this)作为GATE插件的文章“在短语级别情感分析中识别语境极性”。 ,这给出了合理的好结果。如果你想引导实现它可以帮助你。

答案 4 :(得分:5)

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

一种方法是使用两个过滤器。一个用于正面文档,另一个用于负面文档。您可以使用正文档(使用的任何条件)和带有负文档的负过滤器为正过滤器播种。诀窍是找到这些文件。也许您可以设置它,以便您的用户有效地评估文档。

正滤波器(曾经播种过)会寻找正面的话。也许它最终会出现像 love peace 等词。负面过滤器也会被适当播种。

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

贝叶斯过滤器虽然简单,却令人惊讶地有效。

答案 5 :(得分: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)

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

答案 6 :(得分:1)

这种情感分析有很多机器学习方法。我使用了大多数已经实现的机器学习算法。我的情况我用过

weka分类算法

  • SVM
  • 天真的基础
  • J48

    只有您必须这样做才能将模型训练到您的上下文中,添加特色向量和基于规则的调整。在我的情况下,我得到了一些(准确率为61%)。所以我们进入stanford core nlp(他们训练他们的电影评论模型),我们使用他们的训练集并添加我们的训练集。我们可以达到80-90%的准确率。

答案 7 :(得分:1)

这是一个老问题,但我碰巧找到了一个可以分析文章基调的工具,并由IBM发现了Watson Tone Analyzer。它允许每月免费拨打1000个api电话。

答案 8 :(得分:0)

我认为这完全取决于背景。如果你正在寻找那些最擅长吸食SO的人。吸吮最好的东西可能是一件好事。用于确定什么是坏的或好的以及我可以建议多大程度地研究模糊逻辑。

有点像高个子。身高1.95米的人可以认为身材高大。如果你把这个人放在一个人群超过2.10米的小组中,他看起来很短。

答案 9 :(得分:0)

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

你也可以使用某种类型的电子邮件过滤器来消极而不是垃圾邮件。

答案 10 :(得分:0)

讽刺:

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

答案 11 :(得分:0)

啊,我记得我们评估的一个名为LingPipe(商业许可证)的java库。它可以在网站上提供的示例语料库中正常工作,但对于真实数据来说,它非常糟糕。

答案 12 :(得分:0)

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

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

答案 13 :(得分:-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});