2017-03-05 104 views
0

所以基本上我有一張帶照片的數據庫表。每張照片的評分爲< 0,1>和類別(一個或多個)。我需要一種方法來高效地從這個表中加權選擇x元素,但是在類別方面,我必須在python3 + Django(或通過Redis進行微服務通信或暴露RESTapi)中執行此操作。帶類別的加權隨機選擇

如: 表:

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

當我問爲1張照片與類別(貓,狗)。該算法應該返回類似

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

目前,每次我問它,我做一些事情如下時間:

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) 

有沒有比較有效的方法來呢?我可以使用任何AWS服務來實現它。

回答

0

您可以使用類似

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

此行基本上選擇你想要的所有類別,根據其概率篩選出的條目,並返回一個隨機。

+0

從我發現'.order_by('?')'超慢。 '注意:order_by('?')查詢可能非常昂貴並且速度很慢,這取決於您使用的數據庫後端。 order-by – Quba

+0

我喜歡這個解決方案,但我覺得按'?'排序也很慢。您可以讓Python從結果集中隨機輸入一個數字(0到結果集計數之間的整數),我想它會快很多。 –

+0

我更新瞭解決方案,使用'random.sample'而不是'order('?')'。 –