我刚刚观看了 Google I/O 2010 的 App Engine 会话的批处理数据处理,阅读了Google Research的 MapReduce 文章的部分内容,现在我正在考虑在 Google App Engine 上使用 MapReduce来在 Python 中实现推荐系统。
我更喜欢使用 appengine-mapreduce 而不是 Task Queue 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
不是 appengine-mapreduce 中的有效 Mapper,而且这个函数甚至可能与 MapReduce 计算概念不兼容。然而,我需要确定……拥有 appengine-mapreduce 的优势,比如自动批处理和任务链,对我来说真的很棒。
有什么解决办法吗?
我应该定义自己的 InputReader 吗?读取两种不同类型的所有实例的新 InputReader 是否与当前的 appengine-mapreduce 实现兼容?
或者我应该尝试以下方法?
- 将这两种所有实体的所有键两两组合成一个新模型的实例(可能使用 MapReduce)
- 使用映射器对这个新模型的实例进行迭代
- 对于每个实例,使用其中的键来获取不同种类的两个实体并计算它们之间的相关性。