Quellcode durchsuchen

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

jiachanghui vor 2 Monaten
Ursprung
Commit
26b7d2022f

+ 6 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/extractor/ExtractorUtils.java

@@ -94,6 +94,12 @@ public class ExtractorUtils {
         }
         return a / b;
     }
+    public static Double smoothDiv(double a, double b, double plus){
+        if (a == 0 || b == 0){
+            return 0D;
+        }
+        return a / (b + plus);
+    }
     public static Double calLog(double a){
         if (a <= 0){
             return 0D;

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

@@ -340,6 +340,8 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
         double xgbNorWeight = mergeWeight.getOrDefault("xgbNorWeight", 1.8968);
         double xgbNorPowerWeight = mergeWeight.getOrDefault("xgbNorPowerWeight", 1.2216);
         double xgbNorPowerExp = mergeWeight.getOrDefault("xgbNorPowerExp", 1.3217);
+        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);
         // 5 排序公式特征
@@ -351,14 +353,15 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
             item.getScoresMap().put("fmRovOrigin", fmRovOrigin);
             double fmRov = restoreScore(fmRovOrigin);
             item.getScoresMap().put("fmRov", fmRov);
-            double newFmRov = log(1 + fmRov, fmRovLogBase);
+            double newFmRov = logRov(fmRov, fmRovLogBase);
             double hasReturnRovScore = Double.parseDouble(vid2MapFeature.getOrDefault(item.getVideoId() + "", new HashMap<>()).getOrDefault("rov", "0"));
             item.getScoresMap().put("hasReturnRovScore", hasReturnRovScore);
             double norXGBScore = item.getScoresMap().getOrDefault("NorXGBScore", 0d);
             double newNorXGBScore = norCalibration(xgbNorScaleType, xgbNorBias, xgbNorWeight, xgbNorPowerWeight, xgbNorPowerExp, norXGBScore);
             double vor = Double.parseDouble(vid2MapFeature.getOrDefault(item.getVideoId() + "", new HashMap<>()).getOrDefault("vor", "0"));
+            double newVor = logVor(vorLogWeight, vor, vorLogBase);
             item.getScoresMap().put("vor", vor);
-            score = newFmRov * (0.1 + newNorXGBScore) * (0.1 + vor);
+            score = newFmRov * (0.1 + newNorXGBScore) * (0.1 + newVor);
             Video video = item.getVideo();
             video.setScore(score);
             video.setSortScore(score);
@@ -493,22 +496,6 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
         }
     }
 
-    private double rovCalibration(double bias, double weight, double squareWeight, double cubeWeight, double score) {
-        double newScore = bias + weight * score;
-        if (Math.abs(squareWeight) > 1E-8) {
-            newScore += squareWeight * Math.pow(score, 2);
-        }
-        if (Math.abs(cubeWeight) > 1E-8) {
-            newScore += cubeWeight * Math.pow(score, 3);
-        }
-        if (newScore < 1E-8) {
-            newScore = score;
-        } else if (newScore > 0.9) {
-            newScore = 0.9;
-        }
-        return newScore;
-    }
-
     private double norCalibration(double scaleType, double polyBias, double polyWeight, double powerWeight, double powerExp, double score) {
         if (scaleType < 1) {
             return norPolyCalibration(polyBias, polyWeight, score);
@@ -529,13 +516,23 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
         double newScore = weight * Math.pow(score, exp);
         if (newScore > 100) {
             newScore = 100;
+        } else if (newScore < score) {
+            newScore = score;
         }
         return newScore;
     }
 
-    private double log(double x, double base) {
+    private double logRov(double x, double base) {
+        if (base > 1) {
+            return Math.log(1 + x) / Math.log(base);
+        } else {
+            return x;
+        }
+    }
+
+    private double logVor(double weight, double x, double base) {
         if (base > 1) {
-            return Math.log(x) / Math.log(base);
+            return weight * Math.log(1 + x / 10) / Math.log(base);
         } else {
             return x;
         }

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

@@ -39,6 +39,7 @@ public class RankStrategy4RegionMergeModelV567 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 double smoothPlus = 5.0;
 
     @Override
     public List<Video> mergeAndRankRovRecall(RankParam param) {
@@ -55,7 +56,7 @@ public class RankStrategy4RegionMergeModelV567 extends RankStrategy4RegionMergeM
         oldRovs.addAll(extractAndSort(param, RegionRelative24HRecallStrategy.PUSH_FORM));
         oldRovs.addAll(extractAndSort(param, RegionRelative24HDupRecallStrategy.PUSH_FORM));
         removeDuplicate(oldRovs);
-        int sizeReturn = param.getSize();
+        int sizeReturn = param.getSize() + 2;
         List<Video> v0 = oldRovs.size() <= sizeReturn
                 ? oldRovs
                 : oldRovs.subList(0, sizeReturn);
@@ -72,7 +73,7 @@ public class RankStrategy4RegionMergeModelV567 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 +120,9 @@ public class RankStrategy4RegionMergeModelV567 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(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 +219,7 @@ public class RankStrategy4RegionMergeModelV567 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 +227,7 @@ public class RankStrategy4RegionMergeModelV567 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 +235,7 @@ public class RankStrategy4RegionMergeModelV567 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);
@@ -303,7 +310,7 @@ public class RankStrategy4RegionMergeModelV567 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,7 +338,7 @@ public class RankStrategy4RegionMergeModelV567 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", 2.8);
@@ -340,8 +347,10 @@ public class RankStrategy4RegionMergeModelV567 extends RankStrategy4RegionMergeM
         double xgbNorWeight = mergeWeight.getOrDefault("xgbNorWeight", 1.8968);
         double xgbNorPowerWeight = mergeWeight.getOrDefault("xgbNorPowerWeight", 1.2216);
         double xgbNorPowerExp = mergeWeight.getOrDefault("xgbNorPowerExp", 1.3217);
+        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_20250208.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<>();
@@ -351,14 +360,15 @@ public class RankStrategy4RegionMergeModelV567 extends RankStrategy4RegionMergeM
             item.getScoresMap().put("fmRovOrigin", fmRovOrigin);
             double fmRov = restoreScore(fmRovOrigin);
             item.getScoresMap().put("fmRov", fmRov);
-            double newFmRov = log(1 + fmRov, fmRovLogBase);
+            double newFmRov = logRov(fmRov, fmRovLogBase);
             double hasReturnRovScore = Double.parseDouble(vid2MapFeature.getOrDefault(item.getVideoId() + "", new HashMap<>()).getOrDefault("rov", "0"));
             item.getScoresMap().put("hasReturnRovScore", hasReturnRovScore);
             double norXGBScore = item.getScoresMap().getOrDefault("NorXGBScore", 0d);
             double newNorXGBScore = norCalibration(xgbNorScaleType, xgbNorBias, xgbNorWeight, xgbNorPowerWeight, xgbNorPowerExp, norXGBScore);
             double vor = Double.parseDouble(vid2MapFeature.getOrDefault(item.getVideoId() + "", new HashMap<>()).getOrDefault("vor", "0"));
+            double newVor = logVor(vorLogWeight, vor, vorLogBase);
             item.getScoresMap().put("vor", vor);
-            score = newFmRov * (0.1 + newNorXGBScore) * (0.1 + vor);
+            score = newFmRov * (0.1 + newNorXGBScore) * (0.1 + newVor);
             Video video = item.getVideo();
             video.setScore(score);
             video.setSortScore(score);
@@ -416,17 +426,19 @@ public class RankStrategy4RegionMergeModelV567 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);
+
+                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));
@@ -493,6 +505,16 @@ public class RankStrategy4RegionMergeModelV567 extends RankStrategy4RegionMergeM
         }
     }
 
+    private void addTimeFeature(Map<String, Double> featureMap) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTimeInMillis(System.currentTimeMillis());
+
+        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);
@@ -513,13 +535,23 @@ public class RankStrategy4RegionMergeModelV567 extends RankStrategy4RegionMergeM
         double newScore = weight * Math.pow(score, exp);
         if (newScore > 100) {
             newScore = 100;
+        } else if (newScore < score) {
+            newScore = score;
         }
         return newScore;
     }
 
-    private double log(double x, double base) {
+    private double logRov(double x, double base) {
+        if (base > 1) {
+            return Math.log(1 + x) / Math.log(base);
+        } else {
+            return x;
+        }
+    }
+
+    private double logVor(double weight, double x, double base) {
         if (base > 1) {
-            return Math.log(x) / Math.log(base);
+            return weight * Math.log(1 + x / 10) / Math.log(base);
         } else {
             return x;
         }

+ 2 - 2
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/score/NorXGBRegressionScorer.java

@@ -147,8 +147,8 @@ public class NorXGBRegressionScorer extends XGBRegressionModelScorer {
         }
         if (pro < 1E-8) {
             pro = 0;
-        } else if (pro > 50) {
-            pro = 50;
+        } else if (pro > 80) {
+            pro = 80;
         }
         item.getScoresMap().put("NorXGBScore", pro);
         return pro;

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

@@ -33,6 +33,7 @@ public final class ScorerUtils {
         ScorerUtils.init("feeds_score_config_20240609.conf");
         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_xgb_20241209.conf");
         ScorerUtils.init("feeds_score_config_xgb_20250109.conf");
         ScorerUtils.init("feeds_score_config_xgb_rov_20241209.conf");

+ 15 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/util/FeatureBucketUtils.java

@@ -32,6 +32,21 @@ public class FeatureBucketUtils {
         log.info("load {} bucketFile", featureBucketMap.size());
     }
 
+    public static Map<String, String> noBucketFeature(Map<String, Double> srcFeature) {
+        if (MapUtils.isEmpty(srcFeature)) {
+            return new HashMap<>();
+        }
+        Map<String, String> featureMap = new HashMap<>(srcFeature.size());
+        for (Map.Entry<String, Double> entry : srcFeature.entrySet()) {
+            String name = entry.getKey();
+            Double score = entry.getValue();
+            if (score > 1E-8) {
+                featureMap.put(name, String.valueOf(score));
+            }
+        }
+        return featureMap;
+    }
+
     public static Map<String, String> bucketFeature(String bucketFile, Map<String, Double> srcFeature) {
         if (MapUtils.isEmpty(srcFeature)) {
             return new HashMap<>();

+ 277 - 0
recommend-server-service/src/main/resources/feeds_score_config_fm_xgb_20250208.conf

@@ -0,0 +1,277 @@
+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_v2_nor.tar.gz"
+    param = {
+      localDir = "xgboost/recsys_v2_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"
+      ]
+    }
+  }
+}