Google I / O2010のAppEngineセッションでバッチデータ処理を見て、Google ResearchのMapReduce記事の一部を読んだところ、GoogleAppEngineでMapReduceを使用してPythonでレコメンダーシステムを実装することを考えています。
Task Queue APIの代わりにappengine-mapreduceを使用することをお勧めします。前者は、ある種のすべてのインスタンス、自動バッチ処理、自動タスクチェーンなどを簡単に反復できるためです。問題は、レコメンダーシステムが2つの異なるモデルのインスタンス間の相関を計算する必要があることです。つまり、2つの異なる種類のインスタンスです。
例:ユーザーとアイテムの2つのモデルがあります。それぞれに属性としてタグのリストがあります。以下は、ユーザーとアイテム間の相関を計算するための関数です。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の有効なマッパーではなく、おそらくこの関数はMapReduce計算の概念と互換性さえありません。それでも、私は確信する必要があります...自動バッチ処理やタスクチェーンなどのappengine-mapreduceの利点があることは私にとって本当に素晴らしいことです。
そのための解決策はありますか?
独自のInputReaderを定義する必要がありますか?2つの異なる種類のすべてのインスタンスを読み取る新しいInputReaderは、現在のappengine-mapreduce実装と互換性がありますか?
または、次のことを試してみるべきですか?
- これら2種類のすべてのエンティティのすべてのキーを2つずつ組み合わせて新しいモデルのインスタンスにします(おそらくMapReduceを使用)
- この新しいモデルのインスタンスに対してマッパーを使用して反復します
- インスタンスごとに、その中のキーを使用して、異なる種類の2つのエンティティを取得し、それらの間の相関を計算します。