【发布时间】:2014-04-02 19:46:33
【问题描述】:
from __future__ import division
import urllib
import json
from math import log
def hits(word1,word2=""):
query = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=%s"
if word2 == "":
results = urllib.urlopen(query % word1)
else:
results = urllib.urlopen(query % word1+" "+"AROUND(10)"+" "+word2)
json_res = json.loads(results.read())
google_hits=int(json_res['responseData']['cursor']['estimatedResultCount'])
return google_hits
def so(phrase):
num = hits(phrase,"excellent")
#print num
den = hits(phrase,"poor")
#print den
ratio = num / den
#print ratio
sop = log(ratio)
return sop
print so("ugly product")
我需要此代码来计算可用于将评论分类为正面或负面的 Point wise Mutual Information。基本上,我使用的是 Turney(2002):http://acl.ldc.upenn.edu/P/P02/P02-1053.pdf 指定的技术,作为情感分析的无监督分类方法的示例。
正如论文中所解释的,如果一个短语与“poor”这个词的关联度更高,那么它的语义方向就是负面的,如果它与“excellent”这个词的关联度更高,那么它的语义方向就是正面的。
上面的代码计算了一个短语的 SO。我使用谷歌来计算点击次数并计算 SO。(因为现在没有 AltaVista)
计算的值非常不稳定。他们不坚持特定的模式。 例如 SO("ugly product") 结果是 2.85462098541 而 SO("beautiful product") 是 1.71395061117。而前者预计是负面的,而另一个是正面的。
代码有问题吗?有没有一种更简单的方法可以用任何 Python 库(比如 NLTK)计算短语的 SO(使用 PMI)?我尝试了 NLTK,但找不到任何计算 PMI 的显式方法。
【问题讨论】:
-
啊,我有 PMI 的代码,请稍等。一会儿我上传。
标签: python nlp nltk sentiment-analysis