浏览代码

Merge branch 'feature_20250529_zhaohaipeng_festive' of algorithm/recommend-server into master

zhaohaipeng 1 周之前
父节点
当前提交
0de21d27e6
共有 15 个文件被更改,包括 112 次插入14 次删除
  1. 4 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/model/Video.java
  2. 13 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/extractor/ExtractVideoMergeCate.java
  3. 59 8
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/processor/RankProcessorBoost.java
  4. 7 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelBasic.java
  5. 3 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV536.java
  6. 1 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV562.java
  7. 1 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV563.java
  8. 1 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV564.java
  9. 1 3
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV565.java
  10. 1 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV566.java
  11. 1 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV567.java
  12. 1 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV568.java
  13. 1 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV569.java
  14. 5 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/util/DateUtils.java
  15. 13 3
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/util/FestiveUtil.java

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

@@ -42,4 +42,8 @@ public class Video {
     // 原始特征
     public Map<String, Map<String, String>> metaFeatureMap = new HashMap<>();
 
+    /**
+     * 其他乱七八糟的参数,目前用来做降权的判断
+     */
+    private Map<String, String> otherParam = new HashMap<>();
 }

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

@@ -5,6 +5,7 @@ import com.tzld.piaoquan.recommend.server.service.FeatureService;
 import com.tzld.piaoquan.recommend.server.service.ServiceBeanFactory;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -41,4 +42,16 @@ public class ExtractVideoMergeCate {
         Map<String, String> basicInfoMap = vidFeature.get("alg_vid_feature_basic_info");
         return basicInfoMap.getOrDefault("merge_second_level_cate", "");
     }
+
+    public static void addOtherParam(List<Video> videos, Map<String, Map<String, Map<String, String>>> featureMap) {
+        for (Video video : videos) {
+            String videoId = String.valueOf(video.getVideoId());
+            if (!featureMap.containsKey(videoId)) {
+                continue;
+            }
+            Map<String, Map<String, String>> vidFeature = featureMap.get(videoId);
+            Map<String, String> otherParam = vidFeature.getOrDefault("alg_vid_feature_basic_info", new HashMap<>());
+            video.getOtherParam().putAll(otherParam);
+        }
+    }
 }

+ 59 - 8
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/processor/RankProcessorBoost.java

@@ -1,7 +1,9 @@
 package com.tzld.piaoquan.recommend.server.service.rank.processor;
 
 import com.tzld.piaoquan.recommend.server.model.Video;
+import com.tzld.piaoquan.recommend.server.service.rank.RankParam;
 import com.tzld.piaoquan.recommend.server.util.DateUtils;
+import com.tzld.piaoquan.recommend.server.util.FestiveUtil;
 import com.tzld.piaoquan.recommend.server.util.ProbabilityCalculator;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
@@ -9,11 +11,10 @@ import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.time.temporal.ChronoUnit;
+import java.util.*;
 
 /**
  * 提权处理器
@@ -60,7 +61,7 @@ public class RankProcessorBoost {
 
     public static void boostByMergeCate(List<Video> rovList, Map<String, List<Map<String, String>>> rulesMap) {
 
-        if (CollectionUtils.isEmpty(rovList) || MapUtils.isEmpty(rulesMap)){
+        if (CollectionUtils.isEmpty(rovList) || MapUtils.isEmpty(rulesMap)) {
             return;
         }
 
@@ -73,9 +74,8 @@ public class RankProcessorBoost {
             for (String mergeCate : video.getMergeCateList()) {
                 double reduceCoefficient = RankProcessorBoost.parseReduceCoefficient(mergeCate, rulesMap);
                 double originScore = video.getScore();
-
                 video.setScore(originScore * reduceCoefficient);
-
+                video.setSortScore(originScore * reduceCoefficient);
                 video.getScoresMap().put("reduceCoefficient", reduceCoefficient);
             }
 
@@ -85,6 +85,58 @@ public class RankProcessorBoost {
 
     }
 
+    public static void boostByFestive(RankParam param, List<Video> rovList, Map<String, String> rankReduceByFestiveConfig) {
+
+        String abCode = rankReduceByFestiveConfig.getOrDefault("abCode", "747");
+
+        if (CollectionUtils.isEmpty(param.getAbExpCodes()) || StringUtils.isEmpty(abCode) || !param.getAbExpCodes().contains(abCode)) {
+            return;
+        }
+
+        Set<String> festiveRootSessionIdTails = new HashSet<>(Arrays.asList(rankReduceByFestiveConfig.getOrDefault("festiveRootSessionIdTails", "0,1,2,3,4,a,b,c").split(",")));
+        String rootSessionId = param.getRootSessionId();
+        if (StringUtils.isBlank(rootSessionId) || CollectionUtils.isEmpty(festiveRootSessionIdTails)) {
+            return;
+        }
+        String tail = rootSessionId.substring(rootSessionId.length() - 1);
+        if (!festiveRootSessionIdTails.contains(tail)) {
+            return;
+        }
+
+
+        double reduceCoefficient = Double.parseDouble(rankReduceByFestiveConfig.getOrDefault("reduceCoefficient", "0.2"));
+        String format = "yyyy-MM-dd";
+        int nowHour = LocalDateTime.now().getHour();
+        LocalDate now = LocalDate.now();
+        for (Video video : rovList) {
+            String festiveName = video.getOtherParam().getOrDefault("fes_name", video.getOtherParam().getOrDefault("festive_label2", ""));
+            if (StringUtils.isBlank(festiveName)) {
+                continue;
+            }
+            List<String> festiveDateStrList = FestiveUtil.getDateByFestiveName(festiveName);
+            if (CollectionUtils.isEmpty(festiveDateStrList)) {
+                continue;
+            }
+
+
+            for (String festiveDateStr : festiveDateStrList) {
+                LocalDate festiveDate = DateUtils.convertStrToLocalDate(festiveDateStr, format);
+                // 计算今天与节日相差的天数,如果节日时间在今天之后,返回负数
+                long diffDay = ChronoUnit.DAYS.between(festiveDate, now);
+                boolean flag = (diffDay == 0 && nowHour >= 10) || (diffDay >= 1 && diffDay <= 2);
+                if (flag) {
+                    log.info("[FestiveVideoReduce] video: {}, festiveName: {}, festiveDate: {}, reduceCoefficient: {}", video.getVideoId(), festiveName, festiveDateStr, reduceCoefficient);
+                    double originScore = video.getScore();
+                    video.setScore(originScore * reduceCoefficient);
+                    video.setSortScore(originScore * reduceCoefficient);
+                    video.getScoresMap().put("festiveReduceCoefficient", reduceCoefficient);
+                    break;
+                }
+            }
+        }
+        rovList.sort((o1, o2) -> Double.compare(o2.getSortScore(), o1.getSortScore()));
+    }
+
     private static double parseReduceCoefficient(String mergeCate2, Map<String, List<Map<String, String>>> reduceConfigMap) {
         if (StringUtils.isBlank(mergeCate2) || MapUtils.isEmpty(reduceConfigMap)) {
             return 1d;
@@ -102,7 +154,6 @@ public class RankProcessorBoost {
         return 1d;
     }
 
-
     /**
      * 当前小时是否需要降权
      */

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

@@ -43,6 +43,9 @@ public abstract class RankStrategy4RegionMergeModelBasic extends RankService {
     @Value("${new.flow.pool.select.rate:1}")
     private double newFlowPoolSelectRate;
 
+    @ApolloJsonValue("${RankReduceByFestiveConfig:{}}")
+    private Map<String, String> rankReduceByFestiveConfig = new HashMap<>();
+
     String CLASS_NAME = this.getClass().getSimpleName();
 
     public void duplicate(Set<Long> setVideo, List<Video> videos) {
@@ -116,6 +119,10 @@ public abstract class RankStrategy4RegionMergeModelBasic extends RankService {
         // 6.品类降权
         RankProcessorBoost.boostByMergeCate(rovVideos, rankReduceRulesMap);
 
+        // 节日视频降权
+
+        RankProcessorBoost.boostByFestive(param, rovVideos, rankReduceByFestiveConfig);
+
         // 7 流量池按比例强插
         List<Video> result = new ArrayList<>();
         for (int i = 0; i < param.getTopK() && i < rovVideos.size(); i++) {

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

@@ -202,6 +202,9 @@ public class RankStrategy4RegionMergeModelV536 extends RankStrategy4RegionMergeM
             }
             result.add(video);
         }
+
+        ExtractVideoMergeCate.addOtherParam(result, videoBaseInfoMap);
+
         result.sort(Comparator.comparingDouble(o -> -o.getSortScore()));
         return result;
     }

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

@@ -225,6 +225,7 @@ public class RankStrategy4RegionMergeModelV562 extends RankStrategy4RegionMergeM
             }
             result.add(video);
         }
+        ExtractVideoMergeCate.addOtherParam(result, videoBaseInfoMap);
         result.sort(Comparator.comparingDouble(o -> -o.getSortScore()));
         return result;
     }

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

@@ -202,6 +202,7 @@ public class RankStrategy4RegionMergeModelV563 extends RankStrategy4RegionMergeM
             }
             result.add(video);
         }
+        ExtractVideoMergeCate.addOtherParam(result, videoBaseInfoMap);
         result.sort(Comparator.comparingDouble(o -> -o.getSortScore()));
         return result;
     }

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

@@ -165,6 +165,7 @@ public class RankStrategy4RegionMergeModelV564 extends RankStrategy4RegionMergeM
             }
             result.add(video);
         }
+        ExtractVideoMergeCate.addOtherParam(result, videoBaseInfoMap);
         result.sort(Comparator.comparingDouble(o -> -o.getSortScore()));
         return result;
     }

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

@@ -266,11 +266,9 @@ public class RankStrategy4RegionMergeModelV565 extends RankStrategy4RegionMergeM
                 video.getMetaFeatureMap().putAll(feature.getUserFeature());
             }
 
-            // 将空的特征表过滤
-            video.getMetaFeatureMap().entrySet().removeIf(e -> MapUtils.isEmpty(e.getValue()));
-
             result.add(video);
         }
+        ExtractVideoMergeCate.addOtherParam(result, videoBaseInfoMap);
         result.sort(Comparator.comparingDouble(o -> -o.getSortScore()));
 
         log.info("565 run time: {}", (System.currentTimeMillis() - startTime));

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

@@ -227,6 +227,7 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
             }
             result.add(video);
         }
+        ExtractVideoMergeCate.addOtherParam(result, videoBaseInfoMap);
         result.sort(Comparator.comparingDouble(o -> -o.getSortScore()));
         return result;
     }

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

@@ -202,6 +202,7 @@ public class RankStrategy4RegionMergeModelV567 extends RankStrategy4RegionMergeM
             }
             result.add(video);
         }
+        ExtractVideoMergeCate.addOtherParam(result, videoBaseInfoMap);
         result.sort(Comparator.comparingDouble(o -> -o.getSortScore()));
         return result;
     }

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

@@ -213,6 +213,7 @@ public class RankStrategy4RegionMergeModelV568 extends RankStrategy4RegionMergeM
             }
             result.add(video);
         }
+        ExtractVideoMergeCate.addOtherParam(result, videoBaseInfoMap);
         result.sort(Comparator.comparingDouble(o -> -o.getSortScore()));
         return result;
     }

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

@@ -271,6 +271,7 @@ public class RankStrategy4RegionMergeModelV569 extends RankStrategy4RegionMergeM
 
             result.add(video);
         }
+        ExtractVideoMergeCate.addOtherParam(result, videoBaseInfoMap);
         result.sort(Comparator.comparingDouble(o -> -o.getSortScore()));
 
         log.info("569 run time: {}", (System.currentTimeMillis() - startTime));

+ 5 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/util/DateUtils.java

@@ -1,6 +1,7 @@
 package com.tzld.piaoquan.recommend.server.util;
 
 import java.text.SimpleDateFormat;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Calendar;
@@ -53,6 +54,10 @@ public final class DateUtils {
         }
     }
 
+    public static LocalDate convertStrToLocalDate(String dateStr, String format) {
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format);
+        return LocalDate.parse(dateStr, dtf);
+    }
 
     public static void main(String[] args) {
         Calendar calendar = Calendar.getInstance();

+ 13 - 3
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/util/FestiveUtil.java

@@ -6,15 +6,15 @@ import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 
 @Slf4j
 public class FestiveUtil {
 
     private static Map<String, String> festiveMap = new HashMap<>();
 
+    private static Map<String, List<String>> festiveNameAndDateMap = new HashMap<>();
+
     public static void init() {
         long start = System.currentTimeMillis();
         InputStream resourceAsStream = FestiveUtil.class.getClassLoader().getResourceAsStream("festive.txt");
@@ -22,15 +22,21 @@ public class FestiveUtil {
         if (Objects.nonNull(resourceAsStream)) {
             try (BufferedReader reader = new BufferedReader(new InputStreamReader(resourceAsStream))) {
                 Map<String, String> tmpMap = new HashMap<>();
+                Map<String, List<String>> nameAndDateMap = new HashMap<>();
                 String line;
                 while ((line = reader.readLine()) != null) {
                     String[] split = line.split(",");
                     if (split.length >= 2) {
                         tmpMap.put(split[0], split[1]);
+
+                        List<String> dates = nameAndDateMap.computeIfAbsent(split[1], k -> new ArrayList<>());
+                        dates.add(split[0]);
+                        nameAndDateMap.put(split[1], dates);
                     }
                 }
 
                 FestiveUtil.festiveMap = tmpMap;
+                FestiveUtil.festiveNameAndDateMap = nameAndDateMap;
             } catch (IOException e) {
                 log.error("read festive.txt error: ", e);
             }
@@ -43,4 +49,8 @@ public class FestiveUtil {
     public static String getFestiveByDate(String date) {
         return festiveMap.get(date);
     }
+
+    public static List<String> getDateByFestiveName(String festiveName) {
+        return festiveNameAndDateMap.get(festiveName);
+    }
 }