Делайте что-то значимое с помощью Amazon BrowseNodes API

У меня есть сайт (www.7bks.com), где люди создают списки книг. На данный момент это довольно просто. Я уже использую Amazon API для загрузки информации о книгах, изображений и т. д. на сайт.

Что я хотел бы сделать, так это каким-то образом использовать Amazon API для извлечения данных категории и/или тега, чтобы создать какой-то способ просмотра списков на моем сайте. К сожалению, метод tag api больше не поддерживается.

Наиболее вероятным кандидатом является метод BrowseNodes API Amazon (http://docs.amazonwebservices.com/AWSEcommerceService/2005-10-05/ApiReference/BrowseNodesResponseGroup.html), но данные, возвращаемые этим вызовом, довольно бессмысленны, и я надеялся, что мы сможем собраться вместе и понять, как это понять.

Вот таблица Google, чтобы показать вам, какие данные я получаю. Я выбрал примерный список (http://www.7bks.com/list/549002). и запустил три книги через BrowseNodes API:

https://spreadsheets.google.com/ccc?key=0ApVjkgehRamudHd5SlNhYllPQkZDSDY1cllfQVBQM1E&hl=en&authkey=CN_MxoAO

Глядя на список как человек, вам не нужно знать, что это за книги, чтобы увидеть, что, скорее всего, список посвящен научной фантастике и фэнтези. Это в основном потому, что глаз хорошо отбрасывает бессмысленные категории, такие как «пользовательские магазины» и «полная художественная литература».

Я пробовал дедупликацию списка категорий или просмотр только категорий, которые появляются для всех 3 книг, но это все еще довольно дерьмовые данные. Мне бы хотелось, чтобы вы подумали о том, как я могу превратить эти данные во что-то значимое для пользователей.

Моя лучшая мысль до сих пор — просто сканировать данные и сопоставлять их с жестко закодированным списком. Итак, что-то вроде:

если Count("научная фантастика и фэнтези") > 3, то список является научной фантастикой, если Count("бизнес, финансы и право") > 3, то список является бизнесом

и Т. Д.

Однако это очень жестко, и в идеале я хотел бы создать что-то более гибкое/мощное.

Все предложения приветствуются.

Я думаю, что это вопрос высокого уровня, поэтому на него не должно влиять то, КАК я вызываю API, но для справки я использую Python/Appengine/Webapp.

Спасибо

Том

ОБНОВЛЕНИЕ после долгих ударов головой о стол мне удалось исправить эту проблему к моему удовлетворению. Это не так сложно, но я собрал некоторый код Python, который делает то, что я хочу. Я приветствую всех, кто улучшает мой код или предлагает предложения.

В основном логика, лежащая в основе кода, такова: 1) В дереве XML нижний узел узла, который начинается (книги > темы), является лучшим предположением о том, о чем книга на самом деле. Например. для этого: http://www.amazon.co.uk/Surface-Detail-Iain-M-Banks/dp/1841498939/ возвращает «научную фантастику». Бинго. 2) Обычно много полезной информации выбрасывается, когда мы ограничиваемся только теми результатами, которые начинаются (книги > предмет). Поэтому 3) я пытаюсь получить список похожих книг и вытащить из них категории, если это не удается, я просто получаю категорию, назначенную исходной книге.

Возможно, лучше всего объяснить, предоставив вам код следующим образом:

#takes as input the xml output of the amazon api browsenodes call
def getcategories(xml):
    #fetches the names of all the nodes, stores them in a list
    categories = []              
    for book in xml.getElementsByTagName('BrowseNode'):
        category = get_text(book,'Name')
        categories.append(category)

    #turn the one list into a series of individual lists
    #each individual list should be a particular tree from browsenode
    #each list will end 'Books'
    #the first item in the list should be the bottom of the tree
    taglists = []
    while 'Books' in categories:
        find = categories.index('Books') + 1
        list = categories[:find]
        taglists.append(list)
        for word in list:
            categories.remove(word)

    #now, we only return the first item from a list which contains 'Subjects'        
    final = []    
    for tagset in taglists:
        while 'Subjects' in tagset:
            final.append(tagset[0])
            tagset.pop(tagset.index('Subjects'))
    return final

class Browsenodes(webapp.RequestHandler):
    def get(self):
        #get the asin of the target book
        asin = self.request.get('term')
        if book_title:
            #fetch the amazon key
            api = API(AWS_KEY, SECRET_KEY, 'uk', processor=minidom_response_parser)
            try:
                #try getting a list of similar books - note the response group set to browsenodes
                result = api.similarity_lookup(asin, ResponseGroup='BrowseNodes')
            except:
                #there aren't always a list of similar books, so as a failsafe just get the book I wanted.
                result = api.item_lookup(asin, ResponseGroup='BrowseNodes')
            final = getcategories(result)
            #turn it into a set to de-dupe multiple listings of the same category
            self.response.out.write(set(final))

Чтобы дать вам представление о выходе:

Книга: http://www.amazon.co.uk/Surface-Detail-Iain-M-Banks/dp/1841498939/

Теги: Современная художественная продукция Космическая опера Научная фантастика

http://www.amazon.co.uk/Godel-Escher-Bach-Eternal-anniversary/dp/0140289208/ Психология История математики Математическая логика Общее AAS Популярная математика Научная, техническая и медицинская Искусство и музыка Философия разума Амазонская математика Архитектура и логика Современная философия: 1900- Логика Классика Физика Метафизика Философия физики Общие технологии Алгебраика Теория чисел Искусственный интеллект История науки

http://www.amazon.co.uk/Flatland-Romance-Dimensions-Dover-Thrift/dp/048627263X/ Современная художественная литература Философия математики Общая AAS Популярная математика Философия Научная, техническая и медицинская философия разума Научная фантастика Математика Современная философия: 1900- Алгебраическая теория чисел Продукты Классика Метафизика и визионерство Мифы и сказки Топология Общие темы Общие теоретические методы Метафизика Искусственный интеллект История науки

http://www.amazon.co.uk/Victoria-Condor-Books-Knut-Hamsun/dp/0285647598/ Современная художественная литература Художественная литература Психологическая Общая классика AAS Рассказы


person tomcritchlow    schedule 09.01.2011    source источник


Ответы (2)


Моя лучшая мысль до сих пор — просто сканировать данные и сопоставлять их с жестко запрограммированным списком. Итак, что-то вроде:

если Count(научная фантастика и фэнтези) › 3, то список – это научная фантастика, если Count(бизнес, финансы и право) › 3, то список – это бизнес

Я думаю, это может быть не плохой идеей? Возьмите категории книг высшего уровня с Amazon и просто сопоставьте их. Это не очень элегантно, но сработает.

В качестве альтернативы вы могли бы использовать данные dc:subject из API Google Книг. ? (Я не использовал его, так что это тоже может быть мусором).

person Adam Taylor    schedule 09.01.2011

Хм.. Во-первых, текущий APi датирован 01.08.2011. может быть, вы могли бы сделать себе одолжение, просмотрев актуальную документацию? API рекламных продуктов

Для меня XML имеет большой смысл!

Может быть, потому что, когда я хочу правильно понять один из этих ответов, я копирую XML в XML-редактор Visual Studio, где я могу открывать и закрывать узлы.

Структура примерно такая:

  <BrowseNodes>
    <BrowseNode>...</BrowseNode>
      <BrowseNode>...</BrowseNode>
      <BrowseNode>...</BrowseNode>
      <BrowseNode>...</BrowseNode>
    </BrowseNodes>

Затем внутри каждого BrowseNode это будет примерно так:

<BrowseNode>
      <BrowseNodeId>10399</BrowseNodeId>
      <Name>Classics</Name>
      <Ancestors>
        <BrowseNode>
          <BrowseNodeId>17</BrowseNodeId>
          <Name>Literature &amp; Fiction</Name>
          <Ancestors>
            <BrowseNode>
              <BrowseNodeId>1000</BrowseNodeId>
              <Name>Subjects</Name>
              <IsCategoryRoot>1</IsCategoryRoot>

Обратите внимание на «IsCategoryRoot»? Нет точек выше, чем это, так как это настолько общее, что не имеет смысла его использовать. Название «Темы» для книг, но «Категории» для электронных книг, поэтому, кажется, имеет больше смысла проверять элемент «IsCategoryRoot».

Я не уверен на 100%, что вы хотите сделать, и я не очень хорошо знаю python, но я знаю базы данных... Я бы получил книжный идентификатор ASIN (который уникален во всем мире для amazon, что означает, что вы можете искать то же самое, что и на amazon.com, а также co.uk, fr, de и т. д.), поместите в таблицу вместе с любыми другими данными, которые вы считаете полезными, создайте таблицы для категорий, поместите туда их имена и идентификаторы, затем одна таблица ссылок с одной записью для каждого BrowseNode более низкого уровня, с BrowseNodeID и ASIN книги, затем для вложенного узла просмотра (который на самом деле является родителями или предками), поместите как их дочерний идентификатор, так и их собственный . Очевидно, что перед вставкой этих категорий я бы проверил, что они еще не существуют.

Цель здесь состоит в том, чтобы иметь одну запись на книгу, одну запись на категорию и столько ссылок между категориями и книгами, сколько необходимо.

Таким образом, было бы очень легко искать книги по категориям и наоборот.

Извините, если я был немного длинным, но нет короткого ответа на ваш вопрос. Надеюсь это поможет.

Бернар

person BernardG    schedule 02.05.2013