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 в качестве примера для неконтролируемого метода классификации для анализа настроений.
Как объясняется в статье, семантическая ориентация фразы отрицательна, если фраза более тесно связана со словом "бедный" и положительным, если она более сильно связана со словом "отлично".
В приведенном выше коде вычисляется SO фразы. Я использую Google для вычисления количества обращений и вычисления SO. (Поскольку AltaVista теперь не существует)
Вычисленные значения очень неустойчивы. Они не придерживаются определенного шаблона. Например, SO ( "уродливый продукт" ) получается 2,85462098541, тогда как SO ( "прекрасный продукт" ) - 1,71395061117. В то время как первый, как ожидается, будет отрицательным, а другой положительным.
Что-то не так с кодом? Есть ли более простой способ вычисления SO фразы (с использованием PMI) с любой библиотекой Python, скажем, NLTK? Я попробовал NLTK, но не смог найти какой-либо явный метод, который вычисляет PMI.