瀏覽代碼

内容多样性-打散

jch 1 月之前
父節點
當前提交
0cd6e98dc7

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

@@ -3,6 +3,7 @@ package com.tzld.piaoquan.recommend.server.service.rank.strategy;
 import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
 import com.tzld.piaoquan.recommend.server.model.Video;
 import com.tzld.piaoquan.recommend.server.service.rank.RankParam;
+import com.tzld.piaoquan.recommend.server.util.MathUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.math3.util.Pair;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -19,19 +20,33 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
     @Autowired
     private RankStrategy4RegionMergeModelV563 modelV563Service;
 
+    @Autowired
+    private RankStrategy4RegionMergeModelV564 modelV564Service;
+
     @Override
     public List<Video> mergeAndRankRovRecall(RankParam param) {
         Map<String, Double> mergeWeight = this.mergeWeight != null ? this.mergeWeight : new HashMap<>(0);
 
-        List<Video> result = modelV563Service.mergeAndRankRovRecall(param);
+        List<Video> result;
+        String rosScoreKey;
+        int baseRankId = mergeWeight.getOrDefault("baseRankId", 563D).intValue();
+        if (564 == baseRankId) {
+            rosScoreKey = "NorXGBScore";
+            result = modelV564Service.mergeAndRankRovRecall(param);
+        } else {
+            rosScoreKey = "hasReturnRovScore";
+            result = modelV563Service.mergeAndRankRovRecall(param);
+        }
         if (null != result && !result.isEmpty()) {
             try {
                 Integer versionCode = param.getVersionCode();
                 int orderVersionCode = mergeWeight.getOrDefault("orderVersionCode", 1500D).intValue();
                 if (null != versionCode && versionCode == orderVersionCode) {
                     int keepTopN = mergeWeight.getOrDefault("keepTopN", 1D).intValue();
+                    boolean useRandFlag = mergeWeight.getOrDefault("useRandFlag", 0D).intValue() > 0;
                     boolean firstRovFlag = mergeWeight.getOrDefault("firstRovFlag", 1D).intValue() > 0;
-                    return resort(keepTopN, firstRovFlag, result);
+                    double rovRandRate = mergeWeight.getOrDefault("rovRandRate", 0.5);
+                    return resort(keepTopN, useRandFlag, firstRovFlag, rovRandRate, rosScoreKey, result);
                 }
             } catch (Exception e) {
                 log.error("diversity resort error", e);
@@ -40,7 +55,7 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
         return result;
     }
 
-    private List<Video> resort(int keepTopN, boolean firstRovFlag, List<Video> videos) {
+    private List<Video> resort(int keepTopN, boolean useRandFlag, boolean firstRovFlag, double rovRandRate, String rosScoreKey, List<Video> videos) {
         Map<Long, Video> videoMap = new HashMap<>();
         List<Pair<Long, Double>> rovList = new ArrayList<>();
         List<Pair<Long, Double>> rosList = new ArrayList<>();
@@ -50,7 +65,7 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
 
             Map<String, Double> scoreMap = video.getScoresMap();
             rovList.add(Pair.create(vid, scoreMap.getOrDefault("fmRov", 0d)));
-            rosList.add(Pair.create(vid, scoreMap.getOrDefault("hasReturnRovScore", 0d)));
+            rosList.add(Pair.create(vid, scoreMap.getOrDefault(rosScoreKey, 0d)));
         }
         rovList.sort(Comparator.comparingDouble(o -> -o.getSecond()));
         rosList.sort(Comparator.comparingDouble(o -> -o.getSecond()));
@@ -69,6 +84,9 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
         int rosIndex = 0;
         boolean flag = firstRovFlag;
         for (int i = keepTopN; i < videos.size(); i++) {
+            if (useRandFlag) {
+                flag = MathUtil.nextDouble(0, 1) < rovRandRate;
+            }
             if (flag) {
                 rovIndex = fillVideo(rovIndex, rovList, videoMap, hit, result);
             } else {