我有一个与每条推文的情感分析有关的问题,或者与使用中的任何句子有关的问题。
我们举一个例子:“这不好玩”
现在我有一个unigram和一个二元组。
单字组 不:-3 好玩:4
两字组 没有乐趣:-3
我的问题是当我在句子中搜索unigram和bigram中的单词时,应该优先选择哪一个?理想情况下,二元组。对?
考虑一个较长的句子,我的程序应该如何编写,以便如果unigram中的单词组合形成一个二元词,则应该优先选择二元组,并且不应包括unigram的情感分数。
有什么想法吗?
答案 0 :(得分:1)
您在问题评论中描述的方式有效:
但它需要修改源代码,并进行两次传递,两者都很慢(为什么,请参阅下面的更新)。
另一种方法是取你的双字母得分并减去其中单词的单字组得分。在将双字节码加载到内存中时,您可以将其作为预处理步骤执行。所以你的-3“没有乐趣”得分将被修改为 - -3(+3)为“no”,-4为“fun”,净得分为-4。
现在你可以做一次通过,在同一次传球中分析unigrams和bigrams。
在句子“这不好玩”:
总计-3,与你的方法相同。
这可以扩展到使用n-gram。
(我不知道我是否读过这个算法,或者为自己解决这个问题,所以我不能告诉你它的正式名称。)
<强>更新强>
以上只是“bigrams,delete_them,unigrams”流程的优化。它总是给出完全相同的结果。
我提到的修改步骤是预处理二元组分数,从它们的实际值到允许你在一次传递中完成所有事情的分数。 (这样做一次,然后修改的值被缓存,只需要在字典中添加/删除单词时重新计算,或者更改任何情绪值:这通常比使用情绪值分析文本的频率低得多。)
从你的评论中拿出更长的例子:
“这次这场比赛并不好玩。上一次实际上更有趣。不是吗?”
在合并传递方法中,求和的值为:
总计-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怎么办?假设两个线程在不同的内核上运行,并假设它们没有以完全相同的速度运行,它们将最终争夺缓存,并继续替换其他缓存条目。它仍然比使用一个线程完成一次传递更快,但速度不会快两倍。