Browse Source

Merge branch 'dev-xym-add-feature' of algorithm/ad-engine into master

xueyiming 11 hours ago
parent
commit
fe7070a4a2

+ 1 - 1
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/model/PAIModelV1.java

@@ -43,7 +43,7 @@ public class PAIModelV1 {
             "user_vid_return_tags_2h", "user_vid_return_tags_1d", "user_vid_return_tags_3d", "user_vid_return_tags_7d",
             "user_vid_return_tags_14d", "root_source_scene", "root_source_channel", "title_split", "user_vid_share_tags_1d",
             "user_vid_share_tags_14d", "user_vid_return_cate1_14d", "user_vid_return_cate2_14d", "user_vid_share_cate1_14d",
-            "user_vid_share_cate2_14d", "user_conver_ad_class"
+            "user_vid_share_cate2_14d", "user_conver_ad_class", "user_layer_class"
     };
 
     private static final String[] sparseUserLongFeatures = {

+ 27 - 41
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/strategy/RankStrategyBasic.java

@@ -203,6 +203,16 @@ public abstract class RankStrategyBasic implements RankStrategy {
                 map.put("root_source_channel", rootSourceChannel);
             }
         }
+        Map<String, String> userLayer = getUserLayer(request.getMid());
+        String layer = userLayer.getOrDefault("layer", "无曝光");
+        String clazz = userLayer.getOrDefault("class", "近期未出现");
+        if (request.getIsFilterUser()) {
+            layer = layer + "-炸";
+        }
+        String userLayerClass = layer + "-" + clazz;
+        map.put("user_layer_class", userLayerClass);
+        map.put("layer", layer);
+        map.put("clazz", clazz);
         return map;
     }
 
@@ -259,9 +269,6 @@ public abstract class RankStrategyBasic implements RankStrategy {
         Map<String, String> userLayer = this.getUserLayer(request.getMid());
         String layer = userLayer.getOrDefault("layer", "无曝光");
         String clazz = userLayer.getOrDefault("class", "近期未出现");
-        if (StringUtils.isNotEmpty(layer) && layer.equals("已转化")) {
-            layer = "有转化";
-        }
         //有转化中医层,中医和兴趣教育同时存在过滤兴趣教育行业
         if (Objects.equals(layer, "有转化") && Objects.equals(clazz, "中医") && scoreParam.getExpCodeSet().contains(excludeExp)) {
             List<AdPlatformCreativeDTO> adIdList = request.getAdIdList();
@@ -385,17 +392,11 @@ public abstract class RankStrategyBasic implements RankStrategy {
         }
     }
 
-    protected Map<Long, CorrectCpaParam> getCorrectCpaParamMap(RankRecommendRequestParam request, ScoreParam scoreParam) {
+    protected Map<Long, CorrectCpaParam> getCorrectCpaParamMap(RankRecommendRequestParam request, ScoreParam scoreParam, Map<String, String> reqFeature) {
         Map<String, String> userLayer = this.getUserLayer(request.getMid());
 
-        String layer = userLayer.getOrDefault("layer", "无曝光");
-        String clazz = userLayer.getOrDefault("class", "近期未出现");
-        if (StringUtils.isNotEmpty(layer) && layer.equals("已转化")) {
-            layer = "有转化";
-        }
-        if (request.getIsFilterUser()) {
-            layer = layer + "-炸";
-        }
+        String layer = reqFeature.get("layer");
+        String clazz = reqFeature.get("clazz");
         Map<Long, CorrectCpaParam> resultMap = new HashMap<>();
         try {
             if (CollectionUtils.isEmpty(request.getAdIdList())) {
@@ -515,11 +516,11 @@ public abstract class RankStrategyBasic implements RankStrategy {
         }
     }
 
-    protected void calculateCtcvrScore(List<AdRankItem> items, RankRecommendRequestParam request, ScoreParam scoreParam, String modelName) {
+    protected void calculateCtcvrScore(List<AdRankItem> items, RankRecommendRequestParam request, ScoreParam scoreParam, String modelName, Map<String, String> reqFeature) {
         //判断是否走校准试验
         if (scoreParam.getExpCodeSet().contains(calibrationCtcvrExp)) {
             try {
-                calibrationDnnCtcvrScore(items, request.getMid(), request.getIsFilterUser(), modelName);
+                calibrationDnnCtcvrScore(items, modelName, reqFeature);
             } catch (Exception e) {
                 log.error("calibrationDnnCtcvrScore error", e);
             }
@@ -527,19 +528,15 @@ public abstract class RankStrategyBasic implements RankStrategy {
 
         if (scoreParam.getExpCodeSet().contains(calibrationCoefficientExp)) {
             try {
-                calibrationCtcvrScore(items, request);
+                calibrationCtcvrScore(items, request, reqFeature);
             } catch (Exception e) {
                 log.error("calibrationCtcvrScore error", e);
             }
         }
     }
 
-    protected void calibrationCtcvrScore(List<AdRankItem> items, RankRecommendRequestParam request) {
-        Map<String, String> userLayer = this.getUserLayer(request.getMid());
-        String layer = userLayer.getOrDefault("layer", "无曝光");
-        String clazz = userLayer.getOrDefault("class", "近期未出现");
-        layer = "已转化".equals(layer) ? "有转化" : layer;
-        String userLayerClass = buildUserLayerClass(request.getIsFilterUser(), layer, clazz);
+    protected void calibrationCtcvrScore(List<AdRankItem> items, RankRecommendRequestParam request, Map<String, String> reqFeature) {
+        String userLayerClass = reqFeature.get("layer") + "-" + reqFeature.get("clazz");
         String cidLayerClassKey = cidLayerKey.replace("{userLayer}", userLayerClass);
 
         // 3. 批量查询Redis
@@ -596,11 +593,6 @@ public abstract class RankStrategyBasic implements RankStrategy {
         }
     }
 
-    private String buildUserLayerClass(boolean isFilterUser, String layer, String clazz) {
-        if (Objects.equals(layer, "已转化")) layer = "有转化";
-        return isFilterUser ? layer + "-炸-" + clazz : layer + "-" + clazz;
-    }
-
 
     protected AdRankItem creativeCovertRankItem(AdPlatformCreativeDTO dto, RankRecommendRequestParam request, Set<String> noApiAdVerIds) {
         AdRankItem adRankItem = new AdRankItem();
@@ -690,33 +682,27 @@ public abstract class RankStrategyBasic implements RankStrategy {
             return new HashMap<>();
         }
         try {
-            return JSON.parseObject(value, new TypeReference<Map<String, String>>() {
+            Map<String, String> map = JSON.parseObject(value, new TypeReference<Map<String, String>>() {
             });
+            if (map.containsKey("layer") && Objects.equals(map.get("layer"), "已转化")) {
+                map.put("layer", "有转化");
+            }
+            return map;
         } catch (Exception e) {
             log.error("getUserLayer error. mid: {}, \n", mid, e);
             return new HashMap<>();
         }
     }
 
-    protected void calibrationDnnCtcvrScore(List<AdRankItem> adRankItems, String mid, boolean isFilterUser, String modelName) {
+    protected void calibrationDnnCtcvrScore(List<AdRankItem> adRankItems, String modelName, Map<String, String> reqFeature) {
         if (StringUtils.isEmpty(modelName)) {
             return;
         }
-        // 1. 获取用户分层信息
-        Map<String, String> userLayer = getUserLayer(mid);
-        String layer = userLayer.getOrDefault("layer", "无曝光");
-        String clazz = userLayer.getOrDefault("class", "近期未出现");
-        if (Objects.equals(layer, "已转化")) {
-            layer = "有转化";
-        }
-        if (isFilterUser) {
-            layer += "-炸";
-        }
-        // 2. 构建Key模板
+        // 构建Key模板
         String layerKeyTemplate = realLayerCtcvrKey
                 .replace("{model}", modelName)
-                .replace("{layer}", layer)
-                .replace("{class}", clazz);
+                .replace("{layer}", reqFeature.get("layer"))
+                .replace("{class}", reqFeature.get("clazz"));
 
 
         String value = adRedisHelper.get(layerKeyTemplate);

+ 2 - 2
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/strategy/RankStrategyBy679.java

@@ -99,7 +99,7 @@ public class RankStrategyBy679 extends RankStrategyBasic {
         long time1 = System.currentTimeMillis();
         boolean isGuaranteedFlow = getIsGuaranteedFlow(scoreParam);
         Map<String, GuaranteeView> map = getGuaranteeViewMap(request, isGuaranteedFlow);
-        Map<Long, CorrectCpaParam> correctCpaMap = getCorrectCpaParamMap(request, scoreParam);
+        Map<Long, CorrectCpaParam> correctCpaMap = getCorrectCpaParamMap(request, scoreParam, reqFeature);
         List<AdRankItem> adRankItems = new ArrayList<>();
         Random random = new Random();
         List<Future<AdRankItem>> futures = new ArrayList<>();
@@ -222,7 +222,7 @@ public class RankStrategyBy679 extends RankStrategyBasic {
         // getScorerPipeline
         List<AdRankItem> result = ScorerUtils.getScorerPipeline(ScorerUtils.XGBOOST_SCORE_CONF_20241105).scoring(sceneFeatureMap, userFeatureMap, adRankItems);
         long time5 = System.currentTimeMillis();
-        calculateCtcvrScore(result, request, scoreParam, null);
+        calculateCtcvrScore(result, request, scoreParam, null, reqFeature);
         // loop
         double cpmCoefficient = weightParam.getOrDefault("cpmCoefficient", 0.9);
 

+ 2 - 2
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/strategy/RankStrategyBy680.java

@@ -111,7 +111,7 @@ public class RankStrategyBy680 extends RankStrategyBasic {
 
         boolean isGuaranteedFlow = getIsGuaranteedFlow(scoreParam);
         Map<String, GuaranteeView> map = getGuaranteeViewMap(request, isGuaranteedFlow);
-        Map<Long, CorrectCpaParam> correctCpaMap = getCorrectCpaParamMap(request, scoreParam);
+        Map<Long, CorrectCpaParam> correctCpaMap = getCorrectCpaParamMap(request, scoreParam, reqFeature);
         List<AdRankItem> adRankItems = new ArrayList<>();
         Random random = new Random();
         List<Future<AdRankItem>> futures = new ArrayList<>();
@@ -242,7 +242,7 @@ public class RankStrategyBy680 extends RankStrategyBasic {
             item.getScoreMap().put("ctcvrScore", calibratedScore);
         }
 
-        calculateCtcvrScore(result, request, scoreParam, null);
+        calculateCtcvrScore(result, request, scoreParam, null, reqFeature);
         // loop
         double cpmCoefficient = weightParam.getOrDefault("cpmCoefficient", 0.9);
 

+ 2 - 2
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/strategy/RankStrategyBy683.java

@@ -108,7 +108,7 @@ public class RankStrategyBy683 extends RankStrategyBasic {
 
         boolean isGuaranteedFlow = getIsGuaranteedFlow(scoreParam);
         Map<String, GuaranteeView> map = getGuaranteeViewMap(request, isGuaranteedFlow);
-        Map<Long, CorrectCpaParam> correctCpaMap = getCorrectCpaParamMap(request, scoreParam);
+        Map<Long, CorrectCpaParam> correctCpaMap = getCorrectCpaParamMap(request, scoreParam, reqFeature);
         List<AdRankItem> adRankItems = new ArrayList<>();
         Random random = new Random();
         List<Future<AdRankItem>> futures = new ArrayList<>();
@@ -239,7 +239,7 @@ public class RankStrategyBy683 extends RankStrategyBasic {
             item.getScoreMap().put("ctcvrScore", calibratedScore);
         }
 
-        calculateCtcvrScore(result, request, scoreParam, null);
+        calculateCtcvrScore(result, request, scoreParam, null, reqFeature);
         // loop
         double cpmCoefficient = weightParam.getOrDefault("cpmCoefficient", 0.9);
         boolean isGuaranteeType = false;

+ 0 - 3
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/strategy/RankStrategyBy687.java

@@ -125,9 +125,6 @@ public class RankStrategyBy687 extends RankStrategyBasic {
 
         String layer = userLayer.getOrDefault("layer", "无曝光");
         String clazz = userLayer.getOrDefault("class", "近期未出现");
-        if (Objects.equals(layer, "已转化")) {
-            layer = "有转化";
-        }
         if (request.getIsFilterUser()) {
             return String.join("-", layer, "炸", clazz);
         } else {

+ 10 - 21
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/strategy/RankStrategyBy688.java

@@ -145,13 +145,14 @@ public class RankStrategyBy688 extends RankStrategyBasic {
         userFeatureMap.put("user_vid_share_cate1_14d", g2Feature.getOrDefault("cate1_14d", null));
         userFeatureMap.put("user_vid_share_cate2_14d", g2Feature.getOrDefault("cate2_14d", null));
 
+        userFeatureMap.put("user_layer_class", reqFeature.getOrDefault("user_layer_class", null));
 
         Map<String, String> sceneFeatureMap = this.handleSceneFeature(ts);
         long time1 = System.currentTimeMillis();
 
         boolean isGuaranteedFlow = getIsGuaranteedFlow(scoreParam);
         Map<String, GuaranteeView> map = getGuaranteeViewMap(request, isGuaranteedFlow);
-        Map<Long, CorrectCpaParam> correctCpaMap = getCorrectCpaParamMap(request, scoreParam);
+        Map<Long, CorrectCpaParam> correctCpaMap = getCorrectCpaParamMap(request, scoreParam, reqFeature);
         List<AdRankItem> adRankItems = new ArrayList<>();
         Random random = new Random();
         List<Future<AdRankItem>> futures = new ArrayList<>();
@@ -301,12 +302,12 @@ public class RankStrategyBy688 extends RankStrategyBasic {
             item.getScoreMap().put("ctcvrScore", calibratedScore);
         }
 
-        calculateCtcvrScore(result, request, scoreParam, "dnn");
+        calculateCtcvrScore(result, request, scoreParam, "dnn", reqFeature);
         // loop
         double cpmCoefficient = weightParam.getOrDefault("cpmCoefficient", 0.9);
         boolean isGuaranteeType = false;
         // 查询人群分层信息
-        String peopleLayer = getUserLayerAfterHandle(request);
+        String peopleLayer = reqFeature.get("layer");
         for (AdRankItem item : result) {
             double bid = item.getCpa();
             if (scoreParam.getExpCodeSet().contains(correctCpaExp1) || scoreParam.getExpCodeSet().contains(correctCpaExp2)) {
@@ -361,10 +362,11 @@ public class RankStrategyBy688 extends RankStrategyBasic {
 
     /**
      * 获取人群分层和创意的权重
+     *
      * @param key
      * @return
      */
-    private Double getLayerAndCreativeWeight(String key){
+    private Double getLayerAndCreativeWeight(String key) {
         if (StringUtils.isBlank(key)) {
             return 1d;
         }
@@ -373,32 +375,18 @@ public class RankStrategyBy688 extends RankStrategyBasic {
 
     /**
      * 获取人群分层和创意的权重key
+     *
      * @param layer
      * @param creativeId
      * @return
      */
-    private String getLayerAndCreativeWeightMapKey(String layer, String creativeId){
-        if ( StringUtils.isBlank(layer) || StringUtils.isBlank(creativeId)) {
+    private String getLayerAndCreativeWeightMapKey(String layer, String creativeId) {
+        if (StringUtils.isBlank(layer) || StringUtils.isBlank(creativeId)) {
             return null;
         }
         return layer + "_" + creativeId;
     }
 
-    /**
-     * 获取处理后的人群分层
-     * @param request
-     * @return
-     */
-    private String getUserLayerAfterHandle(RankRecommendRequestParam request){
-        Map<String, String> userLayer = this.getUserLayer(request.getMid());
-        String layer = userLayer.getOrDefault("layer", "无曝光");
-        if (StringUtils.isNotEmpty(layer) && layer.equals("已转化")) {
-            layer = "有转化";
-        }
-        return layer;
-    }
-
-
 
     private void handleB1Feature(Map<String, String> b1Feature, Map<String, String> cidFeatureMap, String cid) {
         cidFeatureMap.put("cid_" + cid, "0.1");
@@ -855,6 +843,7 @@ public class RankStrategyBy688 extends RankStrategyBasic {
             add("user_skuid_view_30d");
             add("user_skuid_click_30d");
             add("user_skuid_conver_30d");
+            add("user_layer_class");
         }};
     }