Quellcode durchsuchen

Merge branch 'master' into feature/dnn-rank-demo

zhaohaipeng vor 1 Monat
Ursprung
Commit
5677a32ff3
31 geänderte Dateien mit 1049 neuen und 368 gelöschten Zeilen
  1. 2 1
      .gitignore
  2. 5 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/model/RankVideoInfo.java
  3. 4 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/model/RootSessionIdExpConfig.java
  4. 1 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/model/Video.java
  5. 59 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/ExperimentService.java
  6. 71 3
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/RecommendService.java
  7. 4 4
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/filter/strategy/RiskVideoStrategy.java
  8. 1 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/RankParam.java
  9. 11 32
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/RankRouter.java
  10. 11 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/RankService.java
  11. 5 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/bo/UserShareReturnProfile.java
  12. 2 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV536.java
  13. 2 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV562.java
  14. 2 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV563.java
  15. 2 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV564.java
  16. 2 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV565.java
  17. 2 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV566.java
  18. 3 2
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV567.java
  19. 97 40
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV568.java
  20. 6 27
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV569.java
  21. 4 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV839.java
  22. 3 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RelevantModelV1.java
  23. 25 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/tansform/FeatureV6.java
  24. 1 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/RecallParam.java
  25. 23 8
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/RecallService.java
  26. 77 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/AppTypeSpecialRecallStrategy.java
  27. 166 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/UserDeconstructionKeywordsRecallStrategy.java
  28. 8 3
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/score/ScorerUtils.java
  29. 1 1
      recommend-server-service/src/main/resources/feeds_score_config_fm_xgb_20250317.conf
  30. 449 0
      recommend-server-service/src/main/resources/feeds_score_config_str_and_ros_20260319.conf
  31. 0 244
      recommend-server-service/src/main/resources/feeds_score_config_xgb_ros_binary_20250319.conf

+ 2 - 1
.gitignore

@@ -53,4 +53,5 @@ logs/*
 xgboost
 recommend-server/logs
 LOG_PATH_IS_UNDEFINED
-datalog
+datalog
+word2vec.bin

+ 5 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/model/RankVideoInfo.java

@@ -2,6 +2,9 @@ package com.tzld.piaoquan.recommend.server.model;
 
 import lombok.Data;
 
+import java.util.HashMap;
+import java.util.Map;
+
 @Data
 public class RankVideoInfo {
 
@@ -11,4 +14,6 @@ public class RankVideoInfo {
 
     private double score;
 
+    private Map<String, Double> scoresMap = new HashMap<>();
+
 }

+ 4 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/model/RootSessionIdExpConfig.java

@@ -12,5 +12,9 @@ public class RootSessionIdExpConfig {
 
     private Set<Integer> appType = new HashSet<>();
 
+    // TODO 只做排序或者召回实验,后续废弃
     private String expCode;
+
+    // 兼容一个配置,同时开启排序和召回两个实验的情况
+    private Set<String> expCodes = new HashSet<>();
 }

+ 1 - 1
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/model/Video.java

@@ -42,7 +42,7 @@ public class Video {
     public Map<Long, RankVideoInfo> rankVideoInfoMap = new LinkedHashMap<>();
 
     // 处理后,传给模型的特征
-    public Map<String, String> allFeatureMap = new HashMap<>();
+    public Map<String, Float> allFeatureMap = new HashMap<>();
     // 原始特征
     public Map<String, Map<String, String>> metaFeatureMap = new HashMap<>();
 

+ 59 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/ExperimentService.java

@@ -0,0 +1,59 @@
+package com.tzld.piaoquan.recommend.server.service;
+
+import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
+import com.tzld.piaoquan.recommend.server.model.RootSessionIdExpConfig;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Set;
+
+@Slf4j
+@Service
+public class ExperimentService {
+
+    @ApolloJsonValue("${rank.root.session.id.exp.config:[]}")
+    private List<RootSessionIdExpConfig> rootSessionIdExpConfigs;
+
+    /**
+     * 是否命中某个实验号
+     *
+     * @param appType       appType
+     * @param rootSessionId rootSessionId
+     * @param abExpCodes    AB实验号集合
+     * @param expCode       要判断的实验号
+     * @return true: 命中要判断的实验号; false: 未命中要判断的实验号
+     */
+    public boolean judgeHitExp(int appType, String rootSessionId, Set<String> abExpCodes, String expCode) {
+        // 要判断的实验号为空,直接返回false
+        if (StringUtils.isBlank(expCode)) {
+            return false;
+        }
+        // 先判断AB实验号集合中,是否包含要判断的实验号
+        if (CollectionUtils.isNotEmpty(abExpCodes) && abExpCodes.contains(expCode)) {
+            return true;
+        }
+
+        // rootSessionId尾号实验配置为空或者rootSessionId为空,表示没有尾号实验。直接返回false
+        if (CollectionUtils.isEmpty(rootSessionIdExpConfigs) || StringUtils.isBlank(rootSessionId)) {
+            return false;
+        }
+
+        // 根据appType和rootSessionId尾号,判断是否命中实验
+        String tail = rootSessionId.substring(rootSessionId.length() - 1);
+        for (RootSessionIdExpConfig config : rootSessionIdExpConfigs) {
+            if (config.getAppType().contains(appType) && config.getTail().contains(tail)) {
+                if (StringUtils.equals(config.getExpCode(), expCode)) {
+                    return true;
+                }
+                if (CollectionUtils.isNotEmpty(config.getExpCodes()) && config.getExpCodes().contains(expCode)) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+}

+ 71 - 3
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/RecommendService.java

@@ -100,6 +100,12 @@ public class RecommendService {
     @ApolloJsonValue("${testing.risk.city:[]}")
     private Set<String> testingRiskCity;
 
+    @ApolloJsonValue("${log.upload.field.switch:{}}")
+    private Map<String, String> logUploadFieldSwitch;
+
+    @ApolloJsonValue("${special.apptype.set:[]}")
+    private Set<Integer> specialAppTypeSet;
+
     public static final String channelGroupPrefix = "alg_recsys_user_channel_group";
     /**
      * wx_user_info 表信息
@@ -170,10 +176,15 @@ public class RecommendService {
                 return specialMidRecommend(request);
             }
             Stopwatch stopwatch = Stopwatch.createStarted();
+            if (CollectionUtils.isNotEmpty(specialAppTypeSet) && specialAppTypeSet.contains(request.getAppType())) {
+                return specialAppTypeRecommend(request);
+            }
+
             if (StringUtils.isNotBlank(request.getMid())
                     && redisTemplate.opsForSet().isMember("special:mid", request.getMid())) {
                 return specialMidRecommend(request);
             }
+
             stopwatch.reset().start();
             RecommendParam param = genRecommendParam(request, recommendType);
             long genRecommendParamTime = stopwatch.stop().elapsed(TimeUnit.MILLISECONDS);
@@ -262,11 +273,16 @@ public class RecommendService {
                 map.put("scoreStr", String.valueOf(v.getScoreStr()));
                 map.put("score", String.valueOf(v.getScore()));
                 map.put("scoresMap", JSONUtils.toJson(v.getScoresMap()));
-                map.put("allFeatureMap", JSONUtils.toJson(v.getAllFeatureMap()));
                 map.put("metaFeatureMap", JSONUtils.toJson(v.getMetaFeatureMap()));
 
+                if (MapUtils.isNotEmpty(logUploadFieldSwitch) && StringUtils.equals("1", logUploadFieldSwitch.get("allFeatureMap"))) {
+                    map.put("allFeatureMap", JSONUtils.toJson(v.getAllFeatureMap()));
+                } else {
+                    map.put("allFeatureMap", JSONUtils.toJson(Collections.emptyMap()));
+                }
+
                 map.put("pushFromRank", JSONUtils.toJson(v.getPushFromRank()));
-                map.put("pushFromRankVideo", JSONUtils.toJson(v.getPushFromRankVideo()));
+                // map.put("pushFromRankVideo", JSONUtils.toJson(v.getPushFromRankVideo()));
                 map.put("abExpCode", JSONUtils.toJson(param.getAbExpCodes()));
 
                 long featureTableSize = 0;
@@ -287,7 +303,9 @@ public class RecommendService {
                 map.put("rootSessionId", request.getRootSessionId());
 
                 JSONObject extJson = new JSONObject();
-                extJson.put("rankVideoInfoMap", v.getRankVideoInfoMap());
+                if (MapUtils.isNotEmpty(logUploadFieldSwitch) && StringUtils.equals("1", logUploadFieldSwitch.get("ext"))) {
+                    extJson.put("rankVideoInfoMap", v.getRankVideoInfoMap());
+                }
                 map.put("ext", JSONUtils.toJson(extJson));
 
                 return map;
@@ -353,6 +371,56 @@ public class RecommendService {
                 .build();
     }
 
+    public RecommendResponse specialAppTypeRecommend(RecommendRequest request) {
+        log.info("hit special apptype recommend request={}", JSONUtils.toJson(request));
+        if (request == null) {
+            return RecommendResponse.newBuilder()
+                    .setResult(Result.newBuilder().setCode(1).setMessage("success"))
+                    .build();
+        }
+
+        RecallParam recallParam = new RecallParam();
+        recallParam.setAppType(request.getAppType());
+        recallParam.setMid(request.getMid());
+        recallParam.setAppTypeSpecialRecommend(true);
+        recallParam.setProvince(request.getProvince());
+        recallParam.setCityCode(request.getCityCode());
+        recallParam.setSize(request.getSize());
+
+        RecallResult recallResult = recallService.recall(recallParam);
+
+        RankParam rankParam = new RankParam();
+        rankParam.setRecallResult(recallResult);
+        rankParam.setSize(request.getSize());
+        rankParam.setAppTypeSpecialRecommend(true);
+
+        RankResult rankResult = rankRouter.rank(rankParam);
+
+        if (Objects.isNull(rankResult) || CollectionUtils.isEmpty(rankResult.getVideos())) {
+            return RecommendResponse.newBuilder()
+                    .setResult(Result.newBuilder().setCode(1).setMessage("success"))
+                    .build();
+        }
+
+        // 只返回size条数据
+        List<Video> videos= rankResult.getVideos().subList(0, Math.min(recallParam.getSize(), rankResult.getVideos().size()));
+
+        if (CollectionUtils.isNotEmpty(videos)) {
+            Video lastVideo = videos.get(videos.size() - 1);
+            redisTemplate.opsForValue().set(lastVideo.getLastVideoKey(), String.valueOf(lastVideo.getVideoId()),
+                    1, TimeUnit.DAYS);
+        }
+
+        return RecommendResponse.newBuilder()
+                .setResult(Result.newBuilder().setCode(1).setMessage("success"))
+                .addAllVideo(CommonCollectionUtils.toList(videos, v -> VideoProto.newBuilder()
+                        .setPushFrom(Strings.nullToEmpty(v.getPushFrom()))
+                        .setVideoId(v.getVideoId())
+                        .setRovScore(v.getRovScore())
+                        .build()))
+                .build();
+    }
+
     public RecommendParam genRecommendParam(RecommendRequest request, int recommendType) {
         RecommendParam param = new RecommendParam();
         param.setTopK(3);

+ 4 - 4
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/filter/strategy/RiskVideoStrategy.java

@@ -124,10 +124,10 @@ public class RiskVideoStrategy implements FilterStrategy {
                     .collect(Collectors.toList());
         }
 
-        log.info("RiskVideoStrategy \t param={} \t before={} \t after={}",
-                JSONUtils.toJson(param),
-                JSONUtils.toJson(param.getVideoIds()),
-                JSONUtils.toJson(videoIds));
+        // log.info("RiskVideoStrategy \t param={} \t before={} \t after={}",
+        //         JSONUtils.toJson(param),
+        //         JSONUtils.toJson(param.getVideoIds()),
+        //         JSONUtils.toJson(videoIds));
 
         return videoIds;
     }

+ 1 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/RankParam.java

@@ -22,6 +22,7 @@ public class RankParam {
     private double flowPoolP;
     private int appType;
     private boolean specialRecommend;
+    private boolean appTypeSpecialRecommend;
     private String mid;
     private String uid;
     private String province;

+ 11 - 32
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/RankRouter.java

@@ -1,28 +1,28 @@
 package com.tzld.piaoquan.recommend.server.service.rank;
 
-import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
-import com.tzld.piaoquan.recommend.server.model.RootSessionIdExpConfig;
+import com.tzld.piaoquan.recommend.server.service.ExperimentService;
 import com.tzld.piaoquan.recommend.server.service.ServiceBeanFactory;
 import com.tzld.piaoquan.recommend.server.service.rank.strategy.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.util.*;
 
 @Service
 @Slf4j
 public class RankRouter {
 
-    @ApolloJsonValue("${rank.root.session.id.exp.config:[]}")
-    private List<RootSessionIdExpConfig> rootSessionIdExpConfigs;
 
     @Value("${rank.strategy.default:567}")
     private String rankStrategyDefault;
 
+    @Resource
+    private ExperimentService experimentService;
+
     private LinkedHashMap<String, RankService> strategyMap;
 
     private static final String relevantRank = "relevant";
@@ -60,9 +60,12 @@ public class RankRouter {
         }
 
         // 裂变层实验,使用RootSessionId尾号进行实验
-        String rootSessionIdExpCode = this.findRootSessionIdExpCode(param);
-        if (StringUtils.isNotBlank(rootSessionIdExpCode) && strategyMap.containsKey(rootSessionIdExpCode)) {
-            return strategyMap.get(rootSessionIdExpCode).rank(param);
+        for (Map.Entry<String, RankService> entry : strategyMap.entrySet()) {
+            boolean hitExp = experimentService.judgeHitExp(param.getAppType(), param.getRootSessionId(), null, entry.getKey());
+            if (hitExp) {
+                // log.info("apType: {}, rootSessionId: {} 命中实验: {} strategies: {}", param.getAppType(), param.getRootSessionId(), entry.getKey(), entry.getValue().getClass().getSimpleName());
+                return entry.getValue().rank(param);
+            }
         }
 
         Set<String> abExpCodes = param.getAbExpCodes();
@@ -87,29 +90,5 @@ public class RankRouter {
             return null;
         }
     }
-
-    private String findRootSessionIdExpCode(RankParam param) {
-        String expCode = "";
-        if (CollectionUtils.isEmpty(rootSessionIdExpConfigs)) {
-            return expCode;
-        }
-
-        String rootSessionId = param.getRootSessionId();
-        if (StringUtils.isBlank(rootSessionId)) {
-            return expCode;
-        }
-
-        int appType = param.getAppType();
-        String tail = rootSessionId.substring(rootSessionId.length() - 1);
-        for (RootSessionIdExpConfig config : rootSessionIdExpConfigs) {
-            if (config.getAppType().contains(appType)
-                    && config.getTail().contains(tail)
-                    && strategyMap.containsKey(config.getExpCode())) {
-                return config.getExpCode();
-            }
-        }
-
-        return expCode;
-    }
 }
 

+ 11 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/RankService.java

@@ -38,6 +38,16 @@ public abstract class RankService {
             return null;
         }
 
+        if (param.isAppTypeSpecialRecommend()) {
+            Optional<RecallResult.RecallData> data = param.getRecallResult().getData().stream()
+                    .filter(d -> d.getPushFrom().equals(AppTypeSpecialRecallStrategy.PUSH_FROM))
+                    .findFirst();
+            if (data.isPresent() && CollectionUtils.isNotEmpty(data.get().getVideos())) {
+                return new RankResult(data.get().getVideos());
+            }
+            return null;
+        }
+
         if (2 == param.getRecommendType()) {
             tagDuplicateVideos(param);
             List<Video> rovRecallRank = mergeAndRankRovRecall(param);
@@ -54,6 +64,7 @@ public abstract class RankService {
             }
             return null;
         }
+
         // 1 通过 apptype 判断该小程序走怎样的排序策略。
         if (param.getAppType() == AppTypeEnum.PIAO_QUAN_MEIHAO_ZHUFU.getCode() && Objects.equals(param.getCategoryId(), 100)) {
             List<Video> results = new ArrayList<>(extractAndSort(param, BlessRecallStrategy.PUSH_FORM));

+ 5 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/bo/UserShareReturnProfile.java

@@ -22,6 +22,7 @@ public class UserShareReturnProfile {
     private List<UserSRBO> l_r1_s;   // last_return_seq(最近1层回流序列)
     private Map<String, VideoAttrSRBO> c1_s;   // cate1_seq(merge_first_level_cate序列-回流率)
     private Map<String, VideoAttrSRBO> c2_s;   // cate2_seq(merge_second_level_cate序列-回流率)
+    private Map<String, VideoAttrSRBO> d_k_s;
     private Map<String, VideoAttrSRBO> l1_s;   // label1_seq(festive_label1序列-回流率)
     private Map<String, VideoAttrSRBO> l2_s;   // label2_seq(festive_label2序列-回流率)
 
@@ -53,6 +54,10 @@ public class UserShareReturnProfile {
         this.c2_s = parseVideoAttrSR(data);
     }
 
+    public void setD_k_s(String data) {
+        this.d_k_s = parseVideoAttrSR(data);
+    }
+
     public void setL1_s(String data) {
         this.l1_s = parseVideoAttrSR(data);
     }

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

@@ -223,6 +223,7 @@ public class RankStrategy4RegionMergeModelV536 extends RankStrategy4RegionMergeM
             video.setScore(score);
             video.setSortScore(score);
             video.setScoresMap(item.getScoresMap());
+            video.setAllFeatureMap(item.getAllFeatureMap());
 
             String mergeCate2 = ExtractVideoMergeCate.parseMergeCate2(String.valueOf(item.getVideoId()), videoBaseInfoMap);
             if (StringUtils.isNotBlank(mergeCate2)) {
@@ -252,6 +253,7 @@ public class RankStrategy4RegionMergeModelV536 extends RankStrategy4RegionMergeM
             }
             if (Objects.nonNull(video.getRankVideoInfoMap()) && video.getRankVideoInfoMap().containsKey(video.getVideoId())){
                 video.getRankVideoInfoMap().get(video.getVideoId()).setScore(score);
+                video.getRankVideoInfoMap().get(video.getVideoId()).setScoresMap(video.getScoresMap());
             }
             result.add(video);
         }

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

@@ -223,6 +223,7 @@ public class RankStrategy4RegionMergeModelV562 extends RankStrategy4RegionMergeM
             video.setScore(score);
             video.setSortScore(score);
             video.setScoresMap(item.getScoresMap());
+            video.setAllFeatureMap(item.getAllFeatureMap());
 
             String mergeCate2 = ExtractVideoMergeCate.parseMergeCate2(String.valueOf(item.getVideoId()), videoBaseInfoMap);
             if (StringUtils.isNotBlank(mergeCate2)) {
@@ -252,6 +253,7 @@ public class RankStrategy4RegionMergeModelV562 extends RankStrategy4RegionMergeM
             }
             if (Objects.nonNull(video.getRankVideoInfoMap()) && video.getRankVideoInfoMap().containsKey(video.getVideoId())){
                 video.getRankVideoInfoMap().get(video.getVideoId()).setScore(score);
+                video.getRankVideoInfoMap().get(video.getVideoId()).setScoresMap(video.getScoresMap());
             }
             result.add(video);
         }

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

@@ -198,6 +198,7 @@ public class RankStrategy4RegionMergeModelV563 extends RankStrategy4RegionMergeM
             video.setScore(score);
             video.setSortScore(score);
             video.setScoresMap(item.getScoresMap());
+            video.setAllFeatureMap(item.getAllFeatureMap());
 
             String mergeCate2 = ExtractVideoMergeCate.parseMergeCate2(String.valueOf(item.getVideoId()), videoBaseInfoMap);
             if (StringUtils.isNotBlank(mergeCate2)) {
@@ -227,6 +228,7 @@ public class RankStrategy4RegionMergeModelV563 extends RankStrategy4RegionMergeM
             }
             if (Objects.nonNull(video.getRankVideoInfoMap()) && video.getRankVideoInfoMap().containsKey(video.getVideoId())){
                 video.getRankVideoInfoMap().get(video.getVideoId()).setScore(score);
+                video.getRankVideoInfoMap().get(video.getVideoId()).setScoresMap(video.getScoresMap());
             }
             result.add(video);
         }

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

@@ -161,7 +161,7 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
             video.setScore(score);
             video.setSortScore(score);
             video.setScoresMap(item.getScoresMap());
-            // video.setAllFeatureMap(item.getAllFeatureMap());
+            video.setAllFeatureMap(item.getAllFeatureMap());
 
             String mergeCate2 = ExtractVideoMergeCate.parseMergeCate2(String.valueOf(item.getVideoId()), videoBaseInfoMap);
             if (StringUtils.isNotBlank(mergeCate2)) {
@@ -191,6 +191,7 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
             }
             if (Objects.nonNull(video.getRankVideoInfoMap()) && video.getRankVideoInfoMap().containsKey(video.getVideoId())){
                 video.getRankVideoInfoMap().get(video.getVideoId()).setScore(score);
+                video.getRankVideoInfoMap().get(video.getVideoId()).setScoresMap(video.getScoresMap());
             }
             result.add(video);
         }

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

@@ -158,7 +158,7 @@ public class RankStrategy4RegionMergeModelV565 extends RankStrategy4RegionMergeM
             video.setScore(score);
             video.setSortScore(score);
             video.setScoresMap(item.getScoresMap());
-            // video.setAllFeatureMap(item.getAllFeatureMap());
+            video.setAllFeatureMap(item.getAllFeatureMap());
 
             String mergeCate2 = ExtractVideoMergeCate.parseMergeCate2(String.valueOf(item.getVideoId()), videoBaseInfoMap);
             if (StringUtils.isNotBlank(mergeCate2)) {
@@ -188,6 +188,7 @@ public class RankStrategy4RegionMergeModelV565 extends RankStrategy4RegionMergeM
             }
             if (Objects.nonNull(video.getRankVideoInfoMap()) && video.getRankVideoInfoMap().containsKey(video.getVideoId())){
                 video.getRankVideoInfoMap().get(video.getVideoId()).setScore(score);
+                video.getRankVideoInfoMap().get(video.getVideoId()).setScoresMap(video.getScoresMap());
             }
             result.add(video);
         }

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

@@ -223,6 +223,7 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
             video.setScore(score);
             video.setSortScore(score);
             video.setScoresMap(item.getScoresMap());
+            video.setAllFeatureMap(item.getAllFeatureMap());
 
             String mergeCate2 = ExtractVideoMergeCate.parseMergeCate2(String.valueOf(item.getVideoId()), videoBaseInfoMap);
             if (StringUtils.isNotBlank(mergeCate2)) {
@@ -252,6 +253,7 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
             }
             if (Objects.nonNull(video.getRankVideoInfoMap()) && video.getRankVideoInfoMap().containsKey(video.getVideoId())){
                 video.getRankVideoInfoMap().get(video.getVideoId()).setScore(score);
+                video.getRankVideoInfoMap().get(video.getVideoId()).setScoresMap(video.getScoresMap());
             }
             result.add(video);
         }

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

@@ -158,7 +158,7 @@ public class RankStrategy4RegionMergeModelV567 extends RankStrategy4RegionMergeM
             video.setScore(score);
             video.setSortScore(score);
             video.setScoresMap(item.getScoresMap());
-            // video.setAllFeatureMap(item.getAllFeatureMap());
+            video.setAllFeatureMap(item.getAllFeatureMap());
 
             String mergeCate2 = ExtractVideoMergeCate.parseMergeCate2(String.valueOf(item.getVideoId()), videoBaseInfoMap);
             if (StringUtils.isNotBlank(mergeCate2)) {
@@ -186,8 +186,9 @@ public class RankStrategy4RegionMergeModelV567 extends RankStrategy4RegionMergeM
             if (MapUtils.isNotEmpty(contextInfo)) {
                 video.getMetaFeatureMap().put("context", contextInfo);
             }
-            if (Objects.nonNull(video.getRankVideoInfoMap()) && video.getRankVideoInfoMap().containsKey(video.getVideoId())){
+            if (Objects.nonNull(video.getRankVideoInfoMap()) && video.getRankVideoInfoMap().containsKey(video.getVideoId())) {
                 video.getRankVideoInfoMap().get(video.getVideoId()).setScore(score);
+                video.getRankVideoInfoMap().get(video.getVideoId()).setScoresMap(video.getScoresMap());
             }
             result.add(video);
         }

+ 97 - 40
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV568.java

@@ -10,7 +10,6 @@ import com.tzld.piaoquan.recommend.server.service.FeatureService;
 import com.tzld.piaoquan.recommend.server.service.rank.RankParam;
 import com.tzld.piaoquan.recommend.server.service.rank.bo.UserShareReturnProfile;
 import com.tzld.piaoquan.recommend.server.service.rank.extractor.ExtractVideoMergeCate;
-import com.tzld.piaoquan.recommend.server.service.rank.extractor.ExtractorUtils;
 import com.tzld.piaoquan.recommend.server.service.rank.tansform.FeatureV6;
 import com.tzld.piaoquan.recommend.server.service.recall.strategy.*;
 import com.tzld.piaoquan.recommend.server.service.score.ScorerUtils;
@@ -79,8 +78,9 @@ public class RankStrategy4RegionMergeModelV568 extends RankStrategy4RegionMergeM
         RecallUtils.extractRecall(mergeWeight.getOrDefault("return1Cate2Ros", 5.0).intValue(), param, Return1Cate2RosRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
         //-------------------return1 cate2 str------------------
         RecallUtils.extractRecall(mergeWeight.getOrDefault("return1Cate2Str", 5.0).intValue(), param, Return1Cate2StrRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
-        //-------------------priori premium rovn------------------
-        RecallUtils.extractRecall(mergeWeight.getOrDefault("prioriPremiumRovn", 0.0).intValue(), param, PrioriPremiumRovnRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
+        //--------------deconstruction keywords ros-------------
+        RecallUtils.extractRecall(mergeWeight.getOrDefault("deconstructionKeywordsRos", 5.0).intValue(), param, UserDeconstructionKeywordsRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
+
 
         // 记录召回源中的视频
         this.rankBeforePostProcessor(rovRecallRank);
@@ -96,6 +96,8 @@ public class RankStrategy4RegionMergeModelV568 extends RankStrategy4RegionMergeM
         Map<String, String> headVideoInfo = param.getHeadInfo();
         List<String> vids = CommonCollectionUtils.toListDistinct(rovRecallRank, v -> String.valueOf(v.getVideoId()));
         Map<String, Map<String, Map<String, String>>> videoBaseInfoMap = featureService.getVideoBaseInfo("", vids);
+        Map<String, Map<String, Map<String, String>>> videoBCData = featureService.getVideoStatistics(vids);
+
         FeatureService.Feature feature = featureService.getFeatureV4(param, headVideoInfo, videoBaseInfoMap, vids);
         Map<String, Map<String, String>> featureOriginUser = feature.getUserFeature();
         Map<String, Map<String, Map<String, String>>> featureOriginVideo = feature.getVideoFeature();
@@ -115,74 +117,128 @@ public class RankStrategy4RegionMergeModelV568 extends RankStrategy4RegionMergeM
 
         // 4. 排序模型计算
         Map<String, Float> sceneFeatureMap = new HashMap<>(0);
-        List<RankItem> items = ScorerUtils.getScorerPipeline("feeds_score_config_fm_xgb_20250729.conf").scoring(sceneFeatureMap, userFeatureMap, userFeatureMap, rankItems);
+        List<RankItem> items = ScorerUtils.getScorerPipeline("feeds_score_config_fm_xgb_20250317.conf").scoring(sceneFeatureMap, userFeatureMap, userFeatureMap, rankItems);
 
         // 5. 排序公式特征
         double xgbRovNegRate = mergeWeight.getOrDefault("xgbRovNegRate", 0.059);
         double xgbNorPowerWeight = mergeWeight.getOrDefault("xgbNorPowerWeight", 1.22);
         double xgbNorPowerExp = mergeWeight.getOrDefault("xgbNorPowerExp", 1.15);
-        double prioriHighValue = mergeWeight.getOrDefault("prioriHighValue", 1.5);
-        double prioriHighWeight = mergeWeight.getOrDefault("prioriHighWeight", 1.0);
-        double prioriLowValue = mergeWeight.getOrDefault("prioriLowValue", 0.5);
-        double prioriLowWeight = mergeWeight.getOrDefault("prioriLowWeight", 0.8);
+
+        double rosAdd = mergeWeight.getOrDefault("ros_add", 0.1);
+        double rosW = mergeWeight.getOrDefault("ros_w", 1.0d);
+
+        double vorAdd = mergeWeight.getOrDefault("vor_add", 0.1d);
+        double vorW = mergeWeight.getOrDefault("vor_w", 1.0d);
+
+        double c1Rovn1hW = mergeWeight.getOrDefault("c1_rovn_1h_w", 0d);
+        double c1Rovn24hW = mergeWeight.getOrDefault("c1_rovn_24h_w", 0d);
+
+        double b0Str1hW = mergeWeight.getOrDefault("b0_str_1h_w", 0d);
+        double b0Str24hW = mergeWeight.getOrDefault("b0_str_24h_w", 0d);
+
+        double b0Ror1hW = mergeWeight.getOrDefault("b0_ror_1h_w", 0d);
+        double b0Ror24hW = mergeWeight.getOrDefault("b0_ror_24h_w", 0d);
+
+        double cnRovn1hW = mergeWeight.getOrDefault("cn_rovn_1h_w", 0d);
+        double cnRovn24hW = mergeWeight.getOrDefault("cn_rovn_24h_w", 0d);
+
+        double dnRovn1hW = mergeWeight.getOrDefault("dn_rovn_1h_w", 0d);
+        double dnRovn24hW = mergeWeight.getOrDefault("dn_rovn_24h_w", 0d);
+
         Map<String, Map<String, String>> vid2MapFeature = this.getVideoRedisFeature(vids, "redis:vid_hasreturn_vor:");
 
-        // 获取权重
-        Map<String, Double> cate2Coefficient = new HashMap<>();
-        double cate2CoefficientFunc = mergeWeight.getOrDefault("cate2CoefficientFunc", 0d);
-        if (cate2CoefficientFunc == 1d) {
-            String headVidStr = String.valueOf(param.getHeadVid());
-            String mergeCate2 = this.findVideoMergeCate2(videoBaseInfoMap, headVidStr);
-            Double length = mergeWeight.getOrDefault("cate2CoefficientLength", 10000d);
-            Map<String, Double> simCateScore = this.findSimCateScore(mergeCate2, length.intValue());
-            cate2Coefficient.putAll(simCateScore);
-        }
-        Double cate2CoefficientDenominator = mergeWeight.getOrDefault("cate2CoefficientDenominator", 1d);
         Map<String, String> contextInfo = getContextInfo(param);
-        Map<String, Double> prioriVidProvinceRovn = this.getPrioriVidProvinceRovn(param.getProvince(), items, videoBaseInfoMap);
 
         List<Video> result = new ArrayList<>();
         for (RankItem item : items) {
             double score;
-            String vid = String.valueOf(item.getVideoId());
             double fmRovOrigin = item.getScoreRov();
             item.getScoresMap().put("fmRovOrigin", fmRovOrigin);
             double fmRov = restoreScore(fmRovOrigin, xgbRovNegRate);
             item.getScoresMap().put("fmRov", fmRov);
-            double hasReturnRovScore = Double.parseDouble(vid2MapFeature.getOrDefault(vid, new HashMap<>()).getOrDefault("rov", "0"));
+
+
+            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 = norPowerCalibration(xgbNorPowerWeight, xgbNorPowerExp, norXGBScore);
-            double vor = Double.parseDouble(vid2MapFeature.getOrDefault(vid, new HashMap<>()).getOrDefault("vor", "0"));
-            item.getScoresMap().put("vor", vor);
-
-            String vidMergeCate2 = this.findVideoMergeCate2(videoBaseInfoMap, vid);
-            Double scoreCoefficient = cate2Coefficient.getOrDefault(vidMergeCate2, 0d);
-            item.getScoresMap().put("scoreCoefficient", scoreCoefficient);
-            item.getScoresMap().put("cate2CoefficientDenominator", cate2CoefficientDenominator);
+            item.getScoresMap().put("rosAdd", rosAdd);
+            item.getScoresMap().put("rosW", rosW);
 
-            double prioriWeight = getPrioriVidProvinceWeight(prioriHighValue, prioriHighWeight, prioriLowValue, prioriLowWeight, vid, prioriVidProvinceRovn);
-            score = prioriWeight * fmRov * (0.1 + newNorXGBScore) * (0.1 + vor) * (1 + scoreCoefficient / cate2CoefficientDenominator);
-            if (!ExtractorUtils.isDoubleEqualToZero(prioriWeight - 1.0)) {
-                item.getScoresMap().put("prioriWeight", prioriWeight);
-            }
+            double vor = Double.parseDouble(vid2MapFeature.getOrDefault(item.getVideoId() + "", new HashMap<>()).getOrDefault("vor", "0"));
+            item.getScoresMap().put("vor", vor);
+            item.getScoresMap().put("vorAdd", vorAdd);
+            item.getScoresMap().put("vorW", vorW);
+
+            Map<String, String> bcData = videoBCData.getOrDefault(String.valueOf(item.getVideoId()), new HashMap<>()).getOrDefault("alg_vid_feature_b_c_data", new HashMap<>());
+            Map<String, String> cdNData = videoBCData.getOrDefault(String.valueOf(item.getVideoId()), new HashMap<>()).getOrDefault("alg_vid_feature_cn_dn_data", new HashMap<>());
+
+            double c1Rovn1h = Double.parseDouble(bcData.getOrDefault("c1_rovn_1h", "0"));
+            double c1Rovn24h = Double.parseDouble(bcData.getOrDefault("c1_rovn_24h", "0"));
+            double c1RovnScore = c1Rovn1hW * c1Rovn1h + c1Rovn24hW * c1Rovn24h;
+            item.getScoresMap().put("c1RovnScore", c1RovnScore);
+            item.getScoresMap().put("c1Rovn1hW", c1Rovn1hW);
+            item.getScoresMap().put("c1Rovn1h", c1Rovn1h);
+            item.getScoresMap().put("c1Rovn24hW", c1Rovn24hW);
+            item.getScoresMap().put("c1Rovn24h", c1Rovn24h);
+
+            double b0Str1h = Double.parseDouble(bcData.getOrDefault("b_str1_1h", "0"));
+            double b0Str24h = Double.parseDouble(bcData.getOrDefault("b_str1_24h", "0"));
+            double b0StrScore = b0Str1hW * b0Str1h + b0Str24hW * b0Str24h;
+            item.getScoresMap().put("b0StrScore", b0StrScore);
+            item.getScoresMap().put("b0Str1hW", b0Str1hW);
+            item.getScoresMap().put("b0Str1h", b0Str1h);
+            item.getScoresMap().put("b0Str24hW", b0Str24hW);
+            item.getScoresMap().put("b0Str24h", b0Str24h);
+
+
+            double b0Ror1h = Double.parseDouble(bcData.getOrDefault("b_ror1_1h", "0"));
+            double b0Ror24h = Double.parseDouble(bcData.getOrDefault("b_ror1_24h", "0"));
+            double b0RorScore = b0Ror1hW * b0Ror1h + b0Ror24hW * b0Ror24h;
+            item.getScoresMap().put("b0RorScore", b0RorScore);
+            item.getScoresMap().put("b0Ror1hW", b0Ror1hW);
+            item.getScoresMap().put("b0Ror1h", b0Ror1h);
+            item.getScoresMap().put("b0Ror24hW", b0Ror24hW);
+            item.getScoresMap().put("b0Ror24h", b0Ror24h);
+
+            double cnRovn1h = Double.parseDouble(cdNData.getOrDefault("cn_rovn_1h", "0"));
+            double cnRovn24h = Double.parseDouble(cdNData.getOrDefault("cn_rovn_24h", "0"));
+            double cnRovnScore = cnRovn1hW * cnRovn1h + cnRovn24hW * cnRovn24h;
+            item.getScoresMap().put("cnRovnScore", cnRovnScore);
+            item.getScoresMap().put("cnRovn1hW", cnRovn1hW);
+            item.getScoresMap().put("cnRovn1h", cnRovn1h);
+            item.getScoresMap().put("cnRovn24hW", cnRovn24hW);
+            item.getScoresMap().put("cnRovn24h", cnRovn24h);
+
+            double dnRovn1h = Double.parseDouble(cdNData.getOrDefault("dn_rovn_1h", "0"));
+            double dnRovn24h = Double.parseDouble(cdNData.getOrDefault("dn_rovn_24h", "0"));
+            double dnRovnScore = dnRovn1hW * dnRovn1h + dnRovn24hW * dnRovn24h;
+            item.getScoresMap().put("dnRovnScore", dnRovnScore);
+            item.getScoresMap().put("dnRovn1hW", dnRovn1hW);
+            item.getScoresMap().put("dnRovn1h", dnRovn1h);
+            item.getScoresMap().put("dnRovn24hW", dnRovn24hW);
+            item.getScoresMap().put("dnRovn24h", dnRovn24h);
+
+            score = fmRov * (rosAdd + rosW * newNorXGBScore) * (vorAdd + vorW * vor) + c1RovnScore + b0StrScore + b0RorScore + cnRovnScore * dnRovnScore;
 
             Video video = item.getVideo();
             video.setScore(score);
             video.setSortScore(score);
             video.setScoresMap(item.getScoresMap());
-            // video.setAllFeatureMap(item.getAllFeatureMap());
+            video.setAllFeatureMap(item.getAllFeatureMap());
+            video.setAllFeatureMap(item.getAllFeatureMap());
 
-            String mergeCate2 = ExtractVideoMergeCate.parseMergeCate2(vid, videoBaseInfoMap);
+            String mergeCate2 = ExtractVideoMergeCate.parseMergeCate2(String.valueOf(item.getVideoId()), videoBaseInfoMap);
             if (StringUtils.isNotBlank(mergeCate2)) {
                 video.getMergeCateList().add(mergeCate2);
             }
 
-            if (MapUtils.isNotEmpty(feature.getVideoFeature()) && MapUtils.isNotEmpty(feature.getVideoFeature().get(vid))) {
-                video.getMetaFeatureMap().putAll(feature.getVideoFeature().get(vid));
+            if (MapUtils.isNotEmpty(feature.getVideoFeature()) && MapUtils.isNotEmpty(feature.getVideoFeature().get(item.getVideoId() + ""))) {
+                video.getMetaFeatureMap().putAll(feature.getVideoFeature().get(item.getVideoId() + ""));
             }
-            if (MapUtils.isNotEmpty(videoBaseInfoMap) && MapUtils.isNotEmpty(videoBaseInfoMap.get(vid))) {
-                video.getMetaFeatureMap().putAll(videoBaseInfoMap.get(vid));
+            if (MapUtils.isNotEmpty(videoBaseInfoMap) && MapUtils.isNotEmpty(videoBaseInfoMap.get(item.getVideoId() + ""))) {
+                video.getMetaFeatureMap().putAll(videoBaseInfoMap.get(item.getVideoId() + ""));
             }
             if (MapUtils.isNotEmpty(headVideoInfo)) {
                 video.getMetaFeatureMap().put("head_video", headVideoInfo);
@@ -201,6 +257,7 @@ public class RankStrategy4RegionMergeModelV568 extends RankStrategy4RegionMergeM
             }
             if (Objects.nonNull(video.getRankVideoInfoMap()) && video.getRankVideoInfoMap().containsKey(video.getVideoId())){
                 video.getRankVideoInfoMap().get(video.getVideoId()).setScore(score);
+                video.getRankVideoInfoMap().get(video.getVideoId()).setScoresMap(video.getScoresMap());
             }
             result.add(video);
         }

+ 6 - 27
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV569.java

@@ -78,6 +78,8 @@ public class RankStrategy4RegionMergeModelV569 extends RankStrategy4RegionMergeM
         RecallUtils.extractRecall(mergeWeight.getOrDefault("return1Cate2Ros", 5.0).intValue(), param, Return1Cate2RosRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
         //-------------------return1 cate2 str------------------
         RecallUtils.extractRecall(mergeWeight.getOrDefault("return1Cate2Str", 5.0).intValue(), param, Return1Cate2StrRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
+        //--------------deconstruction keywords ros-------------
+        RecallUtils.extractRecall(mergeWeight.getOrDefault("deconstructionKeywordsRos", 5.0).intValue(), param, UserDeconstructionKeywordsRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
 
         // 记录召回源中的视频
         this.rankBeforePostProcessor(rovRecallRank);
@@ -114,7 +116,7 @@ public class RankStrategy4RegionMergeModelV569 extends RankStrategy4RegionMergeM
 
         // 4. 排序模型计算
         Map<String, Float> sceneFeatureMap = new HashMap<>(0);
-        List<RankItem> items = ScorerUtils.getScorerPipeline("feeds_score_config_fm_xgb_20250729.conf").scoring(sceneFeatureMap, userFeatureMap, userFeatureMap, rankItems);
+        List<RankItem> items = ScorerUtils.getScorerPipeline("feeds_score_config_str_and_ros_20260319.conf").scoring(sceneFeatureMap, userFeatureMap, userFeatureMap, rankItems);
 
         // 5. 排序公式特征
         double xgbRovNegRate = mergeWeight.getOrDefault("xgbRovNegRate", 0.059);
@@ -136,12 +138,6 @@ public class RankStrategy4RegionMergeModelV569 extends RankStrategy4RegionMergeM
         double b0Ror1hW = mergeWeight.getOrDefault("b0_ror_1h_w", 0d);
         double b0Ror24hW = mergeWeight.getOrDefault("b0_ror_24h_w", 0d);
 
-        double cnRovn1hW = mergeWeight.getOrDefault("cn_rovn_1h_w", 0d);
-        double cnRovn24hW = mergeWeight.getOrDefault("cn_rovn_24h_w", 0d);
-
-        double dnRovn1hW = mergeWeight.getOrDefault("dn_rovn_1h_w", 0d);
-        double dnRovn24hW = mergeWeight.getOrDefault("dn_rovn_24h_w", 0d);
-
         Map<String, Map<String, String>> vid2MapFeature = this.getVideoRedisFeature(vids, "redis:vid_hasreturn_vor:");
 
         // 获取权重
@@ -169,7 +165,6 @@ public class RankStrategy4RegionMergeModelV569 extends RankStrategy4RegionMergeM
             item.getScoresMap().put("vorW", vorW);
 
             Map<String, String> bcData = videoBCData.getOrDefault(String.valueOf(item.getVideoId()), new HashMap<>()).getOrDefault("alg_vid_feature_b_c_data", new HashMap<>());
-            Map<String, String> cdNData = videoBCData.getOrDefault(String.valueOf(item.getVideoId()), new HashMap<>()).getOrDefault("alg_vid_feature_cn_dn_data", new HashMap<>());
 
             double c1Rovn1h = Double.parseDouble(bcData.getOrDefault("c1_rovn_1h", "0"));
             double c1Rovn24h = Double.parseDouble(bcData.getOrDefault("c1_rovn_24h", "0"));
@@ -198,30 +193,13 @@ public class RankStrategy4RegionMergeModelV569 extends RankStrategy4RegionMergeM
             item.getScoresMap().put("b0Ror24hW", b0Ror24hW);
             item.getScoresMap().put("b0Ror24h", b0Ror24h);
 
-            double cnRovn1h = Double.parseDouble(cdNData.getOrDefault("cn_rovn_1h", "0"));
-            double cnRovn24h = Double.parseDouble(cdNData.getOrDefault("cn_rovn_24h", "0"));
-            double cnRovnScore = cnRovn1hW * cnRovn1h + cnRovn24hW * cnRovn24h;
-            item.getScoresMap().put("cnRovnScore", cnRovnScore);
-            item.getScoresMap().put("cnRovn1hW", cnRovn1hW);
-            item.getScoresMap().put("cnRovn1h", cnRovn1h);
-            item.getScoresMap().put("cnRovn24hW", cnRovn24hW);
-            item.getScoresMap().put("cnRovn24h", cnRovn24h);
-
-            double dnRovn1h = Double.parseDouble(cdNData.getOrDefault("dn_rovn_1h", "0"));
-            double dnRovn24h = Double.parseDouble(cdNData.getOrDefault("dn_rovn_24h", "0"));
-            double dnRovnScore = dnRovn1hW * dnRovn1h + dnRovn24hW * dnRovn24h;
-            item.getScoresMap().put("dnRovnScore", dnRovnScore);
-            item.getScoresMap().put("dnRovn1hW", dnRovn1hW);
-            item.getScoresMap().put("dnRovn1h", dnRovn1h);
-            item.getScoresMap().put("dnRovn24hW", dnRovn24hW);
-            item.getScoresMap().put("dnRovn24h", dnRovn24h);
-
-            score = fmRov * (rosAdd + rosW * newNorXGBScore) * (vorAdd + vorW * vor) + c1RovnScore + b0StrScore + b0RorScore + cnRovnScore * dnRovnScore;
+            score = fmRov * (rosAdd + rosW * newNorXGBScore) * (vorAdd + vorW * vor) + c1RovnScore + b0StrScore + b0RorScore;
 
             Video video = item.getVideo();
             video.setScore(score);
             video.setSortScore(score);
             video.setScoresMap(item.getScoresMap());
+            video.setAllFeatureMap(item.getAllFeatureMap());
 
             String mergeCate2 = ExtractVideoMergeCate.parseMergeCate2(String.valueOf(item.getVideoId()), videoBaseInfoMap);
             if (StringUtils.isNotBlank(mergeCate2)) {
@@ -251,6 +229,7 @@ public class RankStrategy4RegionMergeModelV569 extends RankStrategy4RegionMergeM
             }
             if (Objects.nonNull(video.getRankVideoInfoMap()) && video.getRankVideoInfoMap().containsKey(video.getVideoId())){
                 video.getRankVideoInfoMap().get(video.getVideoId()).setScore(score);
+                video.getRankVideoInfoMap().get(video.getVideoId()).setScoresMap(video.getScoresMap());
             }
             result.add(video);
         }

+ 4 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV839.java

@@ -78,6 +78,8 @@ public class RankStrategy4RegionMergeModelV839 extends RankStrategy4RegionMergeM
         RecallUtils.extractRecall(mergeWeight.getOrDefault("return1Cate2Ros", 5.0).intValue(), param, Return1Cate2RosRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
         //-------------------return1 cate2 str------------------
         RecallUtils.extractRecall(mergeWeight.getOrDefault("return1Cate2Str", 5.0).intValue(), param, Return1Cate2StrRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
+        //--------------deconstruction keywords ros-------------
+        RecallUtils.extractRecall(mergeWeight.getOrDefault("deconstructionKeywordsRos", 5.0).intValue(), param, UserDeconstructionKeywordsRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
 
         // 记录召回源中的视频
         this.rankBeforePostProcessor(rovRecallRank);
@@ -198,6 +200,7 @@ public class RankStrategy4RegionMergeModelV839 extends RankStrategy4RegionMergeM
             video.setScore(score);
             video.setSortScore(score);
             video.setScoresMap(item.getScoresMap());
+            video.setAllFeatureMap(item.getAllFeatureMap());
 
             String mergeCate2 = ExtractVideoMergeCate.parseMergeCate2(String.valueOf(item.getVideoId()), videoBaseInfoMap);
             if (StringUtils.isNotBlank(mergeCate2)) {
@@ -227,6 +230,7 @@ public class RankStrategy4RegionMergeModelV839 extends RankStrategy4RegionMergeM
             }
             if (Objects.nonNull(video.getRankVideoInfoMap()) && video.getRankVideoInfoMap().containsKey(video.getVideoId())){
                 video.getRankVideoInfoMap().get(video.getVideoId()).setScore(score);
+                video.getRankVideoInfoMap().get(video.getVideoId()).setScoresMap(video.getScoresMap());
             }
             result.add(video);
         }

+ 3 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RelevantModelV1.java

@@ -104,6 +104,8 @@ public class RankStrategy4RelevantModelV1 extends RankStrategy4RegionMergeModelB
             video.setScore(score);
             video.setSortScore(score);
             video.setScoresMap(item.getScoresMap());
+            video.setAllFeatureMap(item.getAllFeatureMap());
+
             if (MapUtils.isNotEmpty(videoBaseInfoMap) && MapUtils.isNotEmpty(videoBaseInfoMap.get(item.getVideoId() + ""))) {
                 video.getMetaFeatureMap().putAll(videoBaseInfoMap.get(item.getVideoId() + ""));
             }
@@ -115,6 +117,7 @@ public class RankStrategy4RelevantModelV1 extends RankStrategy4RegionMergeModelB
             }
             if (Objects.nonNull(video.getRankVideoInfoMap()) && video.getRankVideoInfoMap().containsKey(video.getVideoId())){
                 video.getRankVideoInfoMap().get(video.getVideoId()).setScore(score);
+                video.getRankVideoInfoMap().get(video.getVideoId()).setScoresMap(video.getScoresMap());
             }
             result.add(video);
         }

+ 25 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/tansform/FeatureV6.java

@@ -274,6 +274,18 @@ public class FeatureV6 {
         getVideoAttrSRCrossFeature("c9_c2s", rankVideo.getOrDefault("merge_second_level_cate", ""), profile.getC2_s(), featMap);
         getVideoAttrSRCrossFeature("c9_l1s", rankVideo.getOrDefault("festive_label1", ""), profile.getL1_s(), featMap);
         getVideoAttrSRCrossFeature("c9_l2s", rankVideo.getOrDefault("festive_label2", ""), profile.getL2_s(), featMap);
+
+        // 视频解构的关键词
+        if (rankVideo.containsKey("dk_keywords")) {
+            String dkKeywords = rankVideo.get("dk_keywords");
+            if (Objects.isNull(dkKeywords) || dkKeywords.isEmpty()) {
+                return;
+            }
+            for (String kw : dkKeywords.split("[,,、]")) {
+                kw = kw.replaceAll("(\\s+|\\t|:)", "");
+                getVideoAttrSRCrossFeature("c9_dks", kw, profile.getD_k_s(), featMap);
+            }
+        }
     }
 
     private static void getRSCrossFeature(boolean flag, String prefix, long currentMs, int maxN, List<UserSRBO> list, Map<String, String> rankVideo, Map<String, Map<String, String>> hVideoMap, Map<String, Double> featMap) {
@@ -379,6 +391,19 @@ public class FeatureV6 {
                 }
             }
         }
+        // 视频解构的关键词 ID特征
+        if (videoInfo.containsKey("dk_keywords")) {
+            String dkKeywords = videoInfo.get("dk_keywords");
+            if (Objects.nonNull(dkKeywords) && !dkKeywords.isEmpty()) {
+                for (String kw : dkKeywords.split("[,,、]")) {
+                    kw = kw.replaceAll("(\\s+|\\t|:)", "");
+                    if (!kw.isEmpty()) {
+                        String featKey = String.format("%s@dkw@%s", prefix, kw);
+                        featMap.put(featKey, 1.0);
+                    }
+                }
+            }
+        }
     }
 
     private static void getTwoVideoCrossFeature(String prefix, List<String> attrs, Map<String, String> video1, Map<String, String> video2, Map<String, Double> featMap) {

+ 1 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/RecallParam.java

@@ -26,6 +26,7 @@ public class RecallParam {
     private Long videoId;
     private String uid;
     private boolean specialRecommend;
+    private boolean appTypeSpecialRecommend;
     private Set<String> abExpCodes;
     private Integer categoryId;
 

+ 23 - 8
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/RecallService.java

@@ -4,6 +4,7 @@ import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
 import com.tzld.piaoquan.recommend.server.common.ThreadPoolFactory;
 import com.tzld.piaoquan.recommend.server.common.enums.AppTypeEnum;
 import com.tzld.piaoquan.recommend.server.model.Video;
+import com.tzld.piaoquan.recommend.server.service.ExperimentService;
 import com.tzld.piaoquan.recommend.server.service.recall.strategy.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
@@ -14,6 +15,7 @@ import org.springframework.context.ApplicationContextAware;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
 import java.util.*;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
@@ -27,6 +29,9 @@ import java.util.concurrent.TimeUnit;
 @Slf4j
 public class RecallService implements ApplicationContextAware {
 
+    @Resource
+    private ExperimentService experimentService;
+
     private final Map<String, RecallStrategy> strategyMap = new HashMap<>();
     private ApplicationContext applicationContext;
     private final ExecutorService pool = ThreadPoolFactory.recallPool();
@@ -84,6 +89,11 @@ public class RecallService implements ApplicationContextAware {
 
     private List<RecallStrategy> getRecallStrategy(RecallParam param) {
         List<RecallStrategy> strategies = new ArrayList<>();
+        if (param.isAppTypeSpecialRecommend()){
+            strategies.add(strategyMap.get(AppTypeSpecialRecallStrategy.class.getSimpleName()));
+            return strategies;
+        }
+
         if (2 == param.getRecommendType()) {
             strategies.add(strategyMap.get(HotReturnUvRecallStrategy.class.getSimpleName()));
             return strategies;
@@ -125,14 +135,19 @@ public class RecallService implements ApplicationContextAware {
         strategies.add(strategyMap.get(Return1Cate2StrRecallStrategy.class.getSimpleName()));
         Set<String> abExpCodes = param.getAbExpCodes();
         if (CollectionUtils.isNotEmpty(abExpCodes)) {
-            if (abExpCodes.contains("568")) {
-                strategies.add(strategyMap.get(PrioriPremiumRovnRecallStrategy.class.getSimpleName()));
-            }
-            if (abExpCodes.contains("566")){
-                strategies.add(strategyMap.get(SocialI2IDirectRecallStrategy.class.getSimpleName()));
-                strategies.add(strategyMap.get(SocialI2IHistoryShareRecallStrategy.class.getSimpleName()));
-                strategies.add(strategyMap.get(SocialI2IHistoryClickRecallStrategy.class.getSimpleName()));
-            }
+            // if (abExpCodes.contains("568")) {
+            //     strategies.add(strategyMap.get(PrioriPremiumRovnRecallStrategy.class.getSimpleName()));
+            // }
+            // if (abExpCodes.contains("566")){
+            //     strategies.add(strategyMap.get(SocialI2IDirectRecallStrategy.class.getSimpleName()));
+            //     strategies.add(strategyMap.get(SocialI2IHistoryShareRecallStrategy.class.getSimpleName()));
+            //     strategies.add(strategyMap.get(SocialI2IHistoryClickRecallStrategy.class.getSimpleName()));
+            // }
+        }
+
+        boolean isHit842Exp = experimentService.judgeHitExp(param.getAppType(), param.getRootSessionId(), abExpCodes, "842");
+        if (isHit842Exp) {
+            strategies.add(strategyMap.get(UserDeconstructionKeywordsRecallStrategy.class.getSimpleName()));
         }
 
         // 命中用户黑名单不走流量池

+ 77 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/AppTypeSpecialRecallStrategy.java

@@ -0,0 +1,77 @@
+package com.tzld.piaoquan.recommend.server.service.recall.strategy;
+
+import com.tzld.piaoquan.recommend.server.model.Video;
+import com.tzld.piaoquan.recommend.server.service.recall.RecallParam;
+import com.tzld.piaoquan.recommend.server.service.recall.RecallStrategy;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.math.NumberUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ZSetOperations;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+
+@Slf4j
+@Service
+public class AppTypeSpecialRecallStrategy implements RecallStrategy {
+    @Autowired
+    @Qualifier("redisTemplate")
+    private RedisTemplate<String, String> redisTemplate;
+
+    public static final String LAST_VIDEO_KEY_FORMAT = "recall:apptype:last:special:%s:%s";
+    public static final String PUSH_FROM = "special_videos";
+    public static final String RECALL_KEY_FORMAT = "recall:apptype:specil:items:%s";
+
+    @Override
+    public List<Video> recall(RecallParam param) {
+
+        String lastVideoRedisKey = String.format(LAST_VIDEO_KEY_FORMAT, param.getAppType(), param.getVideoId());
+        String recallKey = String.format(RECALL_KEY_FORMAT, param.getAppType());
+        String value = redisTemplate.opsForValue().get(lastVideoRedisKey);
+        Long idx = 0L;
+        if (StringUtils.isNotBlank(value)) {
+            idx = redisTemplate.opsForZSet().reverseRank(recallKey, value);
+            if (idx == null) {
+                idx = 0L;
+            } else {
+                idx += 1;
+            }
+        }
+
+        int getSize = param.getSize() * 5;
+        int freq = 0;
+        List<Video> results = new ArrayList<>();
+        while (results.size() < param.getSize()) {
+            freq += 1;
+            if (freq > 2) {
+                break;
+            }
+            Set<ZSetOperations.TypedTuple<String>> data = redisTemplate.opsForZSet().reverseRangeWithScores(recallKey, idx, idx + getSize - 1);
+            if (CollectionUtils.isEmpty(data)) {
+                break;
+            }
+            idx += getSize;
+            data.forEach(t -> {
+                Video video = new Video();
+                video.setVideoId(NumberUtils.toLong(t.getValue(), 0L));
+                video.setRovScore(t.getScore());
+                video.setPushFrom(PUSH_FROM);
+                video.setLastVideoKey(lastVideoRedisKey);
+                results.add(video);
+            });
+        }
+        return results;
+    }
+
+    @Override
+    public String pushFrom() {
+        return PUSH_FROM;
+    }
+}

+ 166 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/UserDeconstructionKeywordsRecallStrategy.java

@@ -0,0 +1,166 @@
+package com.tzld.piaoquan.recommend.server.service.recall.strategy;
+
+import com.tzld.piaoquan.recommend.server.model.Video;
+import com.tzld.piaoquan.recommend.server.service.filter.FilterParam;
+import com.tzld.piaoquan.recommend.server.service.filter.FilterResult;
+import com.tzld.piaoquan.recommend.server.service.filter.FilterService;
+import com.tzld.piaoquan.recommend.server.service.rank.bo.UserShareReturnProfile;
+import com.tzld.piaoquan.recommend.server.service.rank.bo.VideoAttrSRBO;
+import com.tzld.piaoquan.recommend.server.service.recall.FilterParamFactory;
+import com.tzld.piaoquan.recommend.server.service.recall.RecallParam;
+import com.tzld.piaoquan.recommend.server.service.recall.RecallStrategy;
+import com.tzld.piaoquan.recommend.server.util.FeatureUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.math3.util.Pair;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Component
+public class UserDeconstructionKeywordsRecallStrategy implements RecallStrategy {
+    private final String CLASS_NAME = this.getClass().getSimpleName();
+
+    @Autowired
+    private FilterService filterService;
+    @Autowired
+    @Qualifier("redisTemplate")
+    public RedisTemplate<String, String> redisTemplate;
+
+    public static final int topN = 5;
+    public static final String PUSH_FORM = "recall_strategy_deconstruction_keywords";
+    public static final String redisKeyPrefix = "deconstruction_keywords_recall";
+
+    @Override
+    public String pushFrom() {
+        return PUSH_FORM;
+    }
+
+    @Override
+    public List<Video> recall(RecallParam param) {
+
+        List<Video> videos = new ArrayList<>();
+        try {
+            UserShareReturnProfile userProfile = param.getUserProfile();
+            if (Objects.isNull(userProfile) || MapUtils.isEmpty(userProfile.getD_k_s())) {
+                return videos;
+            }
+            List<String> keys = this.getRedisKey(userProfile.getD_k_s());
+            if (CollectionUtils.isEmpty(keys)) {
+                return videos;
+            }
+            List<String> values = redisTemplate.opsForValue().multiGet(keys);
+            List<Long> vids = this.recall(param.getVideoId(), values);
+            FilterParam filterParam = FilterParamFactory.create(param, vids);
+
+            FilterResult filterResult = filterService.filter(filterParam);
+            if (Objects.isNull(filterResult) || CollectionUtils.isEmpty(filterResult.getVideoIds())) {
+                return videos;
+            }
+            List<Long> filterIds = filterResult.getVideoIds();
+
+            int n = filterIds.size();
+            for (int i = 0; i < n; i++) {
+                Video video = new Video();
+                video.setVideoId(filterIds.get(i));
+                video.setRovScore(n - i);
+                video.setPushFrom(pushFrom());
+                videos.add(video);
+            }
+        } catch (Exception e) {
+            log.error("recall is wrong in {}, error={}", CLASS_NAME, e);
+        }
+        return videos;
+    }
+
+    private List<String> getRedisKey(Map<String, VideoAttrSRBO> map) {
+        List<String> keys = new ArrayList<>();
+        if (MapUtils.isEmpty(map)) {
+            return keys;
+        }
+
+        List<Pair<String, Double>> keywordsList = getOrderedList(map);
+        for (Pair<String, Double> pair : keywordsList) {
+            keys.add(String.format("%s:%s", redisKeyPrefix, pair.getFirst()));
+            if (keys.size() >= topN) {
+                break;
+            }
+        }
+        return keys;
+    }
+
+    private List<Pair<String, Double>> getOrderedList(Map<String, VideoAttrSRBO> map) {
+        List<Pair<String, Double>> pairList = new ArrayList<>();
+        if (MapUtils.isEmpty(map)) {
+            return pairList;
+        }
+
+        for (Map.Entry<String, VideoAttrSRBO> entry : map.entrySet()) {
+            String name = entry.getKey();
+            VideoAttrSRBO videoAttrSRBO = entry.getValue();
+            if (Objects.nonNull(videoAttrSRBO) && videoAttrSRBO.getRu() > 0) {
+                long sharePv = videoAttrSRBO.getSp();
+                long returnUv = videoAttrSRBO.getRu();
+                double score = FeatureUtils.plusSmooth(returnUv, sharePv, 5);
+                Pair<String, Double> pair = Pair.create(name, score);
+                pairList.add(pair);
+            }
+        }
+        if (pairList.size() > 1) {
+            pairList.sort(Comparator.comparingDouble(o -> -o.getSecond()));
+        }
+        return pairList;
+    }
+
+    private List<Long> recall(Long headVid, List<String> values) {
+        List<Long> vids = new ArrayList<>();
+        if (CollectionUtils.isEmpty(values)) {
+            return vids;
+        }
+
+        Set<Long> hits = new HashSet<>();
+        hits.add(headVid);
+        List<Pair<Long, Double>> list = new ArrayList<>();
+        for (String value : values) {
+            if (StringUtils.isBlank(value)) {
+                continue;
+            }
+            String[] cells = value.split("\t");
+            if (cells.length != 2) {
+                continue;
+            }
+            List<Long> ids = Arrays.stream(cells[0].split(",")).map(Long::valueOf).collect(Collectors.toList());
+            List<Double> scores = Arrays.stream(cells[1].split(",")).map(Double::valueOf).collect(Collectors.toList());
+            if (CollectionUtils.isEmpty(ids) || CollectionUtils.isEmpty(scores)) {
+                continue;
+            }
+            if (ids.size() != scores.size()) {
+                continue;
+            }
+            for (int i = 0; i < ids.size(); ++i) {
+                long id = ids.get(i);
+                double score = scores.get(i);
+                if (hits.contains(id)) {
+                    continue;
+                }
+                hits.add(id);
+                list.add(Pair.create(id, score));
+            }
+        }
+        if (CollectionUtils.isEmpty(list)) {
+            return vids;
+        }
+        list.sort(Comparator.comparingDouble(o -> -o.getSecond()));
+        for (Pair<Long, Double> pair : list) {
+            vids.add(pair.getFirst());
+        }
+        return vids;
+    }
+}

+ 8 - 3
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/score/ScorerUtils.java

@@ -31,19 +31,24 @@ public final class ScorerUtils {
     public static void warmUp() {
         log.info("scorer warm up ");
         ScorerUtils.init(VIDEO_SCORE_CONF_FOR_AD);
-        ScorerUtils.init("feeds_score_config_20240609.conf");
-        ScorerUtils.init("feeds_score_config_20240807.conf");
+        // 排序配置
+        // ScorerUtils.init("feeds_score_config_20240609.conf");
+        // ScorerUtils.init("feeds_score_config_20240807.conf");
+        ScorerUtils.init("feeds_score_config_str_and_ros_20260319.conf");
         ScorerUtils.init("feeds_score_config_fm_xgb_20250317.conf");
         ScorerUtils.init("feeds_score_config_fm_xgb_20250729.conf");
         ScorerUtils.init("feeds_score_config_fm_xgb_20260116.conf");
         ScorerUtils.init("feeds_score_config_fm_xgb_20260123.conf");
         ScorerUtils.init("feeds_score_config_xgb_ros_20250311.conf");
-        ScorerUtils.init("feeds_score_config_xgb_ros_binary_20250319.conf");
+
+        // 召回配置
         ScorerUtils.init4Recall("feeds_recall_config_region_v1.conf");
         ScorerUtils.init4Recall("feeds_recall_config_region_ros.conf");
         ScorerUtils.init4Recall("feeds_score_config_bless.conf");
         ScorerUtils.init4Recall("feeds_recall_config_tomson.conf");
         ScorerUtils.init4Recall("feeds_recall_config_region_v7_longterm.conf");
+
+        // 分桶文件
         List<String> bucketFileList = Arrays.asList("20250218_bucket_322.txt", "20250306_ros_bucket_229.txt");
         FeatureBucketUtils.init(bucketFileList);
         FestiveUtil.init();

+ 1 - 1
recommend-server-service/src/main/resources/feeds_score_config_fm_xgb_20250317.conf

@@ -2,7 +2,7 @@ scorer-config = {
   rov-score-config = {
      scorer-name = "com.tzld.piaoquan.recommend.server.service.score.VlogRovFMScorer"
      scorer-priority = 96
-     model-path = "zhangbo/model_fm_for_recsys_v6_rov.txt"
+     model-path = "zhangbo/model_fm_for_recsys_deconstruction_str.txt"
   }
   nor-score-config = {
     scorer-name = "com.tzld.piaoquan.recommend.server.service.score.NorXGBRegressionScorer"

+ 449 - 0
recommend-server-service/src/main/resources/feeds_score_config_str_and_ros_20260319.conf

@@ -0,0 +1,449 @@
+scorer-config = {
+  rov-score-config = {
+     scorer-name = "com.tzld.piaoquan.recommend.server.service.score.VlogRovFMScorer"
+     scorer-priority = 96
+     model-path = "zhangbo/model_fm_for_recsys_str_20260317.txt"
+  }
+  nor-score-config = {
+    scorer-name = "com.tzld.piaoquan.recommend.server.service.score.NorXGBRegressionScorer"
+    scorer-priority = 97
+    model-path = "zhangbo/model_xgb_for_recsys_ros_20260317.tar.gz"
+    param = {
+      localDir = "xgboost/model_xgb_for_recsys_ros_20260317"
+      features = [
+      "b0_12h@return_1_uv",
+      "b0_12h@ros1_#",
+      "b0_12h@ros_#",
+      "b0_12h@ros_minus1_#",
+      "b0_12h@ros_minus_#",
+      "b0_12h@ros_n1_#",
+      "b0_12h@ros_n_#",
+      "b0_12h@ros_one",
+      "b0_12h@rovn1_#",
+      "b0_12h@rovn_#",
+      "b0_1h@return_1_uv",
+      "b0_1h@ros1_#",
+      "b0_1h@ros_#",
+      "b0_1h@ros_minus1_#",
+      "b0_1h@ros_minus_#",
+      "b0_1h@ros_n1_#",
+      "b0_1h@ros_n_#",
+      "b0_1h@ros_one",
+      "b0_1h@rovn1_#",
+      "b0_1h@rovn_#",
+      "b0_3h@return_1_uv",
+      "b0_3h@ros1_#",
+      "b0_3h@ros_#",
+      "b0_3h@ros_minus1_#",
+      "b0_3h@ros_minus_#",
+      "b0_3h@ros_n1_#",
+      "b0_3h@ros_n_#",
+      "b0_3h@ros_one",
+      "b0_3h@rovn1_#",
+      "b0_3h@rovn_#",
+      "b0_6h@return_1_uv",
+      "b0_6h@ros1_#",
+      "b0_6h@ros_#",
+      "b0_6h@ros_minus1_#",
+      "b0_6h@ros_minus_#",
+      "b0_6h@ros_n1_#",
+      "b0_6h@ros_n_#",
+      "b0_6h@ros_one",
+      "b0_6h@rovn1_#",
+      "b0_6h@rovn_#",
+      "b10_12h@is_share",
+      "b10_12h@return_n_uv",
+      "b10_12h@ros_#",
+      "b10_12h@ros_minus_#",
+      "b10_12h@rovn_#",
+      "b10_12h@str",
+      "b10_12h@str_plus",
+      "b10_1h@is_share",
+      "b10_1h@return_n_uv",
+      "b10_1h@ros_#",
+      "b10_1h@ros_minus_#",
+      "b10_1h@rovn_#",
+      "b10_1h@str",
+      "b10_1h@str_plus",
+      "b11_12h@is_share",
+      "b11_12h@return_n_uv",
+      "b11_12h@ros_#",
+      "b11_12h@ros_minus_#",
+      "b11_12h@rovn_#",
+      "b11_12h@str",
+      "b11_12h@str_plus",
+      "b13_1h@exp",
+      "b13_1h@is_share",
+      "b13_1h@ros_#",
+      "b13_1h@ros_minus_#",
+      "b13_1h@ros_n_#",
+      "b13_1h@ros_one",
+      "b13_1h@rovn_#",
+      "b13_1h@share_cnt",
+      "b13_1h@str",
+      "b13_1h@str_plus",
+      "b13_24h@exp",
+      "b13_24h@is_share",
+      "b13_24h@ros_#",
+      "b13_24h@ros_minus_#",
+      "b13_24h@ros_n_#",
+      "b13_24h@ros_one",
+      "b13_24h@rovn_#",
+      "b13_24h@share_cnt",
+      "b13_24h@str",
+      "b13_24h@str_plus",
+      "b13_3h@exp",
+      "b13_3h@is_share",
+      "b13_3h@ros_#",
+      "b13_3h@ros_minus_#",
+      "b13_3h@ros_n_#",
+      "b13_3h@ros_one",
+      "b13_3h@rovn_#",
+      "b13_3h@share_cnt",
+      "b13_3h@str",
+      "b13_3h@str_plus",
+      "b13_72h@exp",
+      "b13_72h@is_share",
+      "b13_72h@ros_#",
+      "b13_72h@ros_minus_#",
+      "b13_72h@ros_n_#",
+      "b13_72h@ros_one",
+      "b13_72h@rovn_#",
+      "b13_72h@share_cnt",
+      "b13_72h@str",
+      "b13_72h@str_plus",
+      "b1_1h@ros_#",
+      "b1_1h@ros_minus_#",
+      "b1_1h@ros_n_#",
+      "b1_1h@ros_one",
+      "b1_1h@rovn_#",
+      "b1_24h@ros_#",
+      "b1_24h@ros_minus_#",
+      "b1_24h@ros_n_#",
+      "b1_24h@ros_one",
+      "b1_24h@rovn_#",
+      "b1_3h@ros_#",
+      "b1_3h@ros_minus_#",
+      "b1_3h@ros_n_#",
+      "b1_3h@ros_one",
+      "b1_3h@rovn_#",
+      "b1_72h@ros_#",
+      "b1_72h@ros_minus_#",
+      "b1_72h@ros_n_#",
+      "b1_72h@ros_one",
+      "b1_72h@rovn_#",
+      "b2_24h@return_n_uv",
+      "b2_24h@ros_#",
+      "b2_24h@ros_minus_#",
+      "b2_24h@ros_n_#",
+      "b2_24h@ros_one",
+      "b2_24h@rovn_#",
+      "b2_3h@return_n_uv",
+      "b2_3h@ros_#",
+      "b2_3h@ros_minus_#",
+      "b2_3h@ros_n_#",
+      "b2_3h@ros_one",
+      "b2_3h@rovn_#",
+      "b3_24h@is_share",
+      "b3_24h@return_n_uv",
+      "b3_24h@ros_#",
+      "b3_24h@ros_minus_#",
+      "b3_24h@ros_n_#",
+      "b3_24h@ros_one",
+      "b3_24h@rovn_#",
+      "b3_24h@str",
+      "b3_24h@str_plus",
+      "b3_72h@is_share",
+      "b3_72h@return_n_uv",
+      "b3_72h@ros_#",
+      "b3_72h@ros_minus_#",
+      "b3_72h@ros_n_#",
+      "b3_72h@ros_one",
+      "b3_72h@rovn_#",
+      "b3_72h@str",
+      "b3_72h@str_plus",
+      "b4_12h@is_share",
+      "b4_12h@return_n_uv",
+      "b4_12h@ros_#",
+      "b4_12h@ros_minus_#",
+      "b4_12h@ros_n_#",
+      "b4_12h@ros_one",
+      "b4_12h@rovn_#",
+      "b4_3h@is_share",
+      "b4_3h@return_n_uv",
+      "b4_3h@ros_#",
+      "b4_3h@ros_minus_#",
+      "b4_3h@ros_n_#",
+      "b4_3h@ros_one",
+      "b4_3h@rovn_#",
+      "b5_12h@exp",
+      "b5_12h@is_share",
+      "b5_12h@return_n_uv",
+      "b5_12h@ros_#",
+      "b5_12h@ros_minus_#",
+      "b5_12h@ros_n_#",
+      "b5_12h@ros_one",
+      "b5_12h@rovn_#",
+      "b5_12h@share_cnt",
+      "b5_12h@str",
+      "b5_12h@str_plus",
+      "b5_1h@exp",
+      "b5_1h@is_share",
+      "b5_1h@return_n_uv",
+      "b5_1h@ros_#",
+      "b5_1h@ros_minus_#",
+      "b5_1h@ros_n_#",
+      "b5_1h@ros_one",
+      "b5_1h@rovn_#",
+      "b5_1h@share_cnt",
+      "b5_1h@str",
+      "b5_1h@str_plus",
+      "b5_24h@exp",
+      "b5_24h@is_share",
+      "b5_24h@return_n_uv",
+      "b5_24h@ros_#",
+      "b5_24h@ros_minus_#",
+      "b5_24h@ros_n_#",
+      "b5_24h@ros_one",
+      "b5_24h@rovn_#",
+      "b5_24h@share_cnt",
+      "b5_24h@str",
+      "b5_24h@str_plus",
+      "b5_3h@exp",
+      "b5_3h@is_share",
+      "b5_3h@return_n_uv",
+      "b5_3h@ros_#",
+      "b5_3h@ros_minus_#",
+      "b5_3h@ros_n_#",
+      "b5_3h@ros_one",
+      "b5_3h@rovn_#",
+      "b5_3h@share_cnt",
+      "b5_3h@str",
+      "b5_3h@str_plus",
+      "b5_6h@exp",
+      "b5_6h@is_share",
+      "b5_6h@return_n_uv",
+      "b5_6h@ros_#",
+      "b5_6h@ros_minus_#",
+      "b5_6h@ros_n_#",
+      "b5_6h@ros_one",
+      "b5_6h@rovn_#",
+      "b5_6h@share_cnt",
+      "b5_6h@str",
+      "b5_6h@str_plus",
+      "b5_72h@exp",
+      "b5_72h@is_share",
+      "b5_72h@return_n_uv",
+      "b5_72h@ros_#",
+      "b5_72h@ros_minus_#",
+      "b5_72h@ros_n_#",
+      "b5_72h@ros_one",
+      "b5_72h@rovn_#",
+      "b5_72h@share_cnt",
+      "b5_72h@str",
+      "b5_72h@str_plus",
+      "b6_1h@is_share",
+      "b6_1h@return_n_uv",
+      "b6_1h@ros_#",
+      "b6_1h@ros_minus_#",
+      "b6_1h@ros_n_#",
+      "b6_1h@ros_one",
+      "b6_1h@rovn_#",
+      "b6_1h@str",
+      "b6_1h@str_plus",
+      "b6_24h@is_share",
+      "b6_24h@return_n_uv",
+      "b6_24h@ros_#",
+      "b6_24h@ros_minus_#",
+      "b6_24h@ros_n_#",
+      "b6_24h@ros_one",
+      "b6_24h@rovn_#",
+      "b6_24h@str",
+      "b6_24h@str_plus",
+      "b7_1h@is_share",
+      "b7_1h@return_n_uv",
+      "b7_1h@ros_#",
+      "b7_1h@ros_minus_#",
+      "b7_1h@ros_n_#",
+      "b7_1h@ros_one",
+      "b7_1h@rovn_#",
+      "b7_1h@str",
+      "b7_1h@str_plus",
+      "b7_24h@is_share",
+      "b7_24h@return_n_uv",
+      "b7_24h@ros_#",
+      "b7_24h@ros_minus_#",
+      "b7_24h@ros_n_#",
+      "b7_24h@ros_one",
+      "b7_24h@rovn_#",
+      "b7_24h@str",
+      "b7_24h@str_plus",
+      "b7_3h@is_share",
+      "b7_3h@return_n_uv",
+      "b7_3h@ros_#",
+      "b7_3h@ros_minus_#",
+      "b7_3h@ros_n_#",
+      "b7_3h@ros_one",
+      "b7_3h@rovn_#",
+      "b7_3h@str",
+      "b7_3h@str_plus",
+      "b7_72h@is_share",
+      "b7_72h@return_n_uv",
+      "b7_72h@ros_#",
+      "b7_72h@ros_minus_#",
+      "b7_72h@ros_n_#",
+      "b7_72h@ros_one",
+      "b7_72h@rovn_#",
+      "b7_72h@str",
+      "b7_72h@str_plus",
+      "b8_1h@is_share",
+      "b8_1h@return_n_uv",
+      "b8_1h@ros_#",
+      "b8_1h@ros_minus_#",
+      "b8_1h@rovn_#",
+      "b8_1h@str",
+      "b8_1h@str_plus",
+      "b8_24h@is_share",
+      "b8_24h@return_n_uv",
+      "b8_24h@ros_#",
+      "b8_24h@ros_minus_#",
+      "b8_24h@rovn_#",
+      "b8_24h@str",
+      "b8_24h@str_plus",
+      "b8_3h@is_share",
+      "b8_3h@return_n_uv",
+      "b8_3h@ros_#",
+      "b8_3h@ros_minus_#",
+      "b8_3h@rovn_#",
+      "b8_3h@str",
+      "b8_3h@str_plus",
+      "b9_1h@is_share",
+      "b9_1h@return_n_uv",
+      "b9_1h@ros_#",
+      "b9_1h@ros_minus_#",
+      "b9_1h@rovn_#",
+      "b9_1h@str",
+      "b9_1h@str_plus",
+      "b9_24h@is_share",
+      "b9_24h@return_n_uv",
+      "b9_24h@ros_#",
+      "b9_24h@ros_minus_#",
+      "b9_24h@rovn_#",
+      "b9_24h@str",
+      "b9_24h@str_plus",
+      "b9_3h@is_share",
+      "b9_3h@return_n_uv",
+      "b9_3h@ros_#",
+      "b9_3h@ros_minus_#",
+      "b9_3h@rovn_#",
+      "b9_3h@str",
+      "b9_3h@str_plus",
+      "c1_168h@is_share",
+      "c1_168h@return_n_uv",
+      "c1_168h@ros_#",
+      "c1_168h@ros_minus_#",
+      "c1_168h@ros_n_#",
+      "c1_168h@ros_one",
+      "c1_168h@rovn_#",
+      "c1_168h@str",
+      "c1_168h@str_plus",
+      "c1_72h@is_share",
+      "c1_72h@return_n_uv",
+      "c1_72h@ros_#",
+      "c1_72h@ros_minus_#",
+      "c1_72h@ros_n_#",
+      "c1_72h@ros_one",
+      "c1_72h@rovn_#",
+      "c1_72h@str",
+      "c1_72h@str_plus",
+      "c5_tags_1d@avgscore",
+      "c5_tags_1d@maxscore",
+      "c5_tags_3d@avgscore",
+      "c5_tags_3d@maxscore",
+      "c5_tags_7d@avgscore",
+      "c5_tags_7d@maxscore",
+      "c6_tags_1d@avgscore",
+      "c6_tags_1d@maxscore",
+      "c6_tags_3d@avgscore",
+      "c6_tags_3d@maxscore",
+      "c6_tags_7d@avgscore",
+      "c6_tags_7d@maxscore",
+      "c9@m_r_uv",
+      "c9@m_s_cnt",
+      "c9@r_pv",
+      "c9@r_uv",
+      "c9@ros",
+      "c9@ros_minus",
+      "c9@ros_one",
+      "c9@s_cnt",
+      "c9@s_pv",
+      "c9_c1s@mu",
+      "c9_c1s@ros",
+      "c9_c1s@ros_minus",
+      "c9_c1s@ros_one",
+      "c9_c1s@rp",
+      "c9_c1s@ru",
+      "c9_c1s@sp",
+      "c9_c2s@mu",
+      "c9_c2s@ros",
+      "c9_c2s@ros_minus",
+      "c9_c2s@ros_one",
+      "c9_c2s@rp",
+      "c9_c2s@ru",
+      "c9_c2s@sp",
+      "c9_l1s@mu",
+      "c9_l1s@ros",
+      "c9_l1s@ros_minus",
+      "c9_l1s@sp",
+      "c9_l2s@mu",
+      "c9_l2s@ros",
+      "c9_l2s@ros_minus",
+      "c9_l2s@sp",
+      "c9_lrs@1@title",
+      "c9_lrs@1@ts",
+      "c9_lrs@1@uv",
+      "c9_lrs@2@title",
+      "c9_lrs@2@ts",
+      "c9_lrs@2@uv",
+      "c9_lss@1@cnt",
+      "c9_lss@1@title",
+      "c9_lss@1@ts",
+      "c9_lss@2@cnt",
+      "c9_lss@2@title",
+      "c9_lss@2@ts",
+      "c9_mrs@1@title",
+      "c9_mrs@1@ts",
+      "c9_mrs@1@uv",
+      "c9_mrs@2@title",
+      "c9_mrs@2@ts",
+      "c9_mrs@2@uv",
+      "c9_mss@1@cnt",
+      "c9_mss@1@title",
+      "c9_mss@1@ts",
+      "c9_mss@2@cnt",
+      "c9_mss@2@title",
+      "c9_mss@2@ts",
+      "d1@ros_cf_rank",
+      "d1@ros_cf_score",
+      "d1@rov_cf_rank",
+      "d1@rov_cf_score",
+      "d2@rank",
+      "d2@score",
+      "d3@exp",
+      "d3@return_n",
+      "d3@rovn",
+      "h@bit_rate",
+      "h@total_time",
+      "h@ts",
+      "hour",
+      "hr_sim@cate2",
+      "hr_sim@cate2_list",
+      "hr_sim@keywords",
+      "hr_sim@title",
+      "r@bit_rate",
+      "r@total_time",
+      "r@ts"
+      ]
+    }
+  }
+}

+ 0 - 244
recommend-server-service/src/main/resources/feeds_score_config_xgb_ros_binary_20250319.conf

@@ -1,244 +0,0 @@
-scorer-config = {
-  rov-score-config = {
-    scorer-name = "com.tzld.piaoquan.recommend.server.service.score.XGBoostScorer"
-    scorer-priority = 99
-    model-path = "zhangbo/model_xgb_for_ros_binary_v1.tar.gz"
-    param = {
-      localDir = "xgboost/model_xgb_for_ros_binary_v1"
-      features = [
-            "b1_return_1_uv_24h"
-            "b1_return_1_uv_3h"
-            "b1_ros_24h"
-            "b1_ros_3h"
-            "b1_ros_minus_24h"
-            "b1_ros_minus_3h"
-            "b1_ros_one_24h"
-            "b1_ros_one_3h"
-            "b1_rovn_24h"
-            "b1_rovn_3h"
-            "b1_str_one_24h"
-            "b1_str_one_3h"
-            "b2_return_n_uv_24h"
-            "b2_return_n_uv_3h"
-            "b2_ros_24h"
-            "b2_ros_3h"
-            "b2_ros_minus_24h"
-            "b2_ros_minus_3h"
-            "b2_ros_one_24h"
-            "b2_ros_one_3h"
-            "b2_rovn_24h"
-            "b2_rovn_3h"
-            "b2_str_one_24h"
-            "b2_str_one_3h"
-            "b3_return_n_uv_168h"
-            "b3_return_n_uv_24h"
-            "b3_ros_168h"
-            "b3_ros_24h"
-            "b3_ros_minus_168h"
-            "b3_ros_minus_24h"
-            "b3_ros_one_168h"
-            "b3_ros_one_24h"
-            "b3_rovn_168h"
-            "b3_rovn_24h"
-            "b3_str_one_168h"
-            "b3_str_one_24h"
-            "b5_return_n_uv_24h"
-            "b5_ros_24h"
-            "b5_ros_minus_24h"
-            "b5_ros_one_24h"
-            "b5_rovn_24h"
-            "b5_str_one_24h"
-            "b6_return_n_uv_24h"
-            "b6_ros_24h"
-            "b6_ros_minus_24h"
-            "b6_ros_one_24h"
-            "b6_rovn_24h"
-            "b6_str_one_24h"
-            "b7_return_n_uv_24h"
-            "b7_ros_24h"
-            "b7_ros_minus_24h"
-            "b7_ros_one_24h"
-            "b7_rovn_24h"
-            "b7_str_one_24h"
-            "b8_return_n_uv_24h"
-            "b8_ros_24h"
-            "b8_ros_minus_24h"
-            "b8_ros_one_24h"
-            "b8_rovn_24h"
-            "b8_str_one_24h"
-            "b9_return_n_uv_24h"
-            "b9_ros_24h"
-            "b9_ros_minus_24h"
-            "b9_ros_one_24h"
-            "b9_rovn_24h"
-            "b9_str_one_24h"
-            "b11_return_n_uv_24h"
-            "b11_ros_24h"
-            "b11_ros_minus_24h"
-            "b11_ros_one_24h"
-            "b11_rovn_24h"
-            "b11_str_one_24h"
-            "b12_return_n_uv_14d"
-            "b12_ros_14d"
-            "b12_ros_minus_14d"
-            "b12_ros_one_14d"
-            "b12_rovn_14d"
-            "b12_str_one_14d"
-            "b13_return_n_uv_24h"
-            "b13_return_n_uv_3h"
-            "b13_ros_24h"
-            "b13_ros_3h"
-            "b13_ros_minus_24h"
-            "b13_ros_minus_3h"
-            "b13_ros_one_24h"
-            "b13_ros_one_3h"
-            "b13_rovn_24h"
-            "b13_rovn_3h"
-            "b13_str_one_24h"
-            "b13_str_one_3h"
-            "c1_click_12h"
-            "c1_click_168h"
-            "c1_click_24h"
-            "c1_click_72h"
-            "c1_return_1_uv_12h"
-            "c1_return_1_uv_168h"
-            "c1_return_1_uv_24h"
-            "c1_return_1_uv_72h"
-            "c1_ros_12h"
-            "c1_ros_168h"
-            "c1_ros_24h"
-            "c1_ros_72h"
-            "c1_ros_minus_12h"
-            "c1_ros_minus_168h"
-            "c1_ros_minus_24h"
-            "c1_ros_minus_72h"
-            "c1_ros_one_12h"
-            "c1_ros_one_168h"
-            "c1_ros_one_24h"
-            "c1_ros_one_72h"
-            "c1_rovn_12h"
-            "c1_rovn_168h"
-            "c1_rovn_24h"
-            "c1_rovn_72h"
-            "c1_str_one_12h"
-            "c1_str_one_168h"
-            "c1_str_one_24h"
-            "c1_str_one_72h"
-            "c2_click_12h"
-            "c2_click_168h"
-            "c2_click_24h"
-            "c2_click_72h"
-            "c2_is_return_1_12h"
-            "c2_is_return_1_168h"
-            "c2_is_return_1_24h"
-            "c2_is_return_1_72h"
-            "c2_is_share_12h"
-            "c2_is_share_168h"
-            "c2_is_share_24h"
-            "c2_is_share_72h"
-            "c2_return_n_uv_12h"
-            "c2_return_n_uv_168h"
-            "c2_return_n_uv_24h"
-            "c2_return_n_uv_72h"
-            "c2_share_cnt_12h"
-            "c2_share_cnt_168h"
-            "c2_share_cnt_24h"
-            "c2_share_cnt_72h"
-            "c3_click_12h"
-            "c3_click_168h"
-            "c3_click_24h"
-            "c3_click_72h"
-            "c3_is_return_1_12h"
-            "c3_is_return_1_168h"
-            "c3_is_return_1_24h"
-            "c3_is_return_1_72h"
-            "c3_is_share_12h"
-            "c3_is_share_168h"
-            "c3_is_share_24h"
-            "c3_is_share_72h"
-            "c3_return_n_uv_12h"
-            "c3_return_n_uv_168h"
-            "c3_return_n_uv_24h"
-            "c3_return_n_uv_72h"
-            "c3_share_cnt_12h"
-            "c3_share_cnt_168h"
-            "c3_share_cnt_24h"
-            "c3_share_cnt_72h"
-            "c4_avg_ros_168h"
-            "c4_avg_ros_24h"
-            "c4_avg_ros_72h"
-            "c4_avg_ros_minus_168h"
-            "c4_avg_ros_minus_24h"
-            "c4_avg_ros_minus_72h"
-            "c4_avg_ros_one_168h"
-            "c4_avg_ros_one_24h"
-            "c4_avg_ros_one_72h"
-            "c4_avg_rovn_168h"
-            "c4_avg_rovn_24h"
-            "c4_avg_rovn_72h"
-            "c4_avg_str_one_168h"
-            "c4_avg_str_one_24h"
-            "c4_avg_str_one_72h"
-            "c4_diff_ros_168h"
-            "c4_diff_ros_24h"
-            "c4_diff_ros_72h"
-            "c4_diff_ros_minus_168h"
-            "c4_diff_ros_minus_24h"
-            "c4_diff_ros_minus_72h"
-            "c4_diff_ros_one_168h"
-            "c4_diff_ros_one_24h"
-            "c4_diff_ros_one_72h"
-            "c4_diff_rovn_168h"
-            "c4_diff_rovn_24h"
-            "c4_diff_rovn_72h"
-            "c4_diff_str_one_168h"
-            "c4_diff_str_one_24h"
-            "c4_diff_str_one_72h"
-            "c5_avgscore_tags_1d"
-            "c5_avgscore_tags_3d"
-            "c5_avgscore_tags_7d"
-            "c5_matchnum_tags_1d"
-            "c5_matchnum_tags_3d"
-            "c5_matchnum_tags_7d"
-            "c5_maxscore_tags_1d"
-            "c5_maxscore_tags_3d"
-            "c5_maxscore_tags_7d"
-            "c6_avgscore_tags_1d"
-            "c6_avgscore_tags_3d"
-            "c6_avgscore_tags_7d"
-            "c6_matchnum_tags_1d"
-            "c6_matchnum_tags_3d"
-            "c6_matchnum_tags_7d"
-            "c6_maxscore_tags_1d"
-            "c6_maxscore_tags_3d"
-            "c6_maxscore_tags_7d"
-            "d1_ros_cf_rank"
-            "d1_ros_cf_score"
-            "d1_rov_cf_rank"
-            "d1_rov_cf_score"
-            "d2_rank"
-            "d2_score"
-            "d3_exp"
-            "d3_return_n"
-            "d3_rovn"
-            "festive_sim"
-            "head_title_festive_sim"
-            "head_title_merge1_sim"
-            "head_title_merge2_sim"
-            "merge1_sim"
-            "merge2_sim"
-            "title_sim"
-            "day_of_week"
-            "hour"
-            "create_ts_diff"
-            "is_greeting"
-            "total_time"
-            "width"
-            "height"
-            "width/height"
-            "size"
-            "bit_rate"
-      ]
-    }
-  }
-}