使用ngram计算句子的情绪分数

时间:2014-08-19 07:19:40

标签: sentiment-analysis

我有一个与每条推文的情感分析有关的问题,或者与使用中的任何句子有关的问题。

我们举一个例子:“这不好玩”

现在我有一个unigram和一个二元组。

单字组 不:-3 好玩:4

两字组 没有乐趣:-3

我的问题是当我在句子中搜索unigram和bigram中的单词时,应该优先选择哪一个?理想情况下,二元组。对?

考虑一个较长的句子,我的程序应该如何编写,以便如果unigram中的单词组合形成一个二元词,则应该优先选择二元组,并且不应包括unigram的情感分数。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您在问题评论中描述的方式有效:

  1. 使用bigrams进行分析
  2. 删除与
  3. 匹配的所有字词
  4. 使用unigrams进行分析
  5. 但它需要修改源代码,并进行两次传递,两者都很慢(为什么,请参阅下面的更新)。

    另一种方法是取你的双字母得分并减去其中单词的单字组得分。在将双字节码加载到内存中时,您可以将其作为预处理步骤执行。所以你的-3“没有乐趣”得分将被修改为 - -3(+3)为“no”,-4为“fun”,净得分为-4。

    现在你可以做一次通过,在同一次传球中分析unigrams和bigrams。

    在句子“这不好玩”:

    • 这:0
    • 这是:0
    • 是:0
    • 是 - 否:0
    • no:-3
    • no-fun:-4
    • 有趣:+4

    总计-3,与你的方法相同。

    这可以扩展到使用n-gram。

    (我不知道我是否读过这个算法,或者为自己解决这个问题,所以我不能告诉你它的正式名称。)

    <强>更新

    以上只是“bigrams,delete_them,unigrams”流程的优化。它总是给出完全相同的结果。

    我提到的修改步骤是预处理二元组分数,从它们的实际值到允许你在一次传递中完成所有事情的分数。 (这样做一次,然后修改的值被缓存,只需要在字典中添加/删除单词时重新计算,或者更改任何情绪值:这通常比使用情绪值分析文本的频率低得多。)

    从你的评论中拿出更长的例子:

      

    “这次这场比赛并不好玩。上一次实际上更有趣。不是吗?”

    在合并传递方法中,求和的值为:

    • no_fun x1 = -4
    • no x2 = -6
    • fun x2 = +8

    总计-2。如果你按照三步法进行,那么bigram pass会给你-3。然后你删除bigram匹配得到:

      

    “这次游戏 _ 。上一次实际上更有趣。不是吗?”

    unigram pass找到一个“fun”(+4)和一个“no”(-3),因此unigram pass的净总数为+1。从bigram传球添加到-3给你-2。即同样的结果,但更多的工作。

    为什么Const更快

    如果许多编译器知道内存块不会改变,他们可以对代码进行额外的优化。但是,更重要的是,它意味着多个线程可以安全地在内存块上运行,而无需锁定它们的访问权限。

    此外,在这种情况下,如果您要修改输入字符串,您很可能会复制它,因为您将要保留原始字符串(例如,用于向用户报告情绪) ,或以后的处理步骤)。因此,通过承诺不修改输入字符串,您可以直接使用它,并保存副本。

    为什么单一通行证更快

    你可能会争辩说,分析unigrams需要相同数量的CPU周期,其次是bigrams,以便在同一个传递中分析两者。这是合理的。但是由于CPU缓存,单次传递更快:如果你有一次通过算法,只需要将内存提取到L1缓存一次以分析所有的n-gram。如果你有两遍算法,它需要被取两次。

    如果你使用常量内存,并意识到你可以在一个线程中使用bigrams,在另一个线程中使用unigrams怎么办?假设两个线程在不同的内核上运行,并假设它们没有以完全相同的速度运行,它们将最终争夺缓存,并继续替换其他缓存条目。它仍然比使用一个线程完成一次传递更快,但速度不会快两倍。