Я только что наблюдал Пакетная обработка данных с помощью сеанса App Engine Google I / O 2010 , прочитал некоторые части статьи MapReduce из Google Research и теперь я думаю использовать MapReduce в Google App Engine для реализации системы рекомендаций в Python.
Я предпочитаю использовать appengine-mapreduce вместо API очереди задач, потому что первый предлагает легкую итерацию для всех экземпляров какого-либо вида, автоматическое пакетирование, автоматическое объединение задач и т. Д. Проблема заключается в том, что моя система рекомендаций должна рассчитывать корреляцию между экземплярами две разные модели, т. е. экземпляры двух разных видов.
Пример:
У меня есть эти две модели: пользователь и элемент. Каждый из них имеет список тегов в качестве атрибута. Ниже приведены функции для расчета корреляции между пользователями и предметами. Обратите внимание, что 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)
- Выполните итерацию с использованием картографов для экземпляров этой новой модели
- Для каждого экземпляра используйте ключи внутри него, чтобы получить два разных типа объектов и вычислить корреляцию между ними.