Невозможно итеративно вызвать API экстракта терминов Yahoo с помощью Python - PullRequest
2 голосов
/ 03 сентября 2011

Я пытаюсь перебрать 50 с лишним файлов в каталоге. В каждом файле есть текст, для которого я пытаюсь найти ключевые слова, используя Yahoo Term Extractor . Я могу извлечь текст из каждого файла, но я не могу итеративно вызывать API, используя текст в качестве входных данных. Отображаются только ключевые слова для первого файла.

Вот мой фрагмент кода: в списке «комментарии» я извлек и сохранил текст из каждого файла.

for c in comments:

    print "building query"
    dataDict = [ ('appid', appid), ('context', c)]
    queryData = urllib.urlencode(dataDict)
    request.add_data(queryData)
    print "fetching result"
    result = OPENER.open(request).read()
    print result
    time.sleep(1)

1 Ответ

1 голос
/ 07 сентября 2011

Ну, я ничего не знаю о Yahoo Term Extractor, но я бы предположил, что ваш вызов request.add_data(queryData) просто связывает другой набор данных с каждой итерацией вашего цикла. И тогда вызов OPENER.open(request).read(), вероятно, будет обрабатывать только результаты первого набора данных. Таким образом, либо ваш request объект может содержать только один запрос, либо внутренняя работа вашего OPENER объекта может обрабатывать только один запрос, это так просто.

На самом деле, третья причина приходит мне на ум, когда я читаю документацию, предоставленную по вашей ссылке, и, вероятно, это истинная причина:

RATE LIMITS

Срок службы извлечения ограничен 5000 запросами на IP-адрес в день и некоммерческим использованием. См. Информацию об ограничении скорости.

Поэтому имеет смысл, что API будет ограничивать ваше использование одним запросом за раз и не позволит вам объединять несколько запросов в одном запросе.

В любом случае, я бы предположил, что вы можете исправить свою проблему "наивным" способом, используя множество request переменных вместо одной, или, возможно, просто создавая новый запрос на каждой итерации цикла. Если вы не беспокоитесь о сохранении своих результатов и просто пытаетесь отладить, вы можете попробовать:

for c in comments:
    print "building query"
    dataDict = [ ('appid', appid), ('context', c)]
    queryData = urllib.urlencode(dataDict)
    request = urllib2.Request() # I don't know how to initialize this variable, do it yourself
    request.add_data(queryData)
    print "fetching result"
    result = OPENER.open(request).read()
    print result
    time.sleep(1)

Опять же, я не знаю об Yahoo Term Extractor (и при этом у меня нет времени исследовать его), поэтому вполне может быть лучший, более естественный способ сделать это. Если вы опубликуете более подробную информацию о вашем коде (то есть, из каких классов поступают объекты request и OPENER), я мог бы уточнить это.

...