liqian 3 лет назад
Родитель
Сommit
f8243cdb8d
3 измененных файлов с 21 добавлено и 10 удалено
  1. 3 1
      app.py
  2. 4 4
      recommend.py
  3. 14 5
      video_recall.py

+ 3 - 1
app.py

@@ -39,13 +39,15 @@ def homepage_recommend():
         size = request_data.get('size')
         app_type = request_data.get('appType')
         algo_type = request_data.get('algoType')
+        client_info = request_data.get('clientInfo')
         log_.info('request data: {}'.format(request_data))
         # size默认为10
         if not size:
             size = 10
         if category_id in config_.CATEGORY['recommend']:
             # 推荐
-            videos = video_recommend(mid=mid, uid=uid, size=size, app_type=app_type, algo_type=algo_type)
+            videos = video_recommend(mid=mid, uid=uid, size=size, app_type=app_type,
+                                     algo_type=algo_type, client_info=client_info)
             result = {'code': 200, 'message': 'success', 'data': {'videos': videos}}
             log_.info('category_id: {}, mid: {}, uid: {}, result: {}, execute time = {}ms'.format(
                 category_id, mid, uid, result, (time.time() - start_time)*1000))

+ 4 - 4
recommend.py

@@ -14,7 +14,7 @@ log_ = Log()
 config_ = set_config()
 
 
-def video_recommend(mid, uid, size, app_type, algo_type):
+def video_recommend(mid, uid, size, app_type, algo_type, client_info):
     """
     首页线上推荐逻辑
     :param mid: mid type-string
@@ -22,6 +22,7 @@ def video_recommend(mid, uid, size, app_type, algo_type):
     :param size: 请求视频数量 type-int
     :param app_type: 产品标识  type-int
     :param algo_type: 算法类型  type-string
+    :param client_info: 用户位置信息 {"country": "国家",  "province": "省份",  "city": "城市"}
     :return:
     """
     ab_code = config_.AB_CODE
@@ -44,7 +45,7 @@ def video_recommend(mid, uid, size, app_type, algo_type):
     pool.join()
     '''
     recall_result_list = []
-    pool_recall = PoolRecall(app_type=app_type, mid=mid, uid=uid, ab_code=ab_code)
+    pool_recall = PoolRecall(app_type=app_type, mid=mid, uid=uid, ab_code=ab_code, client_info=client_info)
     _, last_rov_recall_key, _ = pool_recall.get_video_last_idx()
     t = [gevent.spawn(pool_recall.rov_pool_recall, size), gevent.spawn(pool_recall.flow_pool_recall, size) ]
     gevent.joinall(t)
@@ -138,10 +139,9 @@ def video_relevant_recommend(mid, uid, size, app_type):
     :param uid: uid type-string
     :param size: 请求视频数量 type-int
     :param app_type: 产品标识  type-int
-    :param algo_type: 算法类型  type-string
     :return: videos type-list
     """
-    videos = video_recommend(mid=mid, uid=uid, size=size, app_type=app_type, algo_type='')
+    videos = video_recommend(mid=mid, uid=uid, size=size, app_type=app_type, algo_type='', client_info=None)
     return videos
 
 

+ 14 - 5
video_recall.py

@@ -14,10 +14,11 @@ config_ = set_config()
     
 class PoolRecall(object):
     """召回"""
-    def __init__(self, app_type, mid='', uid='', ab_code=''):
+    def __init__(self, app_type, client_info, mid='', uid='', ab_code=''):
         """
         初始化
         :param app_type: 产品标识 type-int
+        :param client_info: 用户位置信息 {"country": "国家",  "province": "省份",  "city": "城市"}
         :param mid: mid type-string
         :param uid: uid type-string
         :param ab_code: ab_code type-int
@@ -26,6 +27,7 @@ class PoolRecall(object):
         self.mid = mid
         self.uid = uid
         self.ab_code = ab_code
+        self.client_info = client_info
         self.redis_helper = RedisHelper()
 
     def rov_pool_recall(self, size=10):
@@ -33,8 +35,12 @@ class PoolRecall(object):
         log_.info('====== rov pool recall')
 
         # 获取生效中的置顶视频
-        top_video_ids, top_video_result = self.get_top_videos()
-        log_.info('top video result = {}'.format(top_video_ids))
+        if self.client_info is None:
+            # 无用户位置信息时,不获取置顶视频
+            top_video_ids, top_video_result = [], []
+        else:
+            top_video_ids, top_video_result = self.get_top_videos()
+            log_.info('top video result = {}'.format(top_video_ids))
 
         # 获取修改过rov的视频
         update_rov_video_ids, update_rov_result = self.get_update_rov_videos()
@@ -382,8 +388,11 @@ class PoolRecall(object):
             video_info = {}
             for item in eval(data):
                 video_id = int(item['videoId'])
-                video_ids.append(video_id)
-                video_info[video_id] = {'score': item['score'], 'area': item['area']}
+                # 判断 视频推荐区域与用户地址信息 是否匹配,市级别
+                video_area_list = item['area'].split(',')
+                if self.client_info.get('city') in video_area_list or '全部' in video_area_list:
+                    video_ids.append(video_id)
+                    video_info[video_id] = {'score': item['score'], 'area': video_area_list}
 
             # 过滤
             filter_ = FilterVideos(app_type=self.app_type, video_ids=video_ids, mid=self.mid, uid=self.uid)