瀏覽代碼

线上增加特征

xueyiming 1 月之前
父節點
當前提交
33cf65059d

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

@@ -43,7 +43,11 @@ public class PAIModelV1 {
     };
 
     private static final String[] sparseLongFeatures = {
-            "vid", "cid", "adid", "adverid"
+            "vid"
+    };
+
+    private static final String[] sparseAdLongFeatures = {
+            "cid", "adid", "adverid"
     };
 
     private final String[] userFeatures = {
@@ -79,11 +83,12 @@ public class PAIModelV1 {
                 double v = NumberUtils.toDouble(userFeatureMap.getOrDefault(key, "0.0"), 0.0);
                 request.addFeed(feature.toLowerCase(), TFDataType.DT_DOUBLE, new long[]{1}, new double[]{v});
             }
-            Map<String, double[]> feed = new HashMap<>();
+            Map<String, double[]> doubleFeed = new HashMap<>();
+            Map<String, long[]> longFeed = new HashMap<>();
             for (int i = 0; i < items.size(); i++) {
                 for (String feature : itemFeatures) {
                     String key = feature.replace("_x_", "*").replace("_view", "(view)");
-                    double[] doubles = feed.computeIfAbsent(feature, k -> new double[items.size()]);
+                    double[] doubles = doubleFeed.computeIfAbsent(feature, k -> new double[items.size()]);
                     if (MapUtils.isEmpty(items.get(i).getFeatureMap())) {
                         doubles[i] = 0.0;
                         continue;
@@ -91,10 +96,25 @@ public class PAIModelV1 {
                     double v = NumberUtils.toDouble(items.get(i).getFeatureMap().getOrDefault(key, "0.0"), 0.0);
                     doubles[i] = v;
                 }
+
+                for (String feature : sparseAdLongFeatures) {
+                    String key = feature.replace("_x_", "*").replace("_view", "(view)");
+                    long[] longs = longFeed.computeIfAbsent(feature, k -> new long[items.size()]);
+                    if (MapUtils.isEmpty(items.get(i).getFeatureMap())) {
+                        longs[i] = 0L;
+                        continue;
+                    }
+                    long v = NumberUtils.toLong(items.get(i).getFeatureMap().getOrDefault(key, "0"), 0L);
+                    longs[i] = v;
+                }
             }
-            for (Map.Entry<String, double[]> entry : feed.entrySet()) {
+            for (Map.Entry<String, double[]> entry : doubleFeed.entrySet()) {
                 request.addFeed(entry.getKey(), TFDataType.DT_DOUBLE, new long[]{items.size()}, entry.getValue());
             }
+
+            for (Map.Entry<String, long[]> entry : longFeed.entrySet()) {
+                request.addFeed(entry.getKey(), TFDataType.DT_INT64, new long[]{items.size()}, entry.getValue());
+            }
             request.addFetch("probs");
             TFResponse response = client.predict(request);
             List<Float> result = response.getFloatVals("probs");

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

@@ -12,6 +12,7 @@ import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRankItem;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang.math.NumberUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
@@ -95,6 +96,18 @@ public class RankStrategyBy683 extends RankStrategyBasic {
         Map<String, String> e1Feature = userFeature.getOrDefault("alg_mid_feature_return_tags", new HashMap<>());
         Map<String, String> e2Feature = userFeature.getOrDefault("alg_mid_feature_share_tags", new HashMap<>());
 
+        userFeatureMap.put("brand", request.getMachineInfo().getBrand().toUpperCase());
+        userFeatureMap.put("region", request.getRegion());
+        userFeatureMap.put("city", request.getCity());
+        userFeatureMap.put("vid", String.valueOf(request.getVideoId()));
+        userFeatureMap.put("merge_first_level_cate", d3Feature.get("merge_first_level_cate"));
+        userFeatureMap.put("merge_second_level_cate", d3Feature.get("merge_second_level_cate"));
+        userFeatureMap.put("user_vid_return_tags_2h", e1Feature.getOrDefault("tags_2h", null));
+        userFeatureMap.put("user_vid_return_tags_1d", e1Feature.getOrDefault("tags_1d", null));
+        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));
+
         Map<String, String> sceneFeatureMap = this.handleSceneFeature(ts);
         long time1 = System.currentTimeMillis();
 
@@ -138,6 +151,10 @@ public class RankStrategyBy683 extends RankStrategyBasic {
                     this.handleC1UIFeature(midTimeDiffMap, actionStaticMap, cidFeatureMap, cidStr);
                     this.handleD1Feature(d1Feature, cidFeatureMap);
                     this.handleD2Feature(vidRankMaps, cidFeatureMap, cidStr);
+
+                    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());
                     return adRankItem;
                 } finally {
                     cdl1.countDown();
@@ -411,7 +428,18 @@ public class RankStrategyBy683 extends RankStrategyBasic {
         featureMap.put("ctcvr_all", String.valueOf(NumUtil.div(converAll, viewAll)));
         featureMap.put("cvr_all", String.valueOf(NumUtil.div(clickAll, converAll)));
         featureMap.put("ecpm_all", String.valueOf(NumUtil.div(incomeAll * 1000, viewAll)));
-
+        if (CollectionUtils.isEmpty(midActionList)) {
+            List<String> cidList = new ArrayList<>();
+            List<String> converList = new ArrayList<>();
+            for (TupleMapEntry<Tuple5> tupleMapEntry : midActionList) {
+                String cid = tupleMapEntry.key;
+                String conver = tupleMapEntry.value.f3;
+                cidList.add(cid);
+                converList.add(conver);
+            }
+            featureMap.put("user_cid_click_list", String.join(",", cidList));
+            featureMap.put("user_cid_conver_list", String.join(",", converList));
+        }
         return midActionList;
     }
 
@@ -643,9 +671,18 @@ public class RankStrategyBy683 extends RankStrategyBasic {
     }
 
     private Map<String, String> featureBucket(Map<String, String> featureMap) {
+        Set<String> keys = new HashSet<String>() {{
+            add("cid");
+            add("adid");
+            add("adverid");
+        }};
         Map<String, String> newFeatureMap = new ConcurrentHashMap<>(featureMap.size());
         for (Map.Entry<String, String> entry : featureMap.entrySet()) {
             String name = entry.getKey();
+            if (keys.contains(name)) {
+                newFeatureMap.put(name, entry.getKey());
+                continue;
+            }
             double score = Double.parseDouble(entry.getValue());
             // 注意:0值、不在分桶文件中的特征,会被过滤掉。
             if (score > 1E-8) {
@@ -659,7 +696,6 @@ public class RankStrategyBy683 extends RankStrategyBasic {
                 }
             }
         }
-
         return newFeatureMap;
     }