Ver código fonte

Merge branch 'feature/v3_nor_model' of algorithm/recommend-server into master

jiachanghui 2 meses atrás
pai
commit
e558c8d18a

+ 67 - 15
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV564.java

@@ -11,6 +11,7 @@ import com.tzld.piaoquan.recommend.server.service.recall.strategy.*;
 import com.tzld.piaoquan.recommend.server.service.score.ScorerUtils;
 import com.tzld.piaoquan.recommend.server.util.CommonCollectionUtils;
 import com.tzld.piaoquan.recommend.server.util.FeatureBucketUtils;
+import com.tzld.piaoquan.recommend.server.util.FeatureUtils;
 import com.tzld.piaoquan.recommend.server.util.SimilarityUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.MapUtils;
@@ -39,6 +40,8 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
     private static final List<String> cfRovList = Collections.singletonList("rovn");
     private static final List<String> videoSimAttrs = Arrays.asList("cate1_list", "cate2", "cate2_list",
             "keywords", "style", "theme", "title", "topic", "user_value");
+    private static final List<String> videoCateAttr = Arrays.asList(FeatureUtils.cate1Attr, FeatureUtils.cate2Attr, FeatureUtils.festive1Attr);
+    private static final double smoothPlus = 5.0;
 
     @Override
     public List<Video> mergeAndRankRovRecall(RankParam param) {
@@ -47,7 +50,7 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
         //-------------------合-------------------
         //-------------------逻-------------------
         //-------------------辑-------------------
-
+        long currentMs = System.currentTimeMillis();
         List<Video> oldRovs = new ArrayList<>();
         oldRovs.addAll(extractAndSort(param, RegionHRecallStrategy.PUSH_FORM));
         oldRovs.addAll(extractAndSort(param, RegionHDupRecallStrategy.PUSH_FORM));
@@ -72,7 +75,7 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
         //-------------------新地域召回------------------
         List<Video> v1 = extractAndSort(param, RegionRealtimeRecallStrategyV1.PUSH_FORM);
         v1 = v1.stream().filter(r -> !setVideo.contains(r.getVideoId())).collect(Collectors.toList());
-        v1 = v1.subList(0, Math.min(mergeWeight.getOrDefault("v1", 5.0).intValue(), v1.size()));
+        v1 = v1.subList(0, Math.min(mergeWeight.getOrDefault("v1", 10.0).intValue(), v1.size()));
         rovRecallRank.addAll(v1);
         setVideo.addAll(v1.stream().map(Video::getVideoId).collect(Collectors.toSet()));
         //-------------------scene cf rovn------------------
@@ -119,6 +122,9 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
         Map<String, String> c8 = featureOriginUser.getOrDefault("alg_mid_feature_sharecf", new HashMap<>());
         Map<String, String> c9 = featureOriginUser.getOrDefault("alg_mid_feature_returncf", new HashMap<>());
 
+        // time feature
+        addTimeFeature(currentMs, userFeatureMapDouble);
+
         if (!c1.isEmpty()) {
             userFeatureMapDouble.put("playcnt_6h", Double.parseDouble(c1.getOrDefault("playcnt_6h", "0")));
             userFeatureMapDouble.put("playcnt_1d", Double.parseDouble(c1.getOrDefault("playcnt_1d", "0")));
@@ -215,6 +221,7 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
                     double share = tuple4.second.isEmpty() ? 0 : Double.parseDouble(tuple4.second.getOrDefault("share_pv_" + prefix2, "0.0"));
                     double returns = tuple4.third.isEmpty() ? 0 : Double.parseDouble(tuple4.third.getOrDefault("return_uv_" + prefix2, "0.0"));
 
+                    double f0 = ExtractorUtils.calLog(exp);
                     double f1 = ExtractorUtils.calDiv(share, exp);
                     double f2 = ExtractorUtils.calLog(share);
                     double f3 = ExtractorUtils.calDiv(returns, exp);
@@ -222,6 +229,7 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
                     double f5 = f3 * f4;
                     double f6 = ExtractorUtils.calDiv(returns, share);
 
+                    String key0 = tuple4.name + "_" + prefix2 + "_" + "EXP";
                     String key1 = tuple4.name + "_" + prefix2 + "_" + "STR";
                     String key2 = tuple4.name + "_" + prefix2 + "_" + "log(share)";
                     String key3 = tuple4.name + "_" + prefix2 + "_" + "ROV";
@@ -229,6 +237,7 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
                     String key5 = tuple4.name + "_" + prefix2 + "_" + "ROV*log(return)";
                     String key6 = tuple4.name + "_" + prefix2 + "_" + "ROS";
 
+                    featureMap.put(key0, f0);
                     featureMap.put(key1, f1);
                     featureMap.put(key2, f2);
                     featureMap.put(key3, f3);
@@ -296,6 +305,8 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
             addVideoStatFeature(vid, featureOriginVideo, featureMap);
             //addVideoCFFeature(vid, featureOriginVideo, featureMap);
             addVideoSimFeature(headVideoInfo, videoInfo, featureMap);
+            addVideoAttrFeature(videoInfo, featureMap);
+            addVideoTimeFeature(currentMs, videoInfo, featureMap);
 
             item.featureMapDouble = featureMap;
         }
@@ -303,7 +314,7 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
         // 3 连续值特征分桶
         readBucketFile();
         Map<String, String> userFeatureMap = new HashMap<>(userFeatureMapDouble.size());
-        Map<String, String> norUserFeatureMap = FeatureBucketUtils.bucketFeature("20241209_nor_bucket.txt", userFeatureMapDouble);
+        Map<String, String> norUserFeatureMap = FeatureBucketUtils.noBucketFeature(userFeatureMapDouble);
         for (Map.Entry<String, Double> entry : userFeatureMapDouble.entrySet()) {
             String name = entry.getKey();
             Double score = entry.getValue();
@@ -331,10 +342,10 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
                 }
             }
             item.featureMap = featureMap;
-            item.norFeatureMap = FeatureBucketUtils.bucketFeature("20241209_nor_bucket.txt", featureMapDouble);
+            item.norFeatureMap = FeatureBucketUtils.noBucketFeature(featureMapDouble);
         }
         // 4 排序模型计算
-        double fmRovLogBase = mergeWeight.getOrDefault("fmRovLogBase", 3.5);
+        double fmRovLogBase = mergeWeight.getOrDefault("fmRovLogBase", 2.8);
         double xgbNorScaleType = mergeWeight.getOrDefault("xgbNorScaleType", 0.0);
         double xgbNorBias = mergeWeight.getOrDefault("xgbNorBias", -1.6945);
         double xgbNorWeight = mergeWeight.getOrDefault("xgbNorWeight", 1.8968);
@@ -343,7 +354,7 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
         double vorLogWeight = mergeWeight.getOrDefault("vorLogWeight", 10.0);
         double vorLogBase = mergeWeight.getOrDefault("vorLogBase", 2.6);
         Map<String, String> sceneFeatureMap = new HashMap<>(0);
-        List<RankItem> items = ScorerUtils.getScorerPipeline("feeds_score_config_fm_xgb_20241209.conf").scoring(sceneFeatureMap, userFeatureMap, norUserFeatureMap, rankItems);
+        List<RankItem> items = ScorerUtils.getScorerPipeline("feeds_score_config_fm_xgb_20250218.conf").scoring(sceneFeatureMap, userFeatureMap, norUserFeatureMap, rankItems);
         // 5 排序公式特征
         Map<String, Map<String, String>> vid2MapFeature = this.getVideoRedisFeature(vids, "redis:vid_hasreturn_vor:");
         List<Video> result = new ArrayList<>();
@@ -419,17 +430,20 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
             List<String> infoPeriod = tuple3.second;
             Map<String, String> infoMap = tuple3.third;
             for (String period : infoPeriod) {
+                double view = getVideoOneInfo("view_" + period, infoMap);
                 double share = getVideoOneInfo("share_" + period, infoMap);
                 double return_ = getVideoOneInfo("return_" + period, infoMap);
                 double view_hasreturn = getVideoOneInfo("view_hasreturn_" + period, infoMap);
                 double share_hasreturn = getVideoOneInfo("share_hasreturn_" + period, infoMap);
-                double ros = getVideoOneInfo("ros_" + period, infoMap);
-                double rov = getVideoOneInfo("rov_" + period, infoMap);
-                double r_cnt = getVideoOneInfo("r_cnt_" + period, infoMap);
-                double r_rate = getVideoOneInfo("r_rate_" + period, infoMap);
-                double r_cnt4s = getVideoOneInfo("r_cnt4s_" + period, infoMap);
-                double str = getVideoOneInfo("str_" + period, infoMap);
-
+                double ros = ExtractorUtils.smoothDiv(return_, share, smoothPlus);
+                double rov = ExtractorUtils.smoothDiv(return_, view, smoothPlus);
+                double r_cnt = ExtractorUtils.smoothDiv(return_, view_hasreturn, smoothPlus);
+                double r_rate = ExtractorUtils.smoothDiv(view_hasreturn, view, smoothPlus);
+                double r_cnt4s = ExtractorUtils.smoothDiv(return_, share_hasreturn, smoothPlus);
+                double str = ExtractorUtils.smoothDiv(share, view, smoothPlus);
+                double s2r_rate = ExtractorUtils.smoothDiv(share_hasreturn, share, smoothPlus);
+
+                featureMap.put(infoType + "_" + period + "_" + "view", ExtractorUtils.calLog(view));
                 featureMap.put(infoType + "_" + period + "_" + "share", ExtractorUtils.calLog(share));
                 featureMap.put(infoType + "_" + period + "_" + "return", ExtractorUtils.calLog(return_));
                 featureMap.put(infoType + "_" + period + "_" + "view_hasreturn", ExtractorUtils.calLog(view_hasreturn));
@@ -440,6 +454,7 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
                 featureMap.put(infoType + "_" + period + "_" + "r_rate", r_rate);
                 featureMap.put(infoType + "_" + period + "_" + "r_cnt4s", r_cnt4s);
                 featureMap.put(infoType + "_" + period + "_" + "str", str);
+                featureMap.put(infoType + "_" + period + "_" + "s2r_rate", s2r_rate);
             }
         }
     }
@@ -496,6 +511,43 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
         }
     }
 
+    private void addVideoAttrFeature(Map<String, String> rankInfo, Map<String, Double> featureMap) {
+        if (!rankInfo.isEmpty()) {
+            for (String attr : videoCateAttr) {
+                String attrVal = rankInfo.getOrDefault(attr, "");
+                int attrId = FeatureUtils.getAttrId(attr, attrVal);
+                if (attrId > 0) {
+                    String key = String.format("%s@%s@%d", "r", attr, attrId);
+                    featureMap.put(key, 1.0);
+                }
+            }
+        }
+    }
+
+    private void addVideoTimeFeature(long currentMs, Map<String, String> rankInfo, Map<String, Double> featureMap) {
+        double createTime = 1D;
+        try {
+            if (!rankInfo.isEmpty() && rankInfo.containsKey("gmt_create_timestamp")) {
+                String createMsStr = rankInfo.get("gmt_create_timestamp");
+                long createMs = Long.parseLong(createMsStr);
+                createTime = FeatureUtils.getCreateTime(currentMs, createMs);
+            }
+        } catch (Exception e) {
+            log.error("get video crate time error", e);
+        }
+        featureMap.put("createTime", createTime);
+    }
+
+    private void addTimeFeature(long currentMs, Map<String, Double> featureMap) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTimeInMillis(currentMs);
+
+        int week = calendar.get(Calendar.DAY_OF_WEEK);
+        int hour = calendar.get(Calendar.HOUR_OF_DAY) + 1;
+        featureMap.put("week", week * 1.0);
+        featureMap.put("hour", hour * 1.0);
+    }
+
     private double norCalibration(double scaleType, double polyBias, double polyWeight, double powerWeight, double powerExp, double score) {
         if (scaleType < 1) {
             return norPolyCalibration(polyBias, polyWeight, score);
@@ -506,8 +558,8 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
 
     private double norPolyCalibration(double bias, double weight, double score) {
         double newScore = bias + weight * score;
-        if (newScore < 1E-8) {
-            newScore = 0;
+        if (newScore < score) {
+            newScore = score;
         }
         return newScore;
     }

+ 2 - 2
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV567.java

@@ -525,8 +525,8 @@ public class RankStrategy4RegionMergeModelV567 extends RankStrategy4RegionMergeM
 
     private double norPolyCalibration(double bias, double weight, double score) {
         double newScore = bias + weight * score;
-        if (newScore < 1E-8) {
-            newScore = 0;
+        if (newScore < score) {
+            newScore = score;
         }
         return newScore;
     }

+ 1 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/score/ScorerUtils.java

@@ -34,6 +34,7 @@ public final class ScorerUtils {
         ScorerUtils.init("feeds_score_config_20240807.conf");
         ScorerUtils.init("feeds_score_config_fm_xgb_20241209.conf");
         ScorerUtils.init("feeds_score_config_fm_xgb_20250208.conf");
+        ScorerUtils.init("feeds_score_config_fm_xgb_20250218.conf");
         ScorerUtils.init("feeds_score_config_xgb_20241209.conf");
         ScorerUtils.init("feeds_score_config_xgb_20250109.conf");
         ScorerUtils.init("feeds_score_config_xgb_rov_20241209.conf");

+ 87 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/util/FeatureUtils.java

@@ -0,0 +1,87 @@
+package com.tzld.piaoquan.recommend.server.util;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class FeatureUtils {
+    public static final String cate1Attr = "cate1_list";
+    public static final String cate2Attr = "cate2";
+    public static final String festive1Attr = "festive_label1";
+    private static final Map<String, Integer> cate1MAP = new HashMap<>();
+    private static final Map<String, Integer> cate2MAP = new HashMap<>();
+    private static final Map<String, Integer> festive1Map = new HashMap<>();
+    public static final double oneYearMs = 365 * 24 * 3600 * 1000.0;
+
+    static {
+        cate1MAP.put("情感", 1);
+        cate1MAP.put("音乐", 2);
+        cate1MAP.put("搞笑", 3);
+        cate1MAP.put("生活记录", 4);
+        cate1MAP.put("医疗健康", 5);
+        cate1MAP.put("文化", 6);
+        cate1MAP.put("旅行", 7);
+        cate1MAP.put("美食", 8);
+        cate1MAP.put("历史", 9);
+        cate1MAP.put("科普", 10);
+        cate1MAP.put("艺术", 11);
+        cate1MAP.put("综艺", 12);
+        cate1MAP.put("时政", 13);
+        cate1MAP.put("三农", 14);
+        cate1MAP.put("舞蹈", 15);
+
+        cate2MAP.put("人生忠告", 1);
+        cate2MAP.put("知识科普", 2);
+        cate2MAP.put("祝福音乐", 3);
+        cate2MAP.put("生活小妙招", 4);
+        cate2MAP.put("节日祝福", 5);
+        cate2MAP.put("搞笑段子", 6);
+        cate2MAP.put("怀念时光", 7);
+        cate2MAP.put("早中晚好", 8);
+        cate2MAP.put("风景实拍", 9);
+        cate2MAP.put("动物萌宠", 10);
+        cate2MAP.put("美食教程", 11);
+        cate2MAP.put("国家力量", 12);
+        cate2MAP.put("中国历史影像", 13);
+        cate2MAP.put("杂技柔术", 14);
+        cate2MAP.put("健康知识", 15);
+        cate2MAP.put("传统文化", 16);
+        cate2MAP.put("长寿知识", 17);
+        cate2MAP.put("社会风气", 18);
+        cate2MAP.put("大型集体艺术", 19);
+        cate2MAP.put("省份城市亮点", 20);
+        cate2MAP.put("民生政策", 21);
+        cate2MAP.put("健身操", 22);
+        cate2MAP.put("亲情音乐", 23);
+        cate2MAP.put("天气变化", 24);
+        cate2MAP.put("人财诈骗", 25);
+        cate2MAP.put("正能量剧情", 26);
+
+        festive1Map.put("节假日", 1);
+        festive1Map.put("问候语", 2);
+        festive1Map.put("祝福语", 3);
+        festive1Map.put("节气", 4);
+        festive1Map.put("热点", 5);
+        festive1Map.put("人物", 6);
+    }
+
+    public static int getAttrId(String cate, String value) {
+        switch (cate) {
+            case cate1Attr:
+                return cate1MAP.getOrDefault(value, 0);
+            case cate2Attr:
+                return cate2MAP.getOrDefault(value, 0);
+            case festive1Attr:
+                return festive1Map.getOrDefault(value, 0);
+            default:
+                return 0;
+        }
+    }
+
+    public static double getCreateTime(long currentMs, long createMs) {
+        double diff = (currentMs - createMs) / oneYearMs;
+        if (diff > 1.0) {
+            diff = 1.0;
+        }
+        return diff;
+    }
+}

+ 4 - 0
recommend-server-service/src/main/resources/application-dev.yml

@@ -77,6 +77,10 @@ spring:
       clusterPort: 3717
       secondaryHost: dds-bp1de4fc73029b241978.mongodb.rds.aliyuncs.com
       secondaryPort: 3717
+      thirdHost: dds-bp1de4fc73029b241978.mongodb.rds.aliyuncs.com
+      thirdPort: 3717
+      fourthHost: dds-bp1de4fc73029b241978.mongodb.rds.aliyuncs.com
+      fourthPort: 3717
       database: longvideo
       username: lv
       password: lv@2018

+ 4 - 0
recommend-server-service/src/main/resources/application-test.yml

@@ -77,6 +77,10 @@ spring:
       clusterPort: 3717
       secondaryHost: dds-bp1de4fc73029b241978.mongodb.rds.aliyuncs.com
       secondaryPort: 3717
+      thirdHost: dds-bp1de4fc73029b241978.mongodb.rds.aliyuncs.com
+      thirdPort: 3717
+      fourthHost: dds-bp1de4fc73029b241978.mongodb.rds.aliyuncs.com
+      fourthPort: 3717
       database: longvideo
       username: lv
       password: lv@2018

+ 287 - 0
recommend-server-service/src/main/resources/feeds_score_config_fm_xgb_20250218.conf

@@ -0,0 +1,287 @@
+scorer-config = {
+  rov-score-config = {
+     scorer-name = "com.tzld.piaoquan.recommend.server.service.score.VlogRovFMScorer"
+     scorer-priority = 96
+     model-path = "zhangbo/model_aka8_new2.txt"
+  }
+  nor-score-config = {
+    scorer-name = "com.tzld.piaoquan.recommend.server.service.score.NorXGBRegressionScorer"
+    scorer-priority = 97
+    model-path = "zhangbo/model_xgb_for_recsys_v3_nor.tar.gz"
+    param = {
+      localDir = "xgboost/recsys_v3_nor"
+      features = [
+      "b111213_1d_ROS",
+      "b111213_1d_ROV*log(return)",
+      "b111213_2h_ROS",
+      "b111213_2h_ROV*log(return)",
+      "b111213_3d_ROS",
+      "b111213_3d_ROV*log(return)",
+      "b111213_7d_ROS",
+      "b111213_7d_ROV*log(return)",
+      "b123_1d_ROS",
+      "b123_1d_ROV*log(return)",
+      "b123_2h_ROS",
+      "b123_2h_ROV*log(return)",
+      "b123_3d_ROS",
+      "b123_3d_ROV*log(return)",
+      "b123_7d_ROS",
+      "b123_7d_ROV*log(return)",
+      "b167_1d_ROS",
+      "b167_1d_ROV*log(return)",
+      "b167_2h_ROS",
+      "b167_2h_ROV*log(return)",
+      "b167_3d_ROS",
+      "b167_3d_ROV*log(return)",
+      "b167_7d_ROS",
+      "b167_7d_ROV*log(return)",
+      "b171819_1d_ROS",
+      "b171819_1d_ROV*log(return)",
+      "b171819_2h_ROS",
+      "b171819_2h_ROV*log(return)",
+      "b171819_3d_ROS",
+      "b171819_3d_ROV*log(return)",
+      "b171819_7d_ROS",
+      "b171819_7d_ROV*log(return)",
+      "b20_24h_r_cnt",
+      "b20_24h_r_cnt4s",
+      "b20_24h_ros",
+      "b20_24h_share_hasreturn",
+      "b20_2h_r_cnt",
+      "b20_2h_r_cnt4s",
+      "b20_2h_ros",
+      "b20_2h_share_hasreturn",
+      "b20_7d_r_cnt",
+      "b20_7d_r_cnt4s",
+      "b20_7d_ros",
+      "b20_7d_share_hasreturn",
+      "b21_24h_r_cnt",
+      "b21_24h_r_cnt4s",
+      "b21_24h_ros",
+      "b21_24h_share_hasreturn",
+      "b21_2h_r_cnt",
+      "b21_2h_r_cnt4s",
+      "b21_2h_ros",
+      "b21_2h_share_hasreturn",
+      "b21_7d_r_cnt",
+      "b21_7d_r_cnt4s",
+      "b21_7d_ros",
+      "b21_7d_share_hasreturn",
+      "b22_24h_r_cnt",
+      "b22_24h_r_cnt4s",
+      "b22_24h_ros",
+      "b22_24h_share_hasreturn",
+      "b22_2h_r_cnt",
+      "b22_2h_r_cnt4s",
+      "b22_2h_ros",
+      "b22_2h_share_hasreturn",
+      "b22_7d_r_cnt",
+      "b22_7d_r_cnt4s",
+      "b22_7d_ros",
+      "b22_7d_share_hasreturn",
+      "b23_14d_r_cnt",
+      "b23_14d_r_cnt4s",
+      "b23_14d_ros",
+      "b23_14d_share_hasreturn",
+      "b23_30d_r_cnt",
+      "b23_30d_r_cnt4s",
+      "b23_30d_ros",
+      "b23_30d_share_hasreturn",
+      "b24_14d_r_cnt",
+      "b24_14d_r_cnt4s",
+      "b24_14d_ros",
+      "b24_14d_share_hasreturn",
+      "b24_30d_r_cnt",
+      "b24_30d_r_cnt4s",
+      "b24_30d_ros",
+      "b24_30d_share_hasreturn",
+      "b25_14d_r_cnt",
+      "b25_14d_r_cnt4s",
+      "b25_14d_ros",
+      "b25_14d_share_hasreturn",
+      "b25_30d_r_cnt",
+      "b25_30d_r_cnt4s",
+      "b25_30d_ros",
+      "b25_30d_share_hasreturn",
+      "b26_35d_r_cnt",
+      "b26_35d_r_cnt4s",
+      "b26_35d_ros",
+      "b26_35d_share_hasreturn",
+      "b26_365d_r_cnt",
+      "b26_365d_r_cnt4s",
+      "b26_365d_ros",
+      "b26_365d_share_hasreturn",
+      "b26_7d_r_cnt",
+      "b26_7d_r_cnt4s",
+      "b26_7d_ros",
+      "b26_7d_share_hasreturn",
+      "b26_90d_r_cnt",
+      "b26_90d_r_cnt4s",
+      "b26_90d_ros",
+      "b26_90d_share_hasreturn",
+      "b27_35d_r_cnt",
+      "b27_35d_r_cnt4s",
+      "b27_35d_ros",
+      "b27_35d_share_hasreturn",
+      "b27_365d_r_cnt",
+      "b27_365d_r_cnt4s",
+      "b27_365d_ros",
+      "b27_365d_share_hasreturn",
+      "b27_7d_r_cnt",
+      "b27_7d_r_cnt4s",
+      "b27_7d_ros",
+      "b27_7d_share_hasreturn",
+      "b27_90d_r_cnt",
+      "b27_90d_r_cnt4s",
+      "b27_90d_ros",
+      "b27_90d_share_hasreturn",
+      "b28_24h_r_cnt",
+      "b28_24h_r_cnt4s",
+      "b28_24h_ros",
+      "b28_24h_share_hasreturn",
+      "b28_2h_r_cnt",
+      "b28_2h_r_cnt4s",
+      "b28_2h_ros",
+      "b28_2h_share_hasreturn",
+      "b28_7d_r_cnt",
+      "b28_7d_r_cnt4s",
+      "b28_7d_ros",
+      "b28_7d_share_hasreturn",
+      "b8910_1d_ROS",
+      "b8910_1d_ROV*log(return)",
+      "b8910_2h_ROS",
+      "b8910_2h_ROV*log(return)",
+      "b8910_3d_ROS",
+      "b8910_3d_ROV*log(return)",
+      "b8910_7d_ROS",
+      "b8910_7d_ROV*log(return)",
+      "bit_rate",
+      "c3_feature_tags_1d_avgscore",
+      "c3_feature_tags_1d_matchnum",
+      "c3_feature_tags_1d_maxscore",
+      "c3_feature_tags_3d_avgscore",
+      "c3_feature_tags_3d_matchnum",
+      "c3_feature_tags_3d_maxscore",
+      "c3_feature_tags_7d_avgscore",
+      "c3_feature_tags_7d_matchnum",
+      "c3_feature_tags_7d_maxscore",
+      "c4_feature_tags_1d_avgscore",
+      "c4_feature_tags_1d_matchnum",
+      "c4_feature_tags_1d_maxscore",
+      "c4_feature_tags_3d_avgscore",
+      "c4_feature_tags_3d_matchnum",
+      "c4_feature_tags_3d_maxscore",
+      "c4_feature_tags_7d_avgscore",
+      "c4_feature_tags_7d_matchnum",
+      "c4_feature_tags_7d_maxscore",
+      "c5_feature_tags_1d_avgscore",
+      "c5_feature_tags_1d_matchnum",
+      "c5_feature_tags_1d_maxscore",
+      "c5_feature_tags_3d_avgscore",
+      "c5_feature_tags_3d_matchnum",
+      "c5_feature_tags_3d_maxscore",
+      "c5_feature_tags_7d_avgscore",
+      "c5_feature_tags_7d_matchnum",
+      "c5_feature_tags_7d_maxscore",
+      "c6_feature_tags_1d_avgscore",
+      "c6_feature_tags_1d_matchnum",
+      "c6_feature_tags_1d_maxscore",
+      "c6_feature_tags_3d_avgscore",
+      "c6_feature_tags_3d_matchnum",
+      "c6_feature_tags_3d_maxscore",
+      "c6_feature_tags_7d_avgscore",
+      "c6_feature_tags_7d_matchnum",
+      "c6_feature_tags_7d_maxscore",
+      "c7_feature_tags_1d_avgscore",
+      "c7_feature_tags_1d_matchnum",
+      "c7_feature_tags_1d_maxscore",
+      "c7_feature_tags_3d_avgscore",
+      "c7_feature_tags_3d_matchnum",
+      "c7_feature_tags_3d_maxscore",
+      "c7_feature_tags_7d_avgscore",
+      "c7_feature_tags_7d_matchnum",
+      "c7_feature_tags_7d_maxscore",
+      "c8_feature_return_num",
+      "c8_feature_return_rank",
+      "c8_feature_return_score",
+      "c8_feature_share_num",
+      "c8_feature_share_rank",
+      "c8_feature_share_score",
+      "c9_feature_return_num",
+      "c9_feature_return_rank",
+      "c9_feature_return_score",
+      "c9_feature_share_num",
+      "c9_feature_share_rank",
+      "c9_feature_share_score",
+      "return_uv_12h",
+      "return_uv_1d",
+      "return_uv_3d",
+      "return_uv_7d",
+      "share_pv_12h",
+      "share_pv_1d",
+      "share_pv_3d",
+      "share_pv_7d",
+      "total_time",
+      "video_sim_cate1_list",
+      "video_sim_cate2",
+      "video_sim_cate2_list",
+      "video_sim_keywords",
+      "video_sim_style",
+      "video_sim_theme",
+      "video_sim_title",
+      "video_sim_topic",
+      "video_sim_user_value",
+      "b111213_1d_EXP",
+      "b111213_2h_EXP",
+      "b111213_3d_EXP",
+      "b111213_7d_EXP",
+      "b123_1d_EXP",
+      "b123_2h_EXP",
+      "b123_3d_EXP",
+      "b123_7d_EXP",
+      "b167_1d_EXP",
+      "b167_2h_EXP",
+      "b167_3d_EXP",
+      "b167_7d_EXP",
+      "b171819_1d_EXP",
+      "b171819_2h_EXP",
+      "b171819_3d_EXP",
+      "b171819_7d_EXP",
+      "b8910_1d_EXP",
+      "b8910_2h_EXP",
+      "b8910_3d_EXP",
+      "b8910_7d_EXP",
+      "b27_35d_view",
+      "b27_365d_view",
+      "b27_7d_view",
+      "b27_90d_view",
+      "b29_24h_view",
+      "b29_2h_view",
+      "b29_7d_view",
+      "b29_24h_r_cnt",
+      "b29_24h_r_cnt4s",
+      "b29_24h_ros",
+      "b29_24h_share_hasreturn",
+      "b29_2h_r_cnt",
+      "b29_2h_r_cnt4s",
+      "b29_2h_ros",
+      "b29_2h_share_hasreturn",
+      "b29_7d_r_cnt",
+      "b29_7d_r_cnt4s",
+      "b29_7d_ros",
+      "b29_7d_share_hasreturn",
+      "hour",
+      "createTime",
+      "b28_2h_view",
+      "b28_24h_view",
+      "b28_7d_view",
+      "b28_2h_s2r_rate",
+      "b28_24h_s2r_rate",
+      "b28_7d_s2r_rate",
+      "b29_2h_s2r_rate",
+      "b29_24h_s2r_rate",
+      "b29_7d_s2r_rate"
+      ]
+    }
+  }
+}