Explorar o código

增加新的特征值

xueyiming hai 6 días
pai
achega
5b70827dd0

+ 3 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/dto/AdPlatformCreativeDTO.java

@@ -43,4 +43,7 @@ public class AdPlatformCreativeDTO {
 
     // 召回源,记录召回用
     private Object recallSources;
+
+    //所属行业
+    private String profession;
 }

+ 4 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/param/RankRecommendRequestParam.java

@@ -10,4 +10,8 @@ import java.util.List;
 @EqualsAndHashCode(callSuper = true)
 public class RankRecommendRequestParam extends RecommendRequestParam{
      List<AdPlatformCreativeDTO> adIdList;
+     String sessionId;
+     String subSessionId;
+     String rootSessionId;
+     String rootSourceId;
 }

+ 1 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/param/RecommendRequestParam.java

@@ -22,6 +22,7 @@ public class RecommendRequestParam {
     private String pqtId;
     private List<Map<String, String>> adAbExpArr;
     private String adAbGroup;
+    private Long ts;
 
     private StatisticsLogParam statisticsLog;
 }

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

@@ -39,17 +39,23 @@ public class PAIModelV1 {
     }
 
     private static final String[] sparseStrFeatures = {
-            "brand", "region", "city", "cate1", "cate2", "user_cid_click_list", "user_cid_conver_list", "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"
+            "brand", "region", "city", "cate1", "cate2", "user_cid_click_list", "user_cid_conver_list",
+            "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"
     };
 
     private static final String[] sparseLongFeatures = {
-            "vid"
+            "vid", "apptype", "hour", "hour_quarter", "is_first_layer"
     };
 
     private static final String[] sparseAdLongFeatures = {
             "cid", "adid", "adverid"
     };
 
+    private static final String[] sparseAdStrFeatures = {
+            "profession"
+    };
+
     private final String[] userFeatures = {
             "viewAll", "clickAll", "converAll", "incomeAll", "ctr_all", "ctcvr_all", "cvr_all", "ecpm_all"
     };
@@ -123,6 +129,12 @@ public class PAIModelV1 {
                 request.addFeed(feature, TFDataType.DT_INT64, new long[]{1}, new long[]{v});
             }
 
+            for (String feature : sparseLongFeatures) {
+                String key = feature.replace("_x_", "*").replace("_view", "(view)");
+                long v = NumberUtils.toLong(sceneFeatureMap.getOrDefault(key, "0"), 0);
+                request.addFeed(feature, TFDataType.DT_INT64, new long[]{1}, new long[]{v});
+            }
+
 
             for (String feature : userFeatures) {
                 String key = feature.replace("_x_", "*").replace("_view", "(view)");
@@ -131,6 +143,7 @@ public class PAIModelV1 {
             }
             Map<String, double[]> doubleFeed = new HashMap<>();
             Map<String, long[]> longFeed = new HashMap<>();
+            Map<String, String[]> strFeed = new HashMap<>();
             for (int i = 0; i < items.size(); i++) {
                 for (String feature : itemFeatures) {
                     String key = feature.replace("_x_", "*").replace("_view", "(view)");
@@ -153,6 +166,17 @@ public class PAIModelV1 {
                     long v = NumberUtils.toLong(items.get(i).getFeatureMap().getOrDefault(key, "0"), 0L);
                     longs[i] = v;
                 }
+
+                for (String feature : sparseAdStrFeatures) {
+                    String key = feature.replace("_x_", "*").replace("_view", "(view)");
+                    String[] strs = strFeed.computeIfAbsent(feature, k -> new String[items.size()]);
+                    if (MapUtils.isEmpty(items.get(i).getFeatureMap())) {
+                        strs[i] = "";
+                        continue;
+                    }
+                    String v = items.get(i).getFeatureMap().getOrDefault(key, "");
+                    strs[i] = v;
+                }
             }
             for (Map.Entry<String, double[]> entry : doubleFeed.entrySet()) {
                 request.addFeed(entry.getKey(), TFDataType.DT_DOUBLE, new long[]{items.size()}, entry.getValue());
@@ -161,6 +185,10 @@ public class PAIModelV1 {
             for (Map.Entry<String, long[]> entry : longFeed.entrySet()) {
                 request.addFeed(entry.getKey(), TFDataType.DT_INT64, new long[]{items.size()}, entry.getValue());
             }
+
+            for (Map.Entry<String, String[]> entry : strFeed.entrySet()) {
+                request.addFeed(entry.getKey(), TFDataType.DT_STRING, new long[]{items.size()}, entry.getValue());
+            }
             request.addFetch("probs");
             TFResponse response = client.predict(request);
             List<Float> result = response.getFloatVals("probs");

+ 9 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/util/DateUtils.java

@@ -4,6 +4,7 @@ import java.text.SimpleDateFormat;
 import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
+import java.time.ZonedDateTime;
 import java.util.Calendar;
 import java.util.Date;
 
@@ -43,4 +44,12 @@ public final class DateUtils {
                 .getDayOfWeek()
                 .getValue();
     }
+
+    public static int getHourQuarter(long timestamp) {
+        Instant instant = Instant.ofEpochMilli(timestamp);
+        ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());
+        int hour = zonedDateTime.getHour();
+        int minute = zonedDateTime.getMinute();
+        return minute / 15 + hour * 4;
+    }
 }

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

@@ -57,9 +57,18 @@ public class RankStrategyBy688 extends RankStrategyBasic {
         this.initSparseFeatureNames();
     }
 
+    private static final List<String> notHasChannelScenes = new ArrayList<String>() {{
+
+        add("longArticles");
+        add("fwhhzdyy");
+        add("gzhhzdx");
+        add("WeCom");
+        add("video");
+        add("xcxImport");
+    }};
+
     @Override
     public List<AdRankItem> adItemRank(RankRecommendRequestParam request, ScoreParam scoreParam) {
-
         Map<String, Double> weightParam = ObjUtil.nullOrDefault(weightMap, new HashMap<>());
 
 
@@ -109,6 +118,31 @@ public class RankStrategyBy688 extends RankStrategyBasic {
         userFeatureMap.put("user_vid_return_tags_3d", e1Feature.getOrDefault("tags_3d", null));
         userFeatureMap.put("user_vid_return_tags_7d", e1Feature.getOrDefault("tags_7d", null));
         userFeatureMap.put("user_vid_return_tags_14d", e1Feature.getOrDefault("tags_14d", null));
+        userFeatureMap.put("title_split", d3Feature.getOrDefault("title_split", null));
+
+        if(request.getAppType() != null){
+            userFeatureMap.put("apptype", String.valueOf(request.getAppType()));
+        }
+
+        String rootSessionId = request.getRootSessionId();
+        String sessionId = request.getSessionId();
+        String subSessionId = request.getSubSessionId();
+        String rootSourceId = request.getRootSourceId();
+        int isFirstLayer;
+        if (Objects.equals(rootSessionId, subSessionId) || Objects.equals(rootSessionId, sessionId)) {
+            isFirstLayer = 1;
+        } else {
+            isFirstLayer = 2;
+        }
+        userFeatureMap.put("is_first_layer", String.valueOf(isFirstLayer));
+        if (StringUtils.isNotEmpty(rootSourceId)) {
+            String rootSourceScene = rootSourceId.split("_")[0];
+            userFeatureMap.put("root_source_scene", rootSourceScene);
+            if (!notHasChannelScenes.contains(rootSourceScene) && rootSourceId.split("_").length > 1) {
+                String rootSourceChannel = rootSourceId.split("_")[1];
+                userFeatureMap.put("root_source_channel", rootSourceChannel);
+            }
+        }
 
         Map<String, String> sceneFeatureMap = this.handleSceneFeature(ts);
         long time1 = System.currentTimeMillis();
@@ -157,6 +191,7 @@ public class RankStrategyBy688 extends RankStrategyBasic {
                     cidFeatureMap.put("cid", dto.getCreativeId() != null ? String.valueOf(dto.getCreativeId()) : null);
                     cidFeatureMap.put("adid", dto.getAdId() != null ? String.valueOf(dto.getAdId()) : null);
                     cidFeatureMap.put("adverid", dto.getAdVerId());
+                    cidFeatureMap.put("profession", dto.getProfession());
                     return adRankItem;
                 } finally {
                     cdl1.countDown();
@@ -631,6 +666,8 @@ public class RankStrategyBy688 extends RankStrategyBasic {
         Map<String, String> sceneFeatureMap = new HashMap<>();
         sceneFeatureMap.put("hour_" + DateUtils.getHourByTimestamp(ts), "0.1");
         sceneFeatureMap.put("dayofweek_" + DateUtils.getDayOrWeekByTimestamp(ts), "0.1");
+        sceneFeatureMap.put("hour", String.valueOf(DateUtils.getHourByTimestamp(ts)));
+        sceneFeatureMap.put("hour_quarter", String.valueOf(DateUtils.getHourQuarter(ts)));
         return sceneFeatureMap;
     }
 
@@ -690,6 +727,14 @@ public class RankStrategyBy688 extends RankStrategyBasic {
             add("user_vid_return_tags_3d");
             add("user_vid_return_tags_7d");
             add("user_vid_return_tags_14d");
+            add("apptype");
+            add("hour");
+            add("hour_quarter");
+            add("root_source_scene");
+            add("root_source_channel");
+            add("is_first_layer");
+            add("title_split");
+            add("profession");
         }};
     }