2017-03-05 7 views
0

Also im Grunde habe ich eine Datenbanktabelle mit Fotos. Jedes Foto hat eine Bewertung < 0,1> und Kategorien (eine oder mehrere). Ich brauche einen Weg, um effizient X-Elemente aus dieser Tabelle zu gewichten, zufällig, aber in Bezug auf Kategorien, ich muss dies in python3 + Django tun (oder Microservice durch Redis kommunizieren oder ausgesetzt RESTapi).Gewichtete Zufallsauswahl mit Kategorien

zB: Tabelle:

.---------.--------.------------. 
| photo | rating | categories | 
:---------+--------+------------: 
| Value 1 | 0.8 | art, cats | 
:---------+--------+------------: 
| value 2 | 0.5 | cats  | 
:---------+--------+------------: 
| value 3 | 0.9 | night  | 
'---------'--------'------------' 

Und wenn ich fragen Sie nach 1 Foto mit Kategorien (Katzen, Hunde). Der Algorithmus sollte so etwas wie

zurückkehren

numpy.random.choice([Value 1, Value 2], 1, [0.8, 0.5], replace=False)

Derzeit jedes Mal, wenn ich gefragt werde, denn es mache ich etwas wie folgt:

photos = Photos.objects.filter(category__in=[list of wanted categories]) 
photos, weights = zip(*list(photos.values_list('photo', 'rating'))) 
res = numpy.random.choice(photos, amount_wanted, weights, , replace=False) 

Gibt es mehr efficent Ansatz dazu? Ich kann jeden AWS-Dienst verwenden, um es zu erreichen.

Antwort

0

Sie in der Lage sein kann, etwas ähnliches zu verwenden

photo = random.sample(Photos.objects.filter(category__in=[list of wanted categories], rating__gte=random.random())), 1) 

Diese Linie wählt grundsätzlich alle Kategorien Sie wollen, filtert Einträge entsprechend ihrer Wahrscheinlichkeit und gibt ein gelegentliches.

+0

Von dem, was ich herausgefunden habe. 'Order_by ('?')' Ist super langsam. 'Hinweis: order_by ('?') Abfragen können teuer und langsam sein, abhängig vom verwendeten Datenbank-Backend. ' https://docs.djangoproject.com/de/1.10/ref/models/querysets/# Order-by – Quba

+0

Ich mag die Lösung, aber ich denke Ordnung durch "?" ist auch langsam. Sie könnten Python einen zufälligen Eintrag von der Ergebnismenge (Ganzzahl zwischen 0 und Ergebnismenge) nehmen lassen, und es wird viel schneller, denke ich. –

+0

Ich habe die Lösung aktualisiert, um 'random.sample' anstelle von' order ('?') 'Zu verwenden. –