Ich habe gerade Batch data processing with App Engine session of Google I/O 2010 angesehen, habe einige Teile von MapReduce article from Google Research gelesen und jetzt denke ich, MapReduce on Google App Engine zu verwenden, um ein Empfehlungssystem in Python zu implementieren.MapReduce für mehr als einen Datenspeichertyp in Google App Engine
Ich bevorzuge die Verwendung von appengine-mapreduce anstelle der Task Queue API, da die erste eine einfache Iteration über alle Instanzen, automatisches Batching, automatische Taskverkettung usw. bietet. Das Problem ist: mein Empfehlungssystem muss die Korrelation zwischen Instanzen berechnen von zwei verschiedenen Modellen, dh Instanzen von zwei verschiedenen Arten.
Beispiel: Ich habe diese zwei Modelle: Benutzer und Artikel. Jeder hat eine Liste von Tags als Attribut. Im Folgenden finden Sie die Funktionen zum Berechnen der Korrelation zwischen Benutzern und Elementen. Beachten Sie, dass calculateCorrelation
sollte für jede Kombination von Benutzer und Produkte genannt werden:
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
Aber das calculateCorrelation
ist kein gültiger Mapper in appengine-mapreduce und vielleicht ist diese Funktion nicht auch kompatibel mit MapReduce Berechnungskonzept. Aber ich muss mir sicher sein ... es wäre wirklich toll für mich, wenn ich diese appeengine-mapreduce-Vorteile wie automatisches Batching und Task-Chaining hätte.
Gibt es eine Lösung dafür?
Sollte ich meinen eigenen InputReader definieren? Ein neuer InputReader, der alle Instanzen zweier verschiedener Arten liest, ist mit der aktuellen appengine-mapreduce-Implementierung kompatibel?
Oder sollte ich Folgendes versuchen?
- Kombinieren Sie alle Schlüssel aller Einheiten dieser beiden Arten, je zwei, in Instanzen eines neuen Modells (möglicherweise mit MapReduce)
- Iterate Mapper über Instanzen dieses neue Modell
- Für jede Verwendung Verwenden Sie in diesem Fall Schlüssel, um die zwei Entitäten verschiedener Arten zu erhalten, und berechnen Sie die Korrelation zwischen ihnen.
Was sind die Kriterien für die in-Benutzer und Gegenstände übergeben? Ist es jede Kombination von Benutzer und Artikel? Nur solche, die irgendwie verwandt sind? Auch, welche Sprache ist das? Es ist nicht (ganz) Python! –
'calculateCorrelation' sollte für jede Kombination von Benutzer und Element aufgerufen werden. Und jetzt habe ich die Arten von Variablen entfernt, um Verwirrung zu vermeiden. – fjsj