浏览代码

Merge branch 'religion-abtest-update-20221230' into test

liqian 2 年之前
父节点
当前提交
4b3a66bbf6
共有 3 个文件被更改,包括 99 次插入41 次删除
  1. 12 2
      config.py
  2. 86 38
      recommend.py
  3. 1 1
      video_rank.py

+ 12 - 2
config.py

@@ -261,11 +261,13 @@ class BaseConfig(object):
         },
         '228': {
             'data_key': 'lhk_data', 'rule_key': 'lhk_rule1',
-            'ab_code': AB_CODE['region_rank_by_h'].get('abtest_228')
+            'ab_code': AB_CODE['region_rank_by_h'].get('abtest_228'),
+            'religion_class_name': 'catholicism',
         },  # 老好看 天主教 - 2插1
         '229': {
             'data_key': 'lhk_data', 'rule_key': 'lhk_rule2',
-            'ab_code': AB_CODE['region_rank_by_h'].get('abtest_229')
+            'ab_code': AB_CODE['region_rank_by_h'].get('abtest_229'),
+            'religion_class_name': 'christianity'
         },  # 老好看 基督教 - 2插1
     }
 
@@ -603,6 +605,14 @@ class BaseConfig(object):
     # 用户近30天是否有回流状态 存放 redis key 前缀,完整格式:'user:has30day:return:{mid}'
     KEY_NAME_PREFIX_USER_HAS30DAY_RETURN = 'user:has30day:return:'
 
+    # 宗教用户列表更新结果存放 redis key 前缀
+    KEY_NAME_PREFIX_RELIGION_USER = {
+        # 天主教,完整格式:'religion:catholicism:users:item:{hash_tag}:{date}'
+        'catholicism': 'religion:catholicism:users:item:',
+        # 基督教,完整格式:'religion:christianity:users:item:{hash_tag}:{date}'
+        'christianity': 'religion:christianity:users:item:',
+    }
+
     # 视频数据表类型 - 管理后台算法视频列表可视化
     VIDEO_DATA_LIST_MAPPING = {
         0: {

+ 86 - 38
recommend.py

@@ -4,7 +4,7 @@ import multiprocessing
 import traceback
 import hashlib
 
-from datetime import datetime
+from datetime import datetime, timedelta
 
 import config
 from log import Log
@@ -300,36 +300,36 @@ def video_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type, al
     result['rankResult'] = rank_result
     result['rankTime'] = (time.time() - start_rank) * 1000
 
-    if not rank_result:
-        # 兜底策略
-        # log_.info('====== bottom strategy')
-        start_bottom = time.time()
-        rank_result = bottom_strategy2(
-            size=size, app_type=app_type, mid=mid, uid=uid, ab_code=ab_code, client_info=client_info, params=params
-        )
-
-        # if ab_code == config_.AB_CODE['region_rank_by_h'].get('abtest_130'):
-        #     rank_result = bottom_strategy2(
-        #         size=size, app_type=app_type, mid=mid, uid=uid, ab_code=ab_code, client_info=client_info, params=params
-        #     )
-        # else:
-        #     rank_result = bottom_strategy(
-        #         request_id=request_id, size=size, app_type=app_type, ab_code=ab_code, params=params
-        #     )
-
-        # log_.info({
-        #     'logTimestamp': int(time.time() * 1000),
-        #     'request_id': request_id,
-        #     'mid': mid,
-        #     'uid': uid,
-        #     'operation': 'bottom',
-        #     'bottom_result': rank_result,
-        #     'executeTime': (time.time() - start_bottom) * 1000
-        # })
-        result['bottomResult'] = rank_result
-        result['bottomTime'] = (time.time() - start_bottom) * 1000
-
-    result['rankResult'] = rank_result
+    # if not rank_result:
+    #     # 兜底策略
+    #     # log_.info('====== bottom strategy')
+    #     start_bottom = time.time()
+    #     rank_result = bottom_strategy2(
+    #         size=size, app_type=app_type, mid=mid, uid=uid, ab_code=ab_code, client_info=client_info, params=params
+    #     )
+    #
+    #     # if ab_code == config_.AB_CODE['region_rank_by_h'].get('abtest_130'):
+    #     #     rank_result = bottom_strategy2(
+    #     #         size=size, app_type=app_type, mid=mid, uid=uid, ab_code=ab_code, client_info=client_info, params=params
+    #     #     )
+    #     # else:
+    #     #     rank_result = bottom_strategy(
+    #     #         request_id=request_id, size=size, app_type=app_type, ab_code=ab_code, params=params
+    #     #     )
+    #
+    #     # log_.info({
+    #     #     'logTimestamp': int(time.time() * 1000),
+    #     #     'request_id': request_id,
+    #     #     'mid': mid,
+    #     #     'uid': uid,
+    #     #     'operation': 'bottom',
+    #     #     'bottom_result': rank_result,
+    #     #     'executeTime': (time.time() - start_bottom) * 1000
+    #     # })
+    #     result['bottomResult'] = rank_result
+    #     result['bottomTime'] = (time.time() - start_bottom) * 1000
+    #
+    # result['rankResult'] = rank_result
 
     return result
     # return rank_result, last_rov_recall_key
@@ -515,6 +515,30 @@ def update_local_distribute_count(videos):
         log_.error(traceback.format_exc())
 
 
+def get_religion_class_with_mid(mid, religion_class_name):
+    """
+    判断用户是否属于对应的宗教类型
+    :param mid: mid type-string
+    :param religion_class_name: 宗教类型, type-string, (catholicism-天主教, christianity-基督教)
+    :return: religion_class_flag, type-int, (0-否,1-是), 默认: 0
+    """
+    religion_class_flag = 0
+    now_date = datetime.today()
+    redis_helper = RedisHelper()
+    if mid:
+        hash_mid = hashlib.md5(mid.encode('utf-8')).hexdigest()
+        hash_tag = hash_mid[-1:]
+        key_name_prefix = config_.KEY_NAME_PREFIX_RELIGION_USER.get(religion_class_name, None)
+        if key_name_prefix is None:
+            return religion_class_flag
+        key_name = f"{key_name_prefix}{hash_tag}:{datetime.strftime(now_date, '%Y%m%d')}"
+        if not redis_helper.key_exists(key_name=key_name):
+            key_name = f"{key_name_prefix}{hash_tag}:{datetime.strftime(now_date - timedelta(days=1), '%Y%m%d')}"
+        if redis_helper.data_exists_with_set(key_name=key_name, value=mid):
+            religion_class_flag = 1
+    return religion_class_flag
+
+
 def get_recommend_params(recommend_type, ab_exp_info, ab_info_data, mid, app_type, page_type=0):
     """
     根据实验分组给定对应的推荐参数
@@ -617,13 +641,37 @@ def get_recommend_params(recommend_type, ab_exp_info, ab_info_data, mid, app_typ
             #         data_key = param.get('data_key')
             #         no_op_flag = True
 
-            for code, param in config_.AB_EXP_CODE.items():
-                if code in ab_exp_code_list:
-                    ab_code = param.get('ab_code')
-                    rule_key = param.get('rule_key')
-                    data_key = param.get('data_key')
-                    rule_key_30day = param.get('30day_rule_key')
-                    break
+            # 老好看视频 宗教人群实验
+            if '228' in ab_exp_code_list:
+                # 天主教
+                religion_param = config_.AB_EXP_CODE['228']
+                religion_class_name = religion_param.get('religion_class_name')
+                religion_class_flag = get_religion_class_with_mid(mid=mid, religion_class_name=religion_class_name)
+                if religion_class_flag == 1:
+                    ab_code = religion_param.get('ab_code')
+                    rule_key = religion_param.get('rule_key')
+                    data_key = religion_param.get('data_key')
+                    rule_key_30day = religion_param.get('30day_rule_key')
+
+            elif '229' in ab_exp_code_list:
+                # 基督教
+                religion_param = config_.AB_EXP_CODE['229']
+                religion_class_name = religion_param.get('religion_class_name')
+                religion_class_flag = get_religion_class_with_mid(mid=mid, religion_class_name=religion_class_name)
+                if religion_class_flag == 1:
+                    ab_code = religion_param.get('ab_code')
+                    rule_key = religion_param.get('rule_key')
+                    data_key = religion_param.get('data_key')
+                    rule_key_30day = religion_param.get('30day_rule_key')
+
+            else:
+                for code, param in config_.AB_EXP_CODE.items():
+                    if code in ab_exp_code_list:
+                        ab_code = param.get('ab_code')
+                        rule_key = param.get('rule_key')
+                        data_key = param.get('data_key')
+                        rule_key_30day = param.get('30day_rule_key')
+                        break
 
             """
             # 推荐条数 10->4 实验

+ 1 - 1
video_rank.py

@@ -21,7 +21,7 @@ def video_rank(data, size, top_K, flow_pool_P):
     :return: rank_result
     """
     if not data['rov_pool_recall'] and not data['flow_pool_recall']:
-        return None
+        return []
     # 将各路召回的视频按照score从大到小排序
     # 最惊奇相关推荐相似视频
     # relevant_recall = [item for item in data['rov_pool_recall']