У меня есть сайт (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:
Глядя на список как человек, вам не нужно знать, что это за книги, чтобы увидеть, что, скорее всего, список посвящен научной фантастике и фэнтези. Это в основном потому, что глаз хорошо отбрасывает бессмысленные категории, такие как «пользовательские магазины» и «полная художественная литература».
Я пробовал дедупликацию списка категорий или просмотр только категорий, которые появляются для всех 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 Рассказы