Explorar o código

多样性打散

jch hai 3 semanas
pai
achega
005a0dfaed

+ 13 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/FeatureService.java

@@ -387,6 +387,19 @@ public class FeatureService {
         return null;
     }
 
+    public Map<String, String> getUserInfo(String table, String id) {
+        try {
+            Feature feature = getFeatureByProto(Collections.singletonList(genWithMid(table, id)));
+            Map<String, Map<String, String>> userFeature = feature.getUserFeature();
+            if (null != userFeature) {
+                return userFeature.get(table);
+            }
+        } catch (Exception e) {
+            log.error("get user info error! value=[{}]", id, e);
+        }
+        return null;
+    }
+
     public Map<String, String> getHeadVideoInfo(String headVid) {
         try {
             if (null != headVid && !headVid.isEmpty()) {

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

@@ -2,6 +2,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.FeatureService;
 import com.tzld.piaoquan.recommend.server.service.rank.RankParam;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -21,6 +22,9 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
     @Autowired
     private RankStrategy4RegionMergeModelV563 modelV563Service;
 
+    @Autowired
+    private FeatureService featureService;
+
     @Override
     public List<Video> mergeAndRankRovRecall(RankParam param) {
         Map<String, Double> mergeWeight = this.mergeWeight != null ? this.mergeWeight : new HashMap<>(0);
@@ -31,10 +35,14 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
                 Integer versionCode = param.getVersionCode();
                 int orderVersionCode = mergeWeight.getOrDefault("orderVersionCode", 1500D).intValue();
                 if (null != versionCode && versionCode == orderVersionCode) {
-                    int keepTopN = mergeWeight.getOrDefault("keepTopN", 1D).intValue();
-                    int secondN = mergeWeight.getOrDefault("secondN", 4D).intValue();
-                    boolean secondFirstFlag = mergeWeight.getOrDefault("secondFirstFlag", 1D).intValue() > 0;
-                    return resort(keepTopN, secondN, secondFirstFlag, result);
+                    int minBid = mergeWeight.getOrDefault("minBid", 39D).intValue();
+                    int keepPageNum = mergeWeight.getOrDefault("keepPageNum", 1D).intValue();
+                    if (highlyActiveUser(param.getMid(), minBid)) {
+                        int group1Size = mergeWeight.getOrDefault("group1Size", 4D).intValue();
+                        int group2Size = mergeWeight.getOrDefault("group2Size", 8D).intValue();
+                        int group3Size = mergeWeight.getOrDefault("group3Size", 0D).intValue();
+                        return resort(group1Size, group2Size, group3Size, result);
+                    }
                 }
             } catch (Exception e) {
                 log.error("diversity resort error", e);
@@ -43,41 +51,65 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
         return result;
     }
 
-    private List<Video> resort(int keepTopN, int secondN, boolean secondFirstFlag, List<Video> videos) {
+    private List<Video> resort(int group1Size, int group2Size, int group3Size, List<Video> videos) {
         // split
-        List<Video> result = new ArrayList<>();
-        List<Video> list2nd = new ArrayList<>();
-        List<Video> list3rd = new ArrayList<>();
+        List<Video> group1 = new ArrayList<>();
+        List<Video> group2 = new ArrayList<>();
+        List<Video> group3 = new ArrayList<>();
+        List<Video> group4 = new ArrayList<>();
         for (int i = 0; i < videos.size(); i++) {
-            if (i < keepTopN) {
-                result.add(videos.get(i));
-            } else if (i < secondN) {
-                list2nd.add(videos.get(i));
+            if (i < group1Size) {
+                group1.add(videos.get(i));
+            } else if (i < group2Size) {
+                group2.add(videos.get(i));
+            } else if (i < group3Size) {
+                group3.add(videos.get(i));
             } else {
-                list3rd.add(videos.get(i));
+                group4.add(videos.get(i));
             }
         }
 
         // merge
-        if (secondFirstFlag) {
-            fillVideo(list2nd, list3rd, result);
-        } else {
-            fillVideo(list3rd, list2nd, result);
-        }
+        List<List<Video>> groupList = new ArrayList<>();
+        groupList.add(group1);
+        groupList.add(group2);
+        groupList.add(group3);
+        List<Video> result = fillVideo(groupList);
+        result.addAll(group4);
         return result;
     }
 
-    private void fillVideo(List<Video> list1, List<Video> list2, List<Video> result) {
-        int index = 0;
-        for (; index < list1.size() && index < list2.size(); index++) {
-            result.add(list1.get(index));
-            result.add(list2.get(index));
+    private List<Video> fillVideo(List<List<Video>> groupList) {
+        List<Video> result = new ArrayList<>();
+        int maxSize = getMaxSize(groupList);
+        for (int i = 0; i < maxSize; i++) {
+            for (List<Video> group : groupList) {
+                if (null != group && i < group.size()) {
+                    result.add(group.get(i));
+                }
+            }
         }
-        for (; index < list1.size(); index++) {
-            result.add(list1.get(index));
+        return result;
+    }
+
+    private int getMaxSize(List<List<Video>> groupList) {
+        int maxSize = 0;
+        if (null != groupList) {
+            for (List<Video> group : groupList) {
+                if (null != group) {
+                    maxSize = Math.max(maxSize, group.size());
+                }
+            }
         }
-        for (; index < list2.size(); index++) {
-            result.add(list2.get(index));
+        return maxSize;
+    }
+
+    private boolean highlyActiveUser(String mid, int minBid) {
+        Map<String, String> userInfo = featureService.getUserInfo("alg_recsys_feature_user_active_level", mid);
+        if (null != userInfo && userInfo.containsKey("bid")) {
+            int bid = Integer.parseInt(userInfo.get("bid"));
+            return bid >= minBid;
         }
+        return false;
     }
 }