Я только что просмотрел Пакетную обработка данных с помощью сеанса App Engine Google I/O 2010, прочитать некоторые части MapReduce статью из Google Research, и теперь я думаю использовать MapReduce в Google App Engine для реализации рекомендательной системы в Python.
Я предпочитаю использовать appengine-mapreduce вместо Task Queue API, потому что первый предлагает простую итерацию по всем экземплярам какого-либо типа, автоматическую пакетную обработку, автоматическую цепочку задач и т. д. Проблема в том, что моей рекомендательной системе необходимо вычислить корреляцию между экземплярами двух разных моделей. , т. е. экземпляры двух различных видов.
Пример: у меня есть две модели: User и Item. Каждый из них имеет список тегов в качестве атрибута. Ниже приведены функции для расчета корреляции между пользователями и элементами. Обратите внимание, что calculateCorrelation
следует вызывать для каждой комбинации пользователей и элементов:
def calculateCorrelation(user, item):
return calculateCorrelationAverage(u.tags, i.tags)
def calculateCorrelationAverage(tags1, tags2):
correlationSum = 0.0
for (tag1, tag2) in allCombinations(tags1, tags2):
correlationSum += correlation(tag1, tag2)
return correlationSum / (len(tags1) + len(tags2))
def allCombinations(list1, list2):
combinations = []
for x in list1:
for y in list2:
combinations.append((x, y))
return combinations
Но этот calculateCorrelation
не является действительным Mapper в appengine-mapreduce, и, возможно, эта функция даже не совместима с концепцией вычислений MapReduce. Тем не менее, я должен быть уверен... для меня было бы очень здорово иметь такие преимущества appengine-mapreduce, как автоматическая пакетная обработка и цепочка задач.
Есть ли решение для этого?
Должен ли я определить свой собственный InputReader? Новый InputReader, который считывает все экземпляры двух разных типов, совместим с текущей реализацией appengine-mapreduce?
Или мне попробовать следующее?
- Объедините все ключи всех сущностей этих двух типов, по два, в экземпляры новой Модели (возможно, используя MapReduce)
- Итерация с использованием картографов по экземплярам этой новой модели
- Для каждого экземпляра используйте ключи внутри него, чтобы получить две сущности разных типов и вычислить корреляцию между ними.
calculateCorrelation
следует вызывать для каждой комбинации пользователя и элемента. А теперь я убрал типы переменных, чтобы не было путаницы. - person fjsj   schedule 24.09.2010