我刚才看了Batch data processing with App Engine session of Google I/O 2010,读了MapReduce article from Google Research的一些部分,现在我考虑使用MapReduce on Google App Engine在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
但是在appengine mapreduce中,calculateCorrelation
不是一个有效的映射器,并且可能这个函数甚至与mapreduce计算概念不兼容。但是,我需要确定。。。对于我来说,拥有appengine mapreduce的那些优点,比如自动批处理和任务链接,那将是非常棒的。在
有什么解决办法吗?
我应该定义自己的InputReader吗?读取两种不同类型的所有实例的新InputReader是否与当前的appengine mapreduce实现兼容?在
还是我应该试试下面的方法?
按照尼克·约翰逊的建议,我写了我自己的InputReader。这个读取器从两种不同的类型获取实体。它生成包含这些实体的所有组合的元组。这里是:
当您需要处理两种实体的所有组合时,应使用此代码。您也可以将此代码推广到两种以上的实体。在
这是一个有效的地图还原.yaml对于
^{pr2}$TwoKindsInputReader
:如果没有更详细的计算结果,很难知道推荐什么。一个简单的选择是简单地在map调用中获取相关的实体—没有什么可以阻止您在那里执行数据存储操作。在
不过,这会导致很多小电话。正如您所建议的那样,编写一个定制的InputReader将允许您并行获取两组实体,这将显著提高性能。在
如果您提供更多关于如何加入这些实体的详细信息,我们可能会提供更具体的建议。在
相关问题 更多 >
编程相关推荐